74 lines
2.3 KiB
Ruby
74 lines
2.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Source::Extractor
|
|
class Furaffinity < Source::Extractor
|
|
def self.enabled?
|
|
# https://www.furaffinity.net/controls/settings/
|
|
# For this strategy to work properly, in the above settings "Enable Adult Artwork" must be set to "General, Mature, Adult".
|
|
Danbooru.config.furaffinity_cookie_a.present? && Danbooru.config.furaffinity_cookie_b.present?
|
|
end
|
|
|
|
def match?
|
|
Source::URL::Furaffinity === parsed_url
|
|
end
|
|
|
|
def image_urls
|
|
if parsed_url.image_url?
|
|
[parsed_url.to_s]
|
|
else
|
|
download_button = html_response&.css(".submission-content .auto_link .button").to_a.find { |el| el.text == "Download" }
|
|
partial_image = download_button&.[]("href")
|
|
return [] unless partial_image.present?
|
|
[Addressable::URI.join("https://d.furaffinity.net", partial_image).to_s].compact
|
|
end
|
|
end
|
|
|
|
def page_url
|
|
parsed_url.page_url || parsed_referer&.page_url
|
|
end
|
|
|
|
def tags
|
|
tags = html_response&.css(".tags").to_a.map!(&:text).compact.uniq
|
|
tags.map {|tag| [tag, "https://www.furaffinity.net/search/@keywords #{tag}"] }
|
|
end
|
|
|
|
def artist_name
|
|
html_response&.at(".submission-id-sub-container a")&.text || parsed_url.username || parsed_referer&.username
|
|
end
|
|
|
|
def profile_url
|
|
parsed_url.profile_url || parsed_referer&.profile_url || profile_url_from_page
|
|
end
|
|
|
|
def profile_url_from_page
|
|
slug = html_response&.at(".submission-id-avatar a")&.[](:href)
|
|
return unless slug.present?
|
|
Source::URL.parse(URI.join("https://www.furaffinity.net/", slug)).profile_url
|
|
end
|
|
|
|
def artist_commentary_title
|
|
html_response&.at(".submission-title")&.text&.strip
|
|
end
|
|
|
|
def artist_commentary_desc
|
|
html_response&.at(".submission-content .section-body")&.to_html
|
|
end
|
|
|
|
def dtext_artist_commentary_desc
|
|
DText.from_html(artist_commentary_desc)&.strip
|
|
end
|
|
|
|
def html_response
|
|
return nil unless page_url.present?
|
|
response = http.cache(1.minute).get(page_url)
|
|
|
|
return nil unless response.status == 200
|
|
response.parse
|
|
end
|
|
|
|
def http
|
|
Danbooru::Http.new.cookies(a: Danbooru.config.furaffinity_cookie_a, b: Danbooru.config.furaffinity_cookie_b, sfw: 0)
|
|
end
|
|
end
|
|
end
|