Files
redux-scraper/app/jobs/domain/e621/job/static_file_job.rb
2025-01-01 03:29:53 +00:00

58 lines
1.6 KiB
Ruby

# typed: true
module Domain::E621::Job
class StaticFileJob < Base
queue_as :static_file
def perform(args)
post = args[:post] || fatal_error("post is required")
caused_by_entry = args[:caused_by_entry]
logger.prefix = proc { "[e621_id #{post.e621_id.to_s.bold}]" }
file_url_str = post.file_url_str
if file_url_str.blank?
logger.warn("post has no file_url_str, enqueueing for scan")
defer_job(
Domain::E621::Job::ScanPostJob,
{ post: post, caused_by_entry: caused_by_entry },
)
return
end
if post.state == "file_error"
retry_count =
post.state_detail&.[]("file_error")&.[]("retry_count") || 0
if retry_count >= 3
logger.error("file has been retried 3 times, giving up")
return
end
end
response = http_client.get(file_url_str, caused_by_entry: caused_by_entry)
if response.status_code != 200
post.state = :file_error
fe = (post.state_detail["file_error"] ||= {})
fe["status_code"] = response.status_code
fe["log_entry_id"] = response.log_entry.id
fe["retry_count"] ||= 0
fe["retry_count"] += 1
post.save!
if response.status_code == 404
logger.error("#{response.status_code}, not retrying download")
else
fatal_error("#{response.status_code}, will retry later")
end
return
end
post.state = :ok
post.file = response.log_entry
post.save!
logger.info "downloaded file"
end
end
end