50 lines
1.4 KiB
Ruby
50 lines
1.4 KiB
Ruby
# typed: strict
|
|
class Domain::E621::Job::ScanPostJob < Domain::E621::Job::Base
|
|
queue_as :e621
|
|
|
|
sig { override.params(args: T::Hash[Symbol, T.untyped]).void }
|
|
def perform(args)
|
|
post = T.let(args[:post] || raise("no post provided"), Domain::E621::Post)
|
|
|
|
logger.prefix =
|
|
proc { "[e621_id #{post.e621_id.to_s.bold} / #{post.state&.bold}]" }
|
|
|
|
if post.file.present?
|
|
logger.warn("Post #{post.e621_id} already has a file")
|
|
return
|
|
end
|
|
|
|
if post.file_url_str.present?
|
|
logger.error("Post #{post.e621_id} already has a file URL")
|
|
return
|
|
end
|
|
|
|
logger.info("Scanning post #{post.e621_id}")
|
|
response = http_client.get("https://e621.net/posts/#{post.e621_id}.json")
|
|
log_entry = response.log_entry
|
|
if response.status_code != 200
|
|
post.state_detail["scan_log_entry_id"] = log_entry.id
|
|
post.state = :scan_error
|
|
post.state_detail[
|
|
"scan_error"
|
|
] = "Error scanning post #{post.e621_id}: #{response.status_code}"
|
|
post.save!
|
|
fatal_error(
|
|
"Error scanning post #{post.e621_id}: #{response.status_code}",
|
|
)
|
|
end
|
|
|
|
post_json = JSON.parse(response.body)["post"]
|
|
post =
|
|
Domain::E621::TagUtil.initialize_or_update_post(
|
|
post_json: post_json,
|
|
caused_by_entry: log_entry,
|
|
)
|
|
post.save!
|
|
|
|
unless post.file.present?
|
|
defer_job(Domain::E621::Job::StaticFileJob, { post: post })
|
|
end
|
|
end
|
|
end
|