diff --git a/app/logical/sources/strategies.rb b/app/logical/sources/strategies.rb index 709b42915..97a10b6bc 100644 --- a/app/logical/sources/strategies.rb +++ b/app/logical/sources/strategies.rb @@ -12,15 +12,12 @@ module Sources Strategies::Nijie, Strategies::Pawoo, Strategies::Moebooru, - - Strategies::Null # MUST BE LAST! ] end - def self.find(url, referer=nil) - all - .detect { |strategy| strategy.match?(url, referer) } - .new(url, referer) + def self.find(url, referer=nil, default: Strategies::Null) + strategy = all.detect { |strategy| strategy.match?(url, referer) } || default + strategy&.new(url, referer) end def self.canonical(url, referer) diff --git a/app/logical/sources/strategies/moebooru.rb b/app/logical/sources/strategies/moebooru.rb index 342b28af2..149a1e1d1 100644 --- a/app/logical/sources/strategies/moebooru.rb +++ b/app/logical/sources/strategies/moebooru.rb @@ -36,6 +36,8 @@ module Sources URL_SLUG = %r!/(?:yande\.re%20|Konachan\.com%20-%20)(?\d+).*!i IMAGE_URL = %r!#{BASE_URL}/(?image|jpeg|sample)/(?\h{32})#{URL_SLUG}?\.(?jpg|jpeg|png|gif)\z!i + delegate :artist_name, :profile_url, :unique_id, :artist_commentary_title, :artist_commentary_desc, :dtext_artist_commentary_title, :dtext_artist_commentary_desc, to: :sub_strategy, allow_nil: true + def self.match?(*urls) urls.compact.any? { |x| x.match?(BASE_URL) } end @@ -73,14 +75,6 @@ module Sources image_url end - def profile_url - nil - end - - def artist_name - nil - end - def tags api_response[:tags].to_s.split.map do |tag| [tag.tr("_", " "), "https://#{site_name}/post?tags=#{CGI.escape(tag)}"] @@ -109,6 +103,10 @@ module Sources memoize :api_response concerning :HelperMethods do + def sub_strategy + @sub_strategy ||= Sources::Strategies.find(api_response[:source], default: nil) + end + def file_host case site_name when "yande.re" then "files.yande.re" diff --git a/app/logical/sources/strategies/null.rb b/app/logical/sources/strategies/null.rb index 2e3116771..23cc860ad 100644 --- a/app/logical/sources/strategies/null.rb +++ b/app/logical/sources/strategies/null.rb @@ -1,10 +1,6 @@ module Sources module Strategies class Null < Base - def self.match?(*urls) - true - end - def image_urls [url] end diff --git a/test/unit/sources/moebooru_test.rb b/test/unit/sources/moebooru_test.rb index 4675da67c..d42cff72c 100644 --- a/test/unit/sources/moebooru_test.rb +++ b/test/unit/sources/moebooru_test.rb @@ -2,7 +2,7 @@ require "test_helper" module Sources class MoebooruTest < ActiveSupport::TestCase - def assert_source_data_equals(url, referer = nil, site_name: nil, image_url: nil, page_url: nil, preview_url: nil, size: nil, tags: []) + def assert_source_data_equals(url, referer = nil, site_name: nil, image_url: nil, page_url: nil, preview_url: nil, size: nil, tags: [], profile_url: nil) site = Sources::Strategies.find(url) assert_equal(site_name, site.site_name) @@ -13,6 +13,7 @@ module Sources assert_equal([preview_url], site.preview_urls) assert_equal(page_url, site.page_url) if page_url.present? assert_equal(tags.sort, site.tags.map(&:first).sort) + assert_equal(profile_url.to_s, site.profile_url.to_s) assert_equal(size, site.size) assert_nothing_raised { site.to_h } end @@ -35,7 +36,8 @@ module Sources @page = "https://yande.re/post/show/482880" @tags = ["bayashiko", "journey to the west", "sun wukong"] @size = 362_554 - @data = { site_name: "yande.re", preview_url: @prev, image_url: @full, page_url: @page, size: @size, tags: @tags} + @profile_url = "https://twitter.com/apononori" + @data = { site_name: "yande.re", preview_url: @prev, image_url: @full, page_url: @page, size: @size, tags: @tags, profile_url: @profile_url } assert_source_data_equals(@samp, @data) assert_source_data_equals(@full, @data) @@ -52,7 +54,7 @@ module Sources @page = "https://yande.re/post/show/398018" @tags = ["misaki kurehito", "saenai heroine no sodatekata", "sawamura spencer eriri", "detexted", "thighhighs"] @size = 9_118_998 - @data = { site_name: "yande.re", preview_url: @prev, image_url: @full, page_url: @page, size: @size, tags: @tags} + @data = { site_name: "yande.re", preview_url: @prev, image_url: @full, page_url: @page, size: @size, tags: @tags, profile_url: nil } assert_source_data_equals(@samp, @data) assert_source_data_equals(@jpeg, @data) @@ -69,7 +71,7 @@ module Sources @full = "https://files.yande.re/image/fb27a7ea6c48b2ef76fe915e378b9098.png" @tags = [] @size = 9_118_998 - @data = { site_name: "yande.re", preview_url: @prev, image_url: @full, page_url: @page, size: @size, tags: @tags} + @data = { site_name: "yande.re", preview_url: @prev, image_url: @full, page_url: @page, size: @size, tags: @tags, profile_url: nil } assert_source_data_equals(@samp, @data) assert_source_data_equals(@jpeg, @data) @@ -92,8 +94,9 @@ module Sources girls_frontline hara_shoutarou hoodie long_hair pantyhose scar skirt twintails ump-45_(girls_frontline) ump-9_(girls_frontline) ].map { |tag| tag.tr("_", " ") } + @profile_url = "https://www.pixiv.net/member.php?id=22528152" - @data = { site_name: "konachan.com", preview_url: @prev, image_url: @full, page_url: @page, size: @size, tags: @tags} + @data = { site_name: "konachan.com", preview_url: @prev, image_url: @full, page_url: @page, size: @size, tags: @tags, profile_url: @profile_url } assert_source_data_equals(@samp, @data) assert_source_data_equals(@jpeg, @data) assert_source_data_equals(@full, @data)