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