discourse-ai/lib/completions/upload_encoder.rb

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