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:
@@ -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)
|
||||
|
||||
@@ -36,6 +36,8 @@ module Sources
|
||||
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
|
||||
|
||||
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"
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
module Sources
|
||||
module Strategies
|
||||
class Null < Base
|
||||
def self.match?(*urls)
|
||||
true
|
||||
end
|
||||
|
||||
def image_urls
|
||||
[url]
|
||||
end
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user