Fix #3395: fix pixiv API exception when uploading bad pixiv id images.
Fixes an exception when attempting to upload a Pixiv image from a deleted work. The download strategy tries to fetch the source data in the course of rewriting the URL, which fails if the work has been deleted from Pixiv. Raise a BadIDError and leave the URL as-is (don't rewrite it).
This commit is contained in:
@@ -27,6 +27,8 @@ module Downloads
|
|||||||
data[:ugoira_content_type] = source.ugoira_content_type
|
data[:ugoira_content_type] = source.ugoira_content_type
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return [url, headers, data]
|
||||||
|
rescue PixivApiClient::BadIDError
|
||||||
return [url, headers, data]
|
return [url, headers, data]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ class PixivApiClient
|
|||||||
]
|
]
|
||||||
|
|
||||||
class Error < Exception ; end
|
class Error < Exception ; end
|
||||||
|
class BadIDError < Error ; end
|
||||||
|
|
||||||
class WorksResponse
|
class WorksResponse
|
||||||
attr_reader :json, :pages, :name, :moniker, :user_id, :page_count, :tags
|
attr_reader :json, :pages, :name, :moniker, :user_id, :page_count, :tags
|
||||||
@@ -142,24 +143,17 @@ class PixivApiClient
|
|||||||
url = "https://public-api.secure.pixiv.net/v#{API_VERSION}/works/#{illust_id.to_i}.json"
|
url = "https://public-api.secure.pixiv.net/v#{API_VERSION}/works/#{illust_id.to_i}.json"
|
||||||
resp = HTTParty.get(url, Danbooru.config.httparty_options.deep_merge(query: params, headers: headers))
|
resp = HTTParty.get(url, Danbooru.config.httparty_options.deep_merge(query: params, headers: headers))
|
||||||
body = resp.body.force_encoding("utf-8")
|
body = resp.body.force_encoding("utf-8")
|
||||||
|
json = JSON.parse(body)
|
||||||
|
|
||||||
if resp.success?
|
if resp.success?
|
||||||
json = parse_api_json(body)
|
|
||||||
WorksResponse.new(json["response"][0])
|
WorksResponse.new(json["response"][0])
|
||||||
|
elsif json["status"] == "failure" && json.dig("errors", "system", "message") =~ /対象のイラストは見つかりませんでした。/
|
||||||
|
raise BadIDError.new("Pixiv ##{illust_id} not found: work was deleted, made private, or ID is invalid.")
|
||||||
else
|
else
|
||||||
raise Error.new("Pixiv API call failed (status=#{resp.code} body=#{body})")
|
raise Error.new("Pixiv API call failed (status=#{resp.code} body=#{body})")
|
||||||
end
|
end
|
||||||
end
|
rescue JSON::ParserError
|
||||||
|
raise Error.new("Pixiv API call failed (status=#{resp.code} body=#{body})")
|
||||||
private
|
|
||||||
def parse_api_json(body)
|
|
||||||
json = JSON.parse(body)
|
|
||||||
|
|
||||||
if json["status"] != "success"
|
|
||||||
raise Error.new("Pixiv API call failed (status=#{json['status']} body=#{body})")
|
|
||||||
end
|
|
||||||
|
|
||||||
json
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def access_token
|
def access_token
|
||||||
|
|||||||
@@ -43,8 +43,6 @@ module Downloads
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Test a new illustration (one uploaded after 2014-09-30). New illustrations
|
# Test a new illustration (one uploaded after 2014-09-30). New illustrations
|
||||||
# must use /img-original/ for full size URLs. Old /imgXX/img/username/ style URLs
|
# must use /img-original/ for full size URLs. Old /imgXX/img/username/ style URLs
|
||||||
# don't work for images uploaded after this date.
|
# don't work for images uploaded after this date.
|
||||||
@@ -112,6 +110,27 @@ module Downloads
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "downloading a bad id image" do
|
||||||
|
setup do
|
||||||
|
@bad_id_full = "https://i.pximg.net/img-original/img/2017/11/22/01/06/44/65991677_p0.png"
|
||||||
|
@bad_id_sample = "https://i.pximg.net/c/600x600/img-master/img/2017/11/22/01/06/44/65991677_p0_master1200.jpg"
|
||||||
|
end
|
||||||
|
|
||||||
|
should "not raise an error when rewriting the url" do
|
||||||
|
assert_nothing_raised { assert_not_rewritten(@bad_id_full) }
|
||||||
|
end
|
||||||
|
|
||||||
|
should_eventually "rewrite bad id samples to full size" do
|
||||||
|
assert_rewritten(@bad_id_full, @bad_id_sample)
|
||||||
|
end
|
||||||
|
|
||||||
|
# XXX This may fail someday. Pixiv doesn't delete bad id images right
|
||||||
|
# away, but they may be deleted eventually.
|
||||||
|
should "download the image" do
|
||||||
|
assert_downloaded(21440, @bad_id_full)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "downloading a ugoira" do
|
context "downloading a ugoira" do
|
||||||
setup do
|
setup do
|
||||||
@medium_page = "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247364"
|
@medium_page = "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247364"
|
||||||
|
|||||||
@@ -127,6 +127,14 @@ module Sources
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "fetching source data for a deleted work" do
|
||||||
|
should "raise a bad id error" do
|
||||||
|
assert_raise(::PixivApiClient::BadIDError) do
|
||||||
|
get_source("https://i.pximg.net/img-original/img/2017/11/22/01/06/44/65991677_p0.png")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "fetching the commentary" do
|
context "fetching the commentary" do
|
||||||
should "work when the description is blank" do
|
should "work when the description is blank" do
|
||||||
get_source("https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65981746")
|
get_source("https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65981746")
|
||||||
|
|||||||
Reference in New Issue
Block a user