moebooru: delegate to substrategy based on post source (#3911).

If the yande.re or konachan.com post has a source from a supported site,
for example Pixiv or Twitter, then delegate the artist and commentary
lookup to that substrategy.

Only do this for sources from recognized sites, not the null strategy.
This commit is contained in:
evazion
2018-10-06 14:27:34 -05:00
parent e5a4193dd4
commit c8d538f618
4 changed files with 17 additions and 23 deletions

View File

@@ -12,15 +12,12 @@ module Sources
Strategies::Nijie, Strategies::Nijie,
Strategies::Pawoo, Strategies::Pawoo,
Strategies::Moebooru, Strategies::Moebooru,
Strategies::Null # MUST BE LAST!
] ]
end end
def self.find(url, referer=nil) def self.find(url, referer=nil, default: Strategies::Null)
all strategy = all.detect { |strategy| strategy.match?(url, referer) } || default
.detect { |strategy| strategy.match?(url, referer) } strategy&.new(url, referer)
.new(url, referer)
end end
def self.canonical(url, referer) def self.canonical(url, referer)

View File

@@ -36,6 +36,8 @@ module Sources
URL_SLUG = %r!/(?:yande\.re%20|Konachan\.com%20-%20)(?<id>\d+).*!i URL_SLUG = %r!/(?:yande\.re%20|Konachan\.com%20-%20)(?<id>\d+).*!i
IMAGE_URL = %r!#{BASE_URL}/(?<type>image|jpeg|sample)/(?<md5>\h{32})#{URL_SLUG}?\.(?<ext>jpg|jpeg|png|gif)\z!i IMAGE_URL = %r!#{BASE_URL}/(?<type>image|jpeg|sample)/(?<md5>\h{32})#{URL_SLUG}?\.(?<ext>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) def self.match?(*urls)
urls.compact.any? { |x| x.match?(BASE_URL) } urls.compact.any? { |x| x.match?(BASE_URL) }
end end
@@ -73,14 +75,6 @@ module Sources
image_url image_url
end end
def profile_url
nil
end
def artist_name
nil
end
def tags def tags
api_response[:tags].to_s.split.map do |tag| api_response[:tags].to_s.split.map do |tag|
[tag.tr("_", " "), "https://#{site_name}/post?tags=#{CGI.escape(tag)}"] [tag.tr("_", " "), "https://#{site_name}/post?tags=#{CGI.escape(tag)}"]
@@ -109,6 +103,10 @@ module Sources
memoize :api_response memoize :api_response
concerning :HelperMethods do concerning :HelperMethods do
def sub_strategy
@sub_strategy ||= Sources::Strategies.find(api_response[:source], default: nil)
end
def file_host def file_host
case site_name case site_name
when "yande.re" then "files.yande.re" when "yande.re" then "files.yande.re"

View File

@@ -1,10 +1,6 @@
module Sources module Sources
module Strategies module Strategies
class Null < Base class Null < Base
def self.match?(*urls)
true
end
def image_urls def image_urls
[url] [url]
end end

View File

@@ -2,7 +2,7 @@ require "test_helper"
module Sources module Sources
class MoebooruTest < ActiveSupport::TestCase 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) site = Sources::Strategies.find(url)
assert_equal(site_name, site.site_name) assert_equal(site_name, site.site_name)
@@ -13,6 +13,7 @@ module Sources
assert_equal([preview_url], site.preview_urls) assert_equal([preview_url], site.preview_urls)
assert_equal(page_url, site.page_url) if page_url.present? assert_equal(page_url, site.page_url) if page_url.present?
assert_equal(tags.sort, site.tags.map(&:first).sort) 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_equal(size, site.size)
assert_nothing_raised { site.to_h } assert_nothing_raised { site.to_h }
end end
@@ -35,7 +36,8 @@ module Sources
@page = "https://yande.re/post/show/482880" @page = "https://yande.re/post/show/482880"
@tags = ["bayashiko", "journey to the west", "sun wukong"] @tags = ["bayashiko", "journey to the west", "sun wukong"]
@size = 362_554 @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(@samp, @data)
assert_source_data_equals(@full, @data) assert_source_data_equals(@full, @data)
@@ -52,7 +54,7 @@ module Sources
@page = "https://yande.re/post/show/398018" @page = "https://yande.re/post/show/398018"
@tags = ["misaki kurehito", "saenai heroine no sodatekata", "sawamura spencer eriri", "detexted", "thighhighs"] @tags = ["misaki kurehito", "saenai heroine no sodatekata", "sawamura spencer eriri", "detexted", "thighhighs"]
@size = 9_118_998 @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(@samp, @data)
assert_source_data_equals(@jpeg, @data) assert_source_data_equals(@jpeg, @data)
@@ -69,7 +71,7 @@ module Sources
@full = "https://files.yande.re/image/fb27a7ea6c48b2ef76fe915e378b9098.png" @full = "https://files.yande.re/image/fb27a7ea6c48b2ef76fe915e378b9098.png"
@tags = [] @tags = []
@size = 9_118_998 @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(@samp, @data)
assert_source_data_equals(@jpeg, @data) assert_source_data_equals(@jpeg, @data)
@@ -92,8 +94,9 @@ module Sources
girls_frontline hara_shoutarou hoodie long_hair pantyhose scar skirt girls_frontline hara_shoutarou hoodie long_hair pantyhose scar skirt
twintails ump-45_(girls_frontline) ump-9_(girls_frontline) twintails ump-45_(girls_frontline) ump-9_(girls_frontline)
].map { |tag| tag.tr("_", " ") } ].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(@samp, @data)
assert_source_data_equals(@jpeg, @data) assert_source_data_equals(@jpeg, @data)
assert_source_data_equals(@full, @data) assert_source_data_equals(@full, @data)