Add Plurk support

This commit is contained in:
nonamethanks
2021-11-01 13:08:26 +01:00
parent 788dcbd87b
commit 060223c9e2
6 changed files with 168 additions and 1 deletions

View File

@@ -247,6 +247,8 @@ module IconHelper
image_icon_tag("pixiv-fanbox-logo.png", **options)
when "Pixiv Sketch"
image_icon_tag("pixiv-sketch-logo.png", **options)
when "Plurk"
image_icon_tag("plurk-logo.png", **options)
when "Privatter"
image_icon_tag("privatter-logo.png", **options)
when "Sakura.ne.jp"

View File

@@ -19,6 +19,7 @@ module Sources
Strategies::Skeb,
Strategies::Lofter,
Strategies::Foundation,
Strategies::Plurk,
]
end

View File

@@ -0,0 +1,97 @@
# Image URLs
#
# * https://images.plurk.com/5wj6WD0r6y4rLN0DL3sqag.jpg
#
# Page URLs
#
# * https://www.plurk.com/p/om6zv4
#
# Profile URLs
#
# * https://www.plurk.com/redeyehare
module Sources
module Strategies
class Plurk < Base
BASE_URL = %r{\Ahttps?://(?:www\.)?plurk\.com}i
PAGE_URL = %r{#{BASE_URL}(?:/m)?/p/(?<illust_id>\w+)}i
PROFILE_URL = %r{#{BASE_URL}/\w+}i
IMAGE_URL = %r{https?://images\.plurk\.com/\w+\.\w+}i
def domains
["plurk.com"]
end
def site_name
"Plurk"
end
def image_urls
return [url] if url =~ IMAGE_URL
images = page&.search(".bigplurk .content a img, .response.highlight_owner .content a img").to_a.map { |img| img["alt"] }
# the above returns both the "main" images, and any other art the artist might have posted in the replies
if images.empty?
# in case of adult posts, we fall back to the internal api, which doesn't show replies
images = images_from_internal_api
end
images
end
def page_url
return nil if illust_id.blank?
"https://plurk.com/p/#{illust_id}"
end
def illust_id
urls.map { |u| u[PAGE_URL, :illust_id] }.compact.first
end
def page
return nil if page_url.blank?
response = http.cache(1.minute).get(page_url)
return nil unless response.status == 200
response.parse
end
def images_from_internal_api
internal_api = page&.search("body script")&.select {|s| s.text =~ /plurk =/ }.to_a.compact.first&.text
return [] unless internal_api.present?
internal_api.scan(/(#{IMAGE_URL})/).flatten.compact.uniq.filter { |img| img !~ %r{/mx_\w+}i }
end
def tag_name
page&.at(".bigplurk .user a")&.[](:href)&.gsub(%r{^/}, "")
end
def artist_name
page&.at(".bigplurk .user a")&.text
end
def profile_url
return nil if artist_name.blank?
"https://www.plurk.com/#{tag_name}"
end
def artist_commentary_desc
page&.search(".bigplurk .content .text_holder, .response.highlight_owner .content .text_holder")&.to_html
end
def dtext_artist_commentary_desc
DText.from_html(artist_commentary_desc) do |element|
if element.name == "a"
element.content = ""
end
end.gsub(/\A[[:space:]]+|[[:space:]]+\z/, "")
end
def normalize_for_source
page_url
end
end
end
end

View File

@@ -108,7 +108,7 @@ class ArtistUrl < ApplicationRecord
def priority
sites = %w[
Pixiv Twitter
ArtStation BCY Deviant\ Art Hentai\ Foundry Foundation Nico\ Seiga Nijie pawoo.net Pixiv\ Fanbox Pixiv\ Sketch Tinami Tumblr
ArtStation baraag.net BCY Deviant\ Art Hentai\ Foundry Foundation Nico\ Seiga Nijie pawoo.net Pixiv\ Fanbox Pixiv\ Sketch Plurk Tinami Tumblr
Ask.fm Booth.pm Facebook Fantia FC2 Gumroad Instagram Ko-fi Livedoor Lofter Mihuashi Mixi.jp Patreon Piapro.jp Picarto Privatter Sakura.ne.jp Stickam Skeb Twitch Weibo Youtube
Amazon Circle.ms DLSite Doujinshi.org Erogamescape Mangaupdates Melonbooks Toranoana Wikipedia
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 1015 B

View File

@@ -0,0 +1,67 @@
require "test_helper"
module Sources
class PlurkTest < ActiveSupport::TestCase
context "The source for a Plurk picture" do
setup do
@post_url = "https://www.plurk.com/p/om6zv4"
@adult_post_url = "https://www.plurk.com/p/omc64y"
@image_url = "https://images.plurk.com/5wj6WD0r6y4rLN0DL3sqag.jpg"
@profile_url = "https://www.plurk.com/redeyehare"
@post1 = Sources::Strategies.find(@post_url)
@post2 = Sources::Strategies.find(@image_url)
@post3 = Sources::Strategies.find(@profile_url)
@post4 = Sources::Strategies.find(@adult_post_url)
end
should "not raise errors" do
assert_nothing_raised { @post1.to_h }
assert_nothing_raised { @post2.to_h }
assert_nothing_raised { @post3.to_h }
assert_nothing_raised { @post4.to_h }
end
should "get the artist name" do
assert_equal("紅眼兔", @post1.artist_name)
assert_equal("redeyehare", @post1.tag_name)
assert_equal("BOW99", @post4.tag_name)
end
should "get profile url" do
assert_equal(@profile_url, @post1.profile_url)
end
should "get the image url" do
assert_equal(@image_url, @post1.image_url)
assert_equal(@image_url, @post2.image_url)
end
should "get the image urls for an adult post" do
images = ["https://images.plurk.com/yfnumBJqqoQt50Em6xKwf.png",
"https://images.plurk.com/5NaqqO3Yi6bQW1wKXq1Dc2.png",
"https://images.plurk.com/3HzNcbMhCozHPk5YY8j9fI.png",
"https://images.plurk.com/2e0duwn8BpSW9MGuUvbrim.png",
"https://images.plurk.com/1OuiMDp82hYPEUn64CWFFB.png",
"https://images.plurk.com/3F3KzZOabeMYkgTeseEZ0r.png",
"https://images.plurk.com/7onKKTAIXkY4pASszrBys8.png",
"https://images.plurk.com/6aotmjLGbtMLiI3slN7ODv.png",
"https://images.plurk.com/6pzn7jE2nkj9EV7H25L0x1.png",
"https://images.plurk.com/yA8egjDuhy0eNG9yxRj1d.png",]
assert_equal(images, @post4.image_urls)
end
should "download an image" do
assert_downloaded(627_697, @post1.image_url)
assert_downloaded(627_697, @post2.image_url)
assert_downloaded(520_122, @post4.image_url)
end
should "find the correct artist" do
@artist = FactoryBot.create(:artist, name: "redeyehare", url_string: @profile_url)
assert_equal([@artist], @post1.artists)
@adult_artist = FactoryBot.create(:artist, name: "bow", url_string: "https://www.plurk.com/BOW99")
assert_equal([@adult_artist], @post4.artists)
end
end
end
end