`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
107 lines
4.3 KiB
Ruby
107 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Unhandled:
|
|
#
|
|
# https://fantia.jp/commissions/64988
|
|
# https://fantia.jp/profiles/tus_2n9n0fm05fizg
|
|
|
|
class Source::URL::Fantia < Source::URL
|
|
attr_reader :full_image_url, :fanclub_id, :username, :post_id, :product_id
|
|
|
|
def self.match?(url)
|
|
url.domain == "fantia.jp"
|
|
end
|
|
|
|
def parse
|
|
case [host, *path_segments]
|
|
|
|
# posts:
|
|
# https://c.fantia.jp/uploads/post/file/1070093/main_16faf0b1-58d8-4aac-9e86-b243063eaaf1.jpeg (sample)
|
|
# https://c.fantia.jp/uploads/post/file/1070093/16faf0b1-58d8-4aac-9e86-b243063eaaf1.jpeg
|
|
# https://cc.fantia.jp/uploads/post_content_photo/file/4563389/main_a9763427-3ccd-4e51-bcde-ff5e1ce0aa56.jpg?Key-Pair-Id=APKAIOCKYZS7WKBB6G7A&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYy5mYW50aWEuanAvdXBsb2Fkcy9wb3N0X2NvbnRlbnRfcGhvdG8vZmlsZS80NTYzMzg5L21haW5fYTk3NjM0MjctM2NjZC00ZTUxLWJjZGUtZmY1ZTFjZTBhYTU2LmpwZyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTY0NjkxMzk3OH19fV19&Signature=jyW5ankfO9uCHlKkozYU9RPpO3jzKTW2HuyXgS81i~cRgrXcI9orYU0IXuiit~0TznIyXbB7F~6Z790t7lX948PYAb9luYIREJC2u7pRMP3OBbsANbbFE0o4VR-6O3ZKbYQ4aG~ofVEZfiFVGoKoVtdJxj0bBNQV29eeFylGQATkFmywne1YMtJMqDirRBFMIatqNuunGsiWCQHqLYNHCeS4dZXlOnV8JQq0u1rPkeAQBmDCStFMA5ywjnWTfSZK7RN6RXKCAsMTXTl5X~I6EZASUPoGQy2vHUj5I-veffACg46jpvqTv6mLjQEw8JG~JLIOrZazKZR9O2kIoLNVGQ__
|
|
# from file download: https://cc.fantia.jp/uploads/post_content/file/1830956/cbcdfcbe_20220224_120_040_100.png?Key-Pair-Id=APKAIOCKYZS7WKBB6G7A&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9jYy5mYW50aWEuanAvdXBsb2Fkcy9wb3N0X2NvbnRlbnQvZmlsZS8xODMwOTU2L2NiY2RmY2JlXzIwMjIwMjI0XzEyMF8wNDBfMTAwLnBuZyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTY0NjkxNDU4Nn19fV19&Signature=d1nw8gs9vcshIAeEH4oESm9-7z6y4A7MfoIRRvtUtV9iqTNA8KM0ORuCI7NwEoYc1VHsxy9ByeuSBpNaJoknnc3TOmHFhVRcLn~OWpnWqiHEPpMcSEG7uGlorysjEPmYYRGHjE7LJYcWiiJxjZ~fSBbYzxxwsjroPm-fyGUtNhdJWEMNp52vHe5P9KErb7M8tP01toekGdOqO-pkWm1t9xm2Tp5P7RWcbtQPOixgG4UgOhE0f3LVwHGHYJV~-lB5RjrDbTTO3ezVi7I7ybZjjHotVUK5MbHHmXzC1NqI-VN3vHddTwTbTK9xEnPMR27NHSlho3-O18WcNs1YgKD48w__
|
|
#
|
|
# products:
|
|
# https://c.fantia.jp/uploads/product/image/249638/main_fd5aef8f-c217-49d0-83e8-289efb33dfc4.jpg
|
|
# https://c.fantia.jp/uploads/product_image/file/219407/main_bd7419c2-2450-4c53-a28a-90101fa466ab.jpg (sample)
|
|
# https://c.fantia.jp/uploads/product_image/file/219407/bd7419c2-2450-4c53-a28a-90101fa466ab.jpg
|
|
in _, "uploads", image_type, ("file" | "image"), image_id, /(?:\w+_)?([\w-]+\.\w+)/ => file
|
|
# post_id/product_id == image_id only for the first image in a post/product
|
|
case image_type
|
|
when "post"
|
|
@post_id = image_id
|
|
@full_image_url = "https://c.fantia.jp/uploads/post/file/#{@post_id}/#{$1}"
|
|
when "product"
|
|
@product_id = image_id
|
|
@full_image_url = "https://c.fantia.jp/uploads/product/image/#{@product_id}/#{$1}"
|
|
when "product_image"
|
|
@full_image_url = "https://c.fantia.jp/uploads/product_image/file/#{image_id}/#{$1}"
|
|
else
|
|
@full_image_url = original_url
|
|
end
|
|
|
|
# https://fantia.jp/posts/1143951/download/1830956
|
|
in _, "posts", post_id, "download", image_id
|
|
@post_id = post_id
|
|
@download_id = image_id
|
|
|
|
# https://fantia.jp/posts/1148334
|
|
in _, "posts", /\d+/ => post_id
|
|
@post_id = post_id
|
|
|
|
# https://fantia.jp/products/249638
|
|
in _, "products", /\d+/ => product_id
|
|
@product_id = product_id
|
|
|
|
# https://fantia.jp/fanclubs/64496
|
|
# https://fantia.jp/fanclubs/1654/posts
|
|
# https://job.fantia.jp/fanclubs/5734
|
|
in _, "fanclubs", /\d+/ => fanclub_id, *rest
|
|
@fanclub_id = fanclub_id
|
|
|
|
# https://fantia.jp/asanagi
|
|
# https://fantia.jp/koruri
|
|
in _, username
|
|
@username = username
|
|
|
|
else
|
|
end
|
|
end
|
|
|
|
def image_url?
|
|
@full_image_url.present?
|
|
end
|
|
|
|
def downloadable?
|
|
@download_id.present?
|
|
end
|
|
|
|
def page_url
|
|
if @post_id.present?
|
|
"https://fantia.jp/posts/#{@post_id}"
|
|
elsif @product_id.present?
|
|
"https://fantia.jp/products/#{@product_id}"
|
|
end
|
|
end
|
|
|
|
def profile_url
|
|
if fanclub_id.present?
|
|
"https://fantia.jp/fanclubs/#{fanclub_id}"
|
|
elsif username.present?
|
|
"https://fantia.jp/#{username}"
|
|
end
|
|
end
|
|
|
|
def work_id
|
|
@post_id || @product_id
|
|
end
|
|
|
|
def work_type
|
|
if @post_id.present?
|
|
"post"
|
|
elsif @product_id.present?
|
|
"product"
|
|
end
|
|
end
|
|
end
|