Convert pawoo strategy to mastodon
This commit is contained in:
80
app/logical/mastodon_api_client.rb
Normal file
80
app/logical/mastodon_api_client.rb
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
class MastodonApiClient
|
||||||
|
extend Memoist
|
||||||
|
attr_reader :json
|
||||||
|
|
||||||
|
def initialize(site_name, id)
|
||||||
|
@site_name = site_name
|
||||||
|
|
||||||
|
return if access_token.blank?
|
||||||
|
|
||||||
|
begin
|
||||||
|
@json = JSON.parse(access_token.get("/api/v1/statuses/#{id}").body)
|
||||||
|
rescue StandardError
|
||||||
|
@json = {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def profile_url
|
||||||
|
json.dig("account", "url")
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_name
|
||||||
|
json.dig("account", "username")
|
||||||
|
end
|
||||||
|
|
||||||
|
def display_name
|
||||||
|
json.dig("account", "display_name")
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_id
|
||||||
|
json.dig("account", "id")
|
||||||
|
end
|
||||||
|
|
||||||
|
def image_url
|
||||||
|
image_urls.first
|
||||||
|
end
|
||||||
|
|
||||||
|
def image_urls
|
||||||
|
json["media_attachments"].to_a.map {|x| x["url"]}
|
||||||
|
end
|
||||||
|
|
||||||
|
def tags
|
||||||
|
json["tags"].to_a.map { |tag| [tag["name"], tag["url"]] }
|
||||||
|
end
|
||||||
|
|
||||||
|
def commentary
|
||||||
|
commentary = ""
|
||||||
|
commentary << "<p>#{json["spoiler_text"]}</p>" if json["spoiler_text"].present?
|
||||||
|
commentary << json["content"]
|
||||||
|
commentary
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_h
|
||||||
|
json
|
||||||
|
end
|
||||||
|
|
||||||
|
def fetch_access_token
|
||||||
|
Cache.get("#{@site_name}-token") do
|
||||||
|
result = client.client_credentials.get_token
|
||||||
|
result.token
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def access_token
|
||||||
|
return if client.blank?
|
||||||
|
OAuth2::AccessToken.new(client, fetch_access_token)
|
||||||
|
end
|
||||||
|
|
||||||
|
def client
|
||||||
|
if @site_name == "pawoo.net"
|
||||||
|
client_id = Danbooru.config.pawoo_client_id
|
||||||
|
client_secret = Danbooru.config.pawoo_client_secret
|
||||||
|
end
|
||||||
|
|
||||||
|
return unless client_id && client_secret
|
||||||
|
|
||||||
|
OAuth2::Client.new(client_id, client_secret, :site => "https://#{@site_name}")
|
||||||
|
end
|
||||||
|
|
||||||
|
memoize :client
|
||||||
|
end
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
class PawooApiClient
|
|
||||||
extend Memoist
|
|
||||||
|
|
||||||
PROFILE1 = %r!\Ahttps?://pawoo\.net/web/accounts/(\d+)!
|
|
||||||
PROFILE2 = %r!\Ahttps?://pawoo\.net/@([^/]+)!
|
|
||||||
STATUS1 = %r!\Ahttps?://pawoo\.net/web/statuses/(\d+)!
|
|
||||||
STATUS2 = %r!\Ahttps?://pawoo\.net/@.+?/([^/]+)!
|
|
||||||
|
|
||||||
class MissingConfigurationError < StandardError; end
|
|
||||||
|
|
||||||
class Account
|
|
||||||
attr_reader :json
|
|
||||||
|
|
||||||
def self.is_match?(url)
|
|
||||||
if url =~ PROFILE1
|
|
||||||
return $1
|
|
||||||
end
|
|
||||||
|
|
||||||
if url =~ PROFILE2
|
|
||||||
return $1
|
|
||||||
end
|
|
||||||
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def initialize(json)
|
|
||||||
@json = json
|
|
||||||
end
|
|
||||||
|
|
||||||
def profile_url
|
|
||||||
json["url"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def account_name
|
|
||||||
json["username"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def image_url
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def image_urls
|
|
||||||
[]
|
|
||||||
end
|
|
||||||
|
|
||||||
def tags
|
|
||||||
[]
|
|
||||||
end
|
|
||||||
|
|
||||||
def commentary
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def to_h
|
|
||||||
json
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class Status
|
|
||||||
attr_reader :json
|
|
||||||
|
|
||||||
def self.is_match?(url)
|
|
||||||
if url =~ STATUS1
|
|
||||||
return $1
|
|
||||||
end
|
|
||||||
|
|
||||||
if url =~ STATUS2
|
|
||||||
return $1
|
|
||||||
end
|
|
||||||
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def initialize(json)
|
|
||||||
@json = json
|
|
||||||
end
|
|
||||||
|
|
||||||
def profile_url
|
|
||||||
json["account"]["url"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def account_name
|
|
||||||
json["account"]["username"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def image_url
|
|
||||||
image_urls.first
|
|
||||||
end
|
|
||||||
|
|
||||||
def image_urls
|
|
||||||
json["media_attachments"].map {|x| x["url"]}
|
|
||||||
end
|
|
||||||
|
|
||||||
def tags
|
|
||||||
json["tags"].map { |tag| [tag["name"], tag["url"]] }
|
|
||||||
end
|
|
||||||
|
|
||||||
def commentary
|
|
||||||
commentary = ""
|
|
||||||
commentary << "<p>#{json["spoiler_text"]}</p>" if json["spoiler_text"].present?
|
|
||||||
commentary << json["content"]
|
|
||||||
commentary
|
|
||||||
end
|
|
||||||
|
|
||||||
def to_h
|
|
||||||
json
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def get(url)
|
|
||||||
if id = Status.is_match?(url)
|
|
||||||
begin
|
|
||||||
data = JSON.parse(access_token.get("/api/v1/statuses/#{id}").body)
|
|
||||||
rescue
|
|
||||||
data = {
|
|
||||||
"account" => {},
|
|
||||||
"media_attachments" => [],
|
|
||||||
"tags" => [],
|
|
||||||
"content" => "",
|
|
||||||
}
|
|
||||||
end
|
|
||||||
return Status.new(data)
|
|
||||||
end
|
|
||||||
|
|
||||||
if id = Account.is_match?(url)
|
|
||||||
begin
|
|
||||||
data = JSON.parse(access_token.get("/api/v1/accounts/#{id}").body)
|
|
||||||
rescue
|
|
||||||
data = {}
|
|
||||||
end
|
|
||||||
Account.new(data)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def fetch_access_token
|
|
||||||
raise MissingConfigurationError, "missing pawoo client id" if Danbooru.config.pawoo_client_id.nil?
|
|
||||||
raise MissingConfigurationError, "missing pawoo client secret" if Danbooru.config.pawoo_client_secret.nil?
|
|
||||||
|
|
||||||
Cache.get("pawoo-token") do
|
|
||||||
result = client.client_credentials.get_token
|
|
||||||
result.token
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def access_token
|
|
||||||
OAuth2::AccessToken.new(client, fetch_access_token)
|
|
||||||
end
|
|
||||||
|
|
||||||
def client
|
|
||||||
OAuth2::Client.new(Danbooru.config.pawoo_client_id, Danbooru.config.pawoo_client_secret, :site => "https://pawoo.net")
|
|
||||||
end
|
|
||||||
|
|
||||||
memoize :client
|
|
||||||
end
|
|
||||||
@@ -11,7 +11,7 @@ module Sources
|
|||||||
Strategies::Tumblr,
|
Strategies::Tumblr,
|
||||||
Strategies::ArtStation,
|
Strategies::ArtStation,
|
||||||
Strategies::Nijie,
|
Strategies::Nijie,
|
||||||
Strategies::Pawoo,
|
Strategies::Mastodon,
|
||||||
Strategies::Moebooru,
|
Strategies::Moebooru,
|
||||||
Strategies::HentaiFoundry,
|
Strategies::HentaiFoundry,
|
||||||
Strategies::Weibo,
|
Strategies::Weibo,
|
||||||
|
|||||||
@@ -15,25 +15,28 @@
|
|||||||
# * https://pawoo.net/oauth_authentications/17230064
|
# * https://pawoo.net/oauth_authentications/17230064
|
||||||
|
|
||||||
module Sources::Strategies
|
module Sources::Strategies
|
||||||
class Pawoo < Base
|
class Mastodon < Base
|
||||||
HOST = %r{\Ahttps?://(www\.)?pawoo\.net}i
|
HOST = %r{\Ahttps?://(?:www\.)?(?<domain>pawoo\.net)}i
|
||||||
IMAGE = %r{\Ahttps?://img\.pawoo\.net/media_attachments/files/(\d+/\d+/\d+)}
|
IMAGE = %r{\Ahttps?://img\.pawoo\.net/media_attachments/files/(\d+/\d+/\d+)}
|
||||||
NAMED_PROFILE = %r{#{HOST}/@(?<artist_name>\w+)}i
|
NAMED_PROFILE = %r{#{HOST}/@(?<artist_name>\w+)}i
|
||||||
ID_PROFILE = %r{#{HOST}/web/accounts/(?<artist_id>\d+)}
|
ID_PROFILE = %r{#{HOST}/web/accounts/(?<account_id>\d+)}
|
||||||
|
|
||||||
STATUS1 = %r{\A#{HOST}/web/statuses/(?<status_id>\d+)}
|
STATUS1 = %r{\A#{HOST}/web/statuses/(?<status_id>\d+)}
|
||||||
STATUS2 = %r{\A#{NAMED_PROFILE}/(?<status_id>\d+)}
|
STATUS2 = %r{\A#{NAMED_PROFILE}/(?<status_id>\d+)}
|
||||||
|
|
||||||
def self.enabled?
|
|
||||||
Danbooru.config.pawoo_client_id.present? && Danbooru.config.pawoo_client_secret.present?
|
|
||||||
end
|
|
||||||
|
|
||||||
def domains
|
def domains
|
||||||
["pawoo.net"]
|
["pawoo.net"]
|
||||||
end
|
end
|
||||||
|
|
||||||
def site_name
|
def site_name
|
||||||
"Pawoo"
|
parsed_url.domain
|
||||||
|
end
|
||||||
|
|
||||||
|
def file_host
|
||||||
|
case site_name
|
||||||
|
when "pawoo.net" then "img.pawoo.net"
|
||||||
|
else site_name
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def image_url
|
def image_url
|
||||||
@@ -41,49 +44,56 @@ module Sources::Strategies
|
|||||||
end
|
end
|
||||||
|
|
||||||
def image_urls
|
def image_urls
|
||||||
if url =~ %r{#{IMAGE}/small/([a-z0-9]+\.\w+)\z}i
|
if url =~ %r{#{IMAGE}/(?:small|original)/([a-z0-9]+\.\w+)\z}i
|
||||||
["https://img.pawoo.net/media_attachments/files/#{$1}/original/#{$2}"]
|
["https://#{file_host}/media_attachments/files/#{$1}/original/#{$2}"]
|
||||||
elsif url =~ %r{#{IMAGE}/original/([a-z0-9]+\.\w+)\z}i
|
|
||||||
[url]
|
|
||||||
else
|
else
|
||||||
api_response.image_urls
|
api_response.image_urls
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def page_url
|
def page_url
|
||||||
[url, referer_url].each do |x|
|
artist_name = artist_name_from_url
|
||||||
if PawooApiClient::Status.is_match?(x)
|
status_id = status_id_from_url
|
||||||
return x
|
return if status_id.blank?
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
super
|
if artist_name.present?
|
||||||
|
"https://#{site_name}/@#{artist_name}/#{status_id}"
|
||||||
|
else
|
||||||
|
"https://#{site_name}/web/statuses/#{status_id}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def profile_url
|
def profile_url
|
||||||
if url =~ PawooApiClient::PROFILE2
|
if artist_name_from_url.present?
|
||||||
"https://pawoo.net/@#{$1}"
|
"https://#{site_name}/@#{artist_name_from_url}"
|
||||||
elsif api_response.profile_url.blank?
|
elsif api_response.present? && api_response.profile_url.present?
|
||||||
url
|
|
||||||
else
|
|
||||||
api_response.profile_url
|
api_response.profile_url
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def account_url
|
||||||
|
return if account_id.blank?
|
||||||
|
"https://#{site_name}/web/accounts/#{account_id}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def profile_urls
|
||||||
|
[profile_url, account_url].compact
|
||||||
|
end
|
||||||
|
|
||||||
def artist_name
|
def artist_name
|
||||||
api_response.account_name
|
api_response.account_name
|
||||||
end
|
end
|
||||||
|
|
||||||
def artist_name_from_url
|
def artist_name_from_url
|
||||||
if url =~ NAMED_PROFILE
|
url[NAMED_PROFILE, :artist_name]
|
||||||
url[NAMED_PROFILE, :artist_name]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def artist_id_from_url
|
def other_names
|
||||||
if url =~ ID_PROFILE
|
[api_response.display_name]
|
||||||
url[ID_PROFILE, :artist_name]
|
end
|
||||||
end
|
|
||||||
|
def account_id
|
||||||
|
url[ID_PROFILE, :account_id] || api_response.account_id
|
||||||
end
|
end
|
||||||
|
|
||||||
def status_id_from_url
|
def status_id_from_url
|
||||||
@@ -99,15 +109,7 @@ module Sources::Strategies
|
|||||||
end
|
end
|
||||||
|
|
||||||
def normalize_for_source
|
def normalize_for_source
|
||||||
artist_name = artist_name_from_url
|
page_url
|
||||||
status_id = status_id_from_url
|
|
||||||
return if status_id.blank?
|
|
||||||
|
|
||||||
if artist_name.present?
|
|
||||||
"https://pawoo.net/@#{artist_name}/#{status_id}"
|
|
||||||
else
|
|
||||||
"https://pawoo.net/web/statuses/#{status_id}"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def dtext_artist_commentary_desc
|
def dtext_artist_commentary_desc
|
||||||
@@ -121,13 +123,8 @@ module Sources::Strategies
|
|||||||
end
|
end
|
||||||
|
|
||||||
def api_response
|
def api_response
|
||||||
[url, referer_url].each do |x|
|
return {} if status_id_from_url.blank?
|
||||||
if (client = PawooApiClient.new.get(x))
|
MastodonApiClient.new(site_name, status_id_from_url)
|
||||||
return client
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
nil
|
|
||||||
end
|
end
|
||||||
memoize :api_response
|
memoize :api_response
|
||||||
end
|
end
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
||||||
module Sources
|
module Sources
|
||||||
class PawooTest < ActiveSupport::TestCase
|
class MastodonTest < ActiveSupport::TestCase
|
||||||
context "The source site for a https://pawoo.net/web/status/$id url" do
|
context "The source site for a https://pawoo.net/web/status/$id url" do
|
||||||
setup do
|
setup do
|
||||||
skip "Pawoo keys not set" unless Danbooru.config.pawoo_client_id
|
skip "Pawoo keys not set" unless Danbooru.config.pawoo_client_id
|
||||||
@@ -38,7 +38,9 @@ module Sources
|
|||||||
end
|
end
|
||||||
|
|
||||||
should "get the profile" do
|
should "get the profile" do
|
||||||
assert_equal("https://pawoo.net/@evazion", @site.profile_url)
|
profiles = %w[https://pawoo.net/@evazion https://pawoo.net/web/accounts/47806]
|
||||||
|
assert_equal(profiles.first, @site.profile_url)
|
||||||
|
assert_equal(profiles, @site.profile_urls)
|
||||||
end
|
end
|
||||||
|
|
||||||
should "get the artist name" do
|
should "get the artist name" do
|
||||||
@@ -68,7 +70,7 @@ module Sources
|
|||||||
end
|
end
|
||||||
|
|
||||||
should "get the dtext-ified commentary" do
|
should "get the dtext-ified commentary" do
|
||||||
desc = <<-EOS.strip_heredoc.chomp
|
desc = <<-DESC.strip_heredoc.chomp
|
||||||
test post please ignore
|
test post please ignore
|
||||||
|
|
||||||
blah blah blah
|
blah blah blah
|
||||||
@@ -76,7 +78,7 @@ module Sources
|
|||||||
this is a test 🍕
|
this is a test 🍕
|
||||||
|
|
||||||
"#foo":[https://pawoo.net/tags/foo] "#bar":[https://pawoo.net/tags/bar] "#baz":[https://pawoo.net/tags/baz]
|
"#foo":[https://pawoo.net/tags/foo] "#bar":[https://pawoo.net/tags/bar] "#baz":[https://pawoo.net/tags/baz]
|
||||||
EOS
|
DESC
|
||||||
|
|
||||||
assert_equal(desc, @site.dtext_artist_commentary_desc)
|
assert_equal(desc, @site.dtext_artist_commentary_desc)
|
||||||
end
|
end
|
||||||
Reference in New Issue
Block a user