Fix #5354: Add bookmarklet support for picdig.net.
This commit is contained in:
83
app/logical/source/extractor/picdig.rb
Normal file
83
app/logical/source/extractor/picdig.rb
Normal file
@@ -0,0 +1,83 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# @see https://picdig.net/
|
||||
# @see Source::URL::Picdig
|
||||
module Source
|
||||
class Extractor
|
||||
class Picdig < Source::Extractor
|
||||
def match?
|
||||
Source::URL::Picdig === parsed_url
|
||||
end
|
||||
|
||||
def image_urls
|
||||
if parsed_url.image_url?
|
||||
[parsed_url.to_s]
|
||||
else
|
||||
image_urls_from_commentary
|
||||
end
|
||||
end
|
||||
|
||||
def image_urls_from_commentary
|
||||
html = Nokogiri::HTML5.fragment(artist_commentary_desc)
|
||||
html.css("img").map { |img| img[:src] }
|
||||
end
|
||||
|
||||
def page_url
|
||||
parsed_url.page_url || parsed_referer&.page_url
|
||||
end
|
||||
|
||||
def profile_url
|
||||
parsed_url.profile_url || parsed_referer&.profile_url
|
||||
end
|
||||
|
||||
def profile_urls
|
||||
[
|
||||
api_response.dig(:user, :homepage_url),
|
||||
api_response.dig(:user, :twitter_url),
|
||||
api_response.dig(:user, :instagram_url),
|
||||
api_response.dig(:user, :facebook_url),
|
||||
api_response.dig(:user, :youtube_url),
|
||||
].compact_blank
|
||||
end
|
||||
|
||||
def tag_name
|
||||
username
|
||||
end
|
||||
|
||||
def artist_name
|
||||
api_response.dig(:user, :name)
|
||||
end
|
||||
|
||||
def artist_commentary_title
|
||||
api_response[:title]
|
||||
end
|
||||
|
||||
def artist_commentary_desc
|
||||
api_response[:content]
|
||||
end
|
||||
|
||||
def tags
|
||||
api_response[:project_tags].to_a.map do |tag|
|
||||
[tag[:name], "https://picdig.net/projects?search_tag=#{Danbooru::URL.escape(tag[:name])}"]
|
||||
end
|
||||
end
|
||||
|
||||
def username
|
||||
parsed_url.username || parsed_referer&.username
|
||||
end
|
||||
|
||||
def api_url
|
||||
parsed_url.api_page_url || parsed_referer&.api_page_url
|
||||
end
|
||||
|
||||
memoize def api_response
|
||||
return {} if api_url.blank?
|
||||
|
||||
response = http.cache(1.minute).get(api_url)
|
||||
return {} unless response.status == 200
|
||||
|
||||
response.parse.with_indifferent_access.dig(:data, :project)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user