sources: refactor normalize_for_source.
`normalize_for_source` was used to convert image URLs to page URLs when displaying sources on the post show page. Move all the code for converting image URLs to page URLs from `Sources::Strategies#normalize_for_source` to `Source::URL#page_url`. Before we had to be very careful in source strategies not to make any network calls in `normalize_for_source`, since it was used in the view for the post show page. Now all the code for generating page URLs is isolated in Source::URL, which makes source strategies simpler. It also makes it easier to check if a source is an image URL or page URL, and if the image URL is convertible to a page URL, which will make autotagging bad_link or bad_source feasible. Finally, this fixes it to generate better page URLs in a handful of cases: * https://www.artstation.com/artwork/qPVGP instead of https://anubis1982918.artstation.com/projects/qPVGP * https://yande.re/post/show?md5=b4b1d11facd1700544554e4805d47bb6s instead of https://yande.re/post?tags=md5:b4b1d11facd1700544554e4805d47bb6 * http://gallery.minitokyo.net/view/365677 instead of http://gallery.minitokyo.net/download/365677 * https://valkyriecrusade.fandom.com/wiki/File:Crimson_Hatsune_H.png instead of https://valkyriecrusade.wikia.com/wiki/File:Crimson_Hatsune_H.png * https://rule34.paheal.net/post/view/852405 instead of https://rule34.paheal.net/post/list/md5:854806addcd3b1246424e7cea49afe31/1
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
# url = Source::URL.parse("https://twitter.com/yasunavert/status/1496123903290314755")
|
||||
# url.site_name # => "Twitter"
|
||||
# url.status_id # => "1496123903290314755"
|
||||
# url.twitter_username # => "yasunavert"
|
||||
# url.username # => "yasunavert"
|
||||
#
|
||||
# @see Danbooru::URL
|
||||
module Source
|
||||
@@ -53,7 +53,7 @@ module Source
|
||||
# @return [Source::URL]
|
||||
def self.parse!(url)
|
||||
url = Danbooru::URL.new(url)
|
||||
subclass = SUBCLASSES.find { |c| c.match?(url) } || Source::URL
|
||||
subclass = SUBCLASSES.find { |c| c.match?(url) } || Source::URL::Null
|
||||
subclass.new(url)
|
||||
end
|
||||
|
||||
@@ -78,39 +78,30 @@ module Source
|
||||
#
|
||||
# @return [String]
|
||||
def site_name
|
||||
# XXX should go in dedicated subclasses.
|
||||
case host
|
||||
when /ask\.fm\z/i
|
||||
"Ask.fm"
|
||||
when /bcy\.net\z/i
|
||||
"BCY"
|
||||
when /booth\.pm\z/i
|
||||
"Booth.pm"
|
||||
when /circle\.ms\z/i
|
||||
"Circle.ms"
|
||||
when /dlsite\.(com|net)\z/i
|
||||
"DLSite"
|
||||
when /doujinshi\.mugimugi\.org\z/i
|
||||
"Doujinshi.org"
|
||||
when /fc2\.com\z/i
|
||||
"FC2"
|
||||
when /ko-fi\.com\z/i
|
||||
"Ko-fi"
|
||||
when /mixi\.jp\z/i
|
||||
"Mixi.jp"
|
||||
when /piapro\.jp\z/i
|
||||
"Piapro.jp"
|
||||
when /sakura\.ne\.jp\z/i
|
||||
"Sakura.ne.jp"
|
||||
else
|
||||
if self.class == Source::URL
|
||||
# "www.melonbooks.co.jp" => "Melonbooks"
|
||||
parsed_domain.sld.titleize
|
||||
else
|
||||
# "Source::URL::NicoSeiga" => "Nico Seiga"
|
||||
self.class.name.demodulize.titleize
|
||||
end
|
||||
end
|
||||
# "Source::URL::NicoSeiga" => "Nico Seiga"
|
||||
self.class.name.demodulize.titleize
|
||||
end
|
||||
|
||||
# Convert an image URL to the URL of the page containing the image, or
|
||||
# return nil if it's not possible to convert the current URL to a page URL.
|
||||
#
|
||||
# When viewing a post, the source will be shown as the page URL if it's
|
||||
# possible to convert the source from an image URL to a page URL.
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
# * https://i.pximg.net/img-original/img/2014/10/03/18/10/20/46324488_p0.png
|
||||
# => https://www.pixiv.net/artworks/46324488
|
||||
#
|
||||
# * https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/intermediary/f/8b472d70-a0d6-41b5-9a66-c35687090acc/d23jbr4-8a06af02-70cb-46da-8a96-42a6ba73cdb4.jpg/v1/fill/w_786,h_1017,q_70,strp/silverhawks_quicksilver_by_edsfox_d23jbr4-pre.jpg
|
||||
# => https://www.deviantart.com/edsfox/art/Silverhawks-Quicksilver-126872896
|
||||
#
|
||||
# * https://pbs.twimg.com/media/EBGbJe_U8AA4Ekb.jpg:orig
|
||||
# => nil
|
||||
#
|
||||
# @return [String, nil]
|
||||
def page_url
|
||||
nil
|
||||
end
|
||||
|
||||
# Convert the current URL into a profile URL, or return nil if it's not
|
||||
@@ -134,6 +125,14 @@ module Source
|
||||
nil
|
||||
end
|
||||
|
||||
def self.page_url(url)
|
||||
Source::URL.parse(url)&.page_url
|
||||
end
|
||||
|
||||
def self.profile_url(url)
|
||||
Source::URL.parse(url)&.profile_url
|
||||
end
|
||||
|
||||
protected def initialize(...)
|
||||
super(...)
|
||||
parse
|
||||
|
||||
Reference in New Issue
Block a user