Files
danbooru/app/logical/source/extractor/furaffinity.rb
nonamethanks 5b8402751c Furaffinity: fix uploads for non-ascii image urls
Use Addressable::URI, which supports non-ascii urls.
2022-05-09 18:38:38 +02:00

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