diff --git a/app/logical/downloads/rewrite_strategies/deviant_art.rb b/app/logical/downloads/rewrite_strategies/deviant_art.rb index cac22b692..fccb54b83 100644 --- a/app/logical/downloads/rewrite_strategies/deviant_art.rb +++ b/app/logical/downloads/rewrite_strategies/deviant_art.rb @@ -1,10 +1,18 @@ module Downloads module RewriteStrategies class DeviantArt < Base + attr_accessor :url, :source + + def initialize(url) + @url = url + end + def rewrite(url, headers, data = {}) if url =~ /https?:\/\/(?:.+?\.)?deviantart\.(?:com|net)/ url, headers = rewrite_html_pages(url, headers) url, headers = rewrite_thumbnails(url, headers) + data[:artist_commentary_title] = source.artist_commentary_title + data[:artist_commentary_desc] = source.artist_commentary_desc end return [url, headers, data] @@ -13,8 +21,6 @@ module Downloads protected def rewrite_html_pages(url, headers) if url =~ %r{^https?://.+?\.deviantart\.com/art/} - source = ::Sources::Strategies::DeviantArt.new(url) - source.get return [source.image_url, headers] else return [url, headers] @@ -29,13 +35,21 @@ module Downloads match = $1 url.sub!(match + "PRE/", match) elsif url =~ %r{^https?://(?:pre|img)\d{2}\.deviantart\.net/} - source = ::Sources::Strategies::DeviantArt.new(url) - source.get return [source.image_url, headers] end return [url, headers] end + + # Cache the source data so it gets fetched at most once. + def source + @source ||= begin + source = ::Sources::Strategies::DeviantArt.new(url) + source.get + + source + end + end end end end diff --git a/app/logical/sources/strategies/deviant_art.rb b/app/logical/sources/strategies/deviant_art.rb index 4d2143a02..9a322db21 100644 --- a/app/logical/sources/strategies/deviant_art.rb +++ b/app/logical/sources/strategies/deviant_art.rb @@ -27,6 +27,8 @@ module Sources @artist_name, @profile_url = get_profile_from_page(page) @image_url = get_image_url_from_page(page) @tags = get_tags_from_page(page) + @artist_commentary_title = get_artist_commentary_title_from_page(page) + @artist_commentary_desc = get_artist_commentary_desc_from_page(page) end end @@ -70,6 +72,24 @@ module Sources end end + def get_artist_commentary_title_from_page(page) + title = page.search("div.dev-title-container a").find_all do |node| + node["data-ga_click_event"] =~ /description_title/ + end + + if title.any? + title[0].inner_text + end + end + + def get_artist_commentary_desc_from_page(page) + desc = page.search("div.dev-description div.text.block") + + if desc.any? + desc[0].inner_text + end + end + def normalized_url @normalized_url ||= begin if url =~ %r{\Ahttps?://(?:fc|th|pre|orig|img)\d{2}\.deviantart\.net/.+/[a-z0-9_]*_by_[a-z0-9_]+-d([a-z0-9]+)\.}i