diff --git a/app/logical/downloads/rewrite_strategies/pixiv.rb b/app/logical/downloads/rewrite_strategies/pixiv.rb index 3d8316d1f..863258195 100644 --- a/app/logical/downloads/rewrite_strategies/pixiv.rb +++ b/app/logical/downloads/rewrite_strategies/pixiv.rb @@ -27,6 +27,8 @@ module Downloads data[:ugoira_content_type] = source.ugoira_content_type end + return [url, headers, data] + rescue PixivApiClient::BadIDError return [url, headers, data] end diff --git a/app/logical/pixiv_api_client.rb b/app/logical/pixiv_api_client.rb index b23962820..7c9e50a73 100644 --- a/app/logical/pixiv_api_client.rb +++ b/app/logical/pixiv_api_client.rb @@ -19,6 +19,7 @@ class PixivApiClient ] class Error < Exception ; end + class BadIDError < Error ; end class WorksResponse attr_reader :json, :pages, :name, :moniker, :user_id, :page_count, :tags @@ -141,24 +142,18 @@ class PixivApiClient 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)) - - if resp.success? - json = parse_api_json(resp.body) - WorksResponse.new(json["response"][0]) - else - raise Error.new("Pixiv API call failed (status=#{resp.code} body=#{resp.body})") - end - end - -private - def parse_api_json(body) + body = resp.body.force_encoding("utf-8") json = JSON.parse(body) - if json["status"] != "success" - raise Error.new("Pixiv API call failed (status=#{json['status']} body=#{body})") + if resp.success? + 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 + raise Error.new("Pixiv API call failed (status=#{resp.code} body=#{body})") end - - json + rescue JSON::ParserError + raise Error.new("Pixiv API call failed (status=#{resp.code} body=#{body})") end def access_token @@ -177,11 +172,13 @@ private url = "https://oauth.secure.pixiv.net/auth/token" resp = HTTParty.post(url, Danbooru.config.httparty_options.deep_merge(body: params, headers: headers)) + body = resp.body.force_encoding("utf-8") + if resp.success? - json = JSON.parse(resp.body) + json = JSON.parse(body) access_token = json["response"]["access_token"] else - raise Error.new("Pixiv API access token call failed (status=#{resp.code} body=#{resp.body})") + raise Error.new("Pixiv API access token call failed (status=#{resp.code} body=#{body})") end access_token diff --git a/app/views/static/error.html.erb b/app/views/static/error.html.erb index e0daa2bbd..6d09563e7 100644 --- a/app/views/static/error.html.erb +++ b/app/views/static/error.html.erb @@ -1,7 +1,7 @@ <% if CurrentUser.user.is_builder? && @exception.present? %>

<%= @exception.class.to_s %> exception raised