105 lines
2.6 KiB
Ruby
105 lines
2.6 KiB
Ruby
module Sources
|
|
module Strategies
|
|
class Pixiv < Base
|
|
def self.url_match?(url)
|
|
url =~ /^https?:\/\/(?:\w+\.)?pixiv\.net/
|
|
end
|
|
|
|
def referer_url(template)
|
|
if template.params[:ref] =~ /pixiv\.net\/member_illust/ && template.params[:ref] !~ /mode=manga/
|
|
template.params[:ref]
|
|
else
|
|
template.params[:url]
|
|
end
|
|
end
|
|
|
|
def site_name
|
|
"Pixiv"
|
|
end
|
|
|
|
def unique_id
|
|
image_url =~ /\/img\/([^\/]+)/
|
|
$1
|
|
end
|
|
|
|
def get
|
|
agent.get(URI.parse(normalized_url).request_uri) do |page|
|
|
@artist_name, @profile_url = get_profile_from_page(page)
|
|
@image_url = get_image_url_from_page(page)
|
|
@tags = get_tags_from_page(page)
|
|
end
|
|
end
|
|
|
|
protected
|
|
|
|
def get_profile_from_page(page)
|
|
profile_url = page.search("a.user-link").first
|
|
if profile_url
|
|
profile_url = "http://www.pixiv.net" + profile_url["href"]
|
|
end
|
|
|
|
artist_name = page.search("h1.user").first
|
|
if artist_name
|
|
artist_name = artist_name.inner_text
|
|
end
|
|
|
|
return [artist_name, profile_url]
|
|
end
|
|
|
|
def get_image_url_from_page(page)
|
|
element = page.search("div.works_display a img").first
|
|
if element
|
|
element.attr("src").sub(/_[ms]\./, ".")
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def get_tags_from_page(page)
|
|
# puts page.root.to_xhtml
|
|
|
|
links = page.search("ul.tags a.text").find_all do |node|
|
|
node["href"] =~ /search\.php/
|
|
end
|
|
|
|
if links.any?
|
|
links.map do |node|
|
|
[node.inner_text, "http://www.pixiv.net" + node.attr("href")]
|
|
end
|
|
else
|
|
[]
|
|
end
|
|
end
|
|
|
|
def normalized_url
|
|
@normalized_url ||= begin
|
|
if url =~ /\/(\d+)(?:_big)?(?:_m|_p\d+)?\.(?:jpg|jpeg|png|gif)/i
|
|
"http://www.pixiv.net/member_illust.php?mode=medium&illust_id=#{$1}"
|
|
elsif url =~ /mode=big/
|
|
url.sub(/mode=big/, "mode=medium")
|
|
elsif url =~ /member_illust\.php/ && url =~ /illust_id=/
|
|
url
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
end
|
|
|
|
def agent
|
|
@agent ||= begin
|
|
mech = Mechanize.new
|
|
|
|
mech.get("http://www.pixiv.net") do |page|
|
|
page.form_with(:action => "/login.php") do |form|
|
|
form['pixiv_id'] = Danbooru.config.pixiv_login
|
|
form['pass'] = Danbooru.config.pixiv_password
|
|
end.click_button
|
|
end
|
|
|
|
mech
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|