Websites/app/models/e621_thumbnail.rb
2024-05-02 22:04:43 -05:00

126 lines
2.6 KiB
Ruby

# frozen_string_literal: true
class E621Thumbnail < ApplicationRecord
class DeletedPostError < StandardError; end
belongs_to_creator
belongs_to :api_key, optional: true
# def post
# p = Requests::E621.get_post(id: post_id)
# current_md5 = p.try(:[], "file").try(:[], "md5")
# if current_md5.present? && current_md5 != stripped_md5
# update(md5: p["file"]["md5"])
# regenerate!
# end
# end
module FileMethods
def regenerate!
delete_files!
generate!
end
def generate!
update(status: "generating")
E621ThumbnailJob.perform_later(self)
end
def delete_files!
StorageManager::E621Thumbnails.delete("#{stripped_md5}.#{filetype}") if StorageManager::E621Thumbnails.exists?("#{stripped_md5}.#{filetype}")
end
def url
StorageManager::E621Thumbnails.url_for(self)
end
end
module StatusMethods
def pending?
status == "pending"
end
def generating?
status == "generating"
end
def complete?
status == "complete"
end
def error?
status == "error"
end
def timeout?
status == "timeout"
end
end
module CheckMethods
def check_url
"https://thumbs.yiff.rest/check/#{stripped_md5}/#{filetype}"
end
def check_time
time = Time.now - created_at
case filetype
when "gif"
return 5_000 if time > 45_000
return 10_000 if time > 30_000
15_000
when "png"
return 2_500 if time > 30_000
return 5_000 if time > 20_000
10_000
else
0
end
end
end
include FileMethods
include StatusMethods
include CheckMethods
def stripped_md5
md5.gsub("-", "")
end
def refresh!
end
def self.refresh_all!
unique = E621Thumbnail.select(:md5).distinct
unique.each_slice(100) do |slice|
tags = "md5:#{slice.map(&:stripped_md5).join(',')}"
Rails.logger.debug(tags)
end
end
def self.from_post(post, type, api_key_id:)
raise(DeletedPostError) if post["flags"]["deleted"]
E621Thumbnail.create!(
api_key_id: api_key_id,
md5: post["file"]["md5"],
filetype: type,
post_id: post["id"],
)
end
def self.urls_from_post(post)
find_by_post(post).transform_values { |thumb| thumb&.url }
end
def self.find_by_post(post, type = nil)
raise(DeletedPostError) if post["flags"]["deleted"]
md5 = post["file"]["md5"]
q = where(md5: md5)
return q.find_by(filetype: type) if type.present?
{
gif: q.find_by(md5: md5, filetype: "gif"),
png: q.find_by(md5: md5, filetype: "png"),
}
end
end