Websites/app/models/e621_thumbnail.rb
Donovan Daniels b1c702e3cd
Add image management ui
poorly tested but it worked well enough, I'm sure I'll be patching bugs over the next few weeks
Also remove turbo because it sucks
Also changed the way we handle hosts in dev
2024-05-06 03:25:17 -05:00

130 lines
2.7 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!
Websites.config.e621_thumbnails_storage.delete("/#{stripped_md5}.#{filetype}") if StorageManager::E621Thumbnails.exists?("#{stripped_md5}.#{filetype}")
end
def url
Websites.config.e621_thumbnails_storage.url_for(self)
end
def path
"/#{stripped_md5}.#{filetype}"
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