57 lines
1.8 KiB
Ruby
57 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module DiscourseAi
|
|
module Completions
|
|
class UploadEncoder
|
|
def self.encode(upload_ids:, max_pixels:)
|
|
uploads = []
|
|
upload_ids.each do |upload_id|
|
|
upload = Upload.find(upload_id)
|
|
next if upload.blank?
|
|
next if upload.width.to_i == 0 || upload.height.to_i == 0
|
|
|
|
desired_extension = upload.extension
|
|
desired_extension = "png" if upload.extension == "gif"
|
|
desired_extension = "png" if upload.extension == "webp"
|
|
desired_extension = "jpeg" if upload.extension == "jpg"
|
|
|
|
# this keeps it very simple format wise given everyone supports png and jpg
|
|
next if !%w[jpeg png].include?(desired_extension)
|
|
|
|
original_pixels = upload.width * upload.height
|
|
|
|
image = upload
|
|
|
|
if original_pixels > max_pixels
|
|
ratio = max_pixels.to_f / original_pixels
|
|
|
|
new_width = (ratio * upload.width).to_i
|
|
new_height = (ratio * upload.height).to_i
|
|
|
|
image = upload.get_optimized_image(new_width, new_height, format: desired_extension)
|
|
elsif upload.extension != desired_extension
|
|
image =
|
|
upload.get_optimized_image(upload.width, upload.height, format: desired_extension)
|
|
end
|
|
|
|
next if !image
|
|
|
|
mime_type = MiniMime.lookup_by_filename("test.#{desired_extension}").content_type
|
|
|
|
path = Discourse.store.path_for(image)
|
|
if path.blank?
|
|
# download is protected with a DistributedMutex
|
|
external_copy = Discourse.store.download_safe(image)
|
|
path = external_copy&.path
|
|
end
|
|
|
|
encoded = Base64.strict_encode64(File.read(path))
|
|
|
|
uploads << { base64: encoded, mime_type: mime_type }
|
|
end
|
|
uploads
|
|
end
|
|
end
|
|
end
|
|
end
|