Files
danbooru/app/logical/source/extractor/furaffinity.rb
evazion 412b7f2727 http: split requests into internal and external requests.
Split requests made by Danbooru::Http into either internal or external
requests. Internal requests are API calls to internal services run by
Danbooru. External requests are requests to external websites, for
example fetching sources or downloading files. External requests may use
a HTTP proxy if one is configured. Internal requests don't.

Fixes a few source extractors not using the HTTP proxy for certain API calls.
2022-10-19 01:49:28 -05:00

74 lines
2.2 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
super.cookies(a: Danbooru.config.furaffinity_cookie_a, b: Danbooru.config.furaffinity_cookie_b, sfw: 0)
end
end
end