diff --git a/lib/completions/upload_encoder.rb b/lib/completions/upload_encoder.rb index bd253c96..c2aecbaa 100644 --- a/lib/completions/upload_encoder.rb +++ b/lib/completions/upload_encoder.rb @@ -10,6 +10,14 @@ module DiscourseAi 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 @@ -20,12 +28,15 @@ module DiscourseAi new_width = (ratio * upload.width).to_i new_height = (ratio * upload.height).to_i - image = upload.get_optimized_image(new_width, new_height) + 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(upload.original_filename).content_type + mime_type = MiniMime.lookup_by_filename("test.#{desired_extension}").content_type path = Discourse.store.path_for(image) if path.blank? diff --git a/spec/fixtures/images/1x1.gif b/spec/fixtures/images/1x1.gif new file mode 100644 index 00000000..95a5eff6 Binary files /dev/null and b/spec/fixtures/images/1x1.gif differ diff --git a/spec/fixtures/images/1x1.jpg b/spec/fixtures/images/1x1.jpg new file mode 100644 index 00000000..f083de6b Binary files /dev/null and b/spec/fixtures/images/1x1.jpg differ diff --git a/spec/fixtures/images/1x1.webp b/spec/fixtures/images/1x1.webp new file mode 100644 index 00000000..c78718cd Binary files /dev/null and b/spec/fixtures/images/1x1.webp differ diff --git a/spec/lib/completions/upload_encoder_spec.rb b/spec/lib/completions/upload_encoder_spec.rb new file mode 100644 index 00000000..d0434630 --- /dev/null +++ b/spec/lib/completions/upload_encoder_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +RSpec.describe DiscourseAi::Completions::UploadEncoder do + let(:gif) { plugin_file_from_fixtures("1x1.gif") } + let(:jpg) { plugin_file_from_fixtures("1x1.jpg") } + let(:webp) { plugin_file_from_fixtures("1x1.webp") } + + it "automatically converts gifs to pngs" do + upload = UploadCreator.new(gif, "1x1.gif").create_for(Discourse.system_user.id) + encoded = described_class.encode(upload_ids: [upload.id], max_pixels: 1_048_576) + expect(encoded.length).to eq(1) + expect(encoded[0][:base64]).to be_present + expect(encoded[0][:mime_type]).to eq("image/png") + end + + it "automatically converts webp to pngs" do + upload = UploadCreator.new(webp, "1x1.webp").create_for(Discourse.system_user.id) + encoded = described_class.encode(upload_ids: [upload.id], max_pixels: 1_048_576) + expect(encoded.length).to eq(1) + expect(encoded[0][:base64]).to be_present + expect(encoded[0][:mime_type]).to eq("image/png") + end + + it "supports jpg" do + upload = UploadCreator.new(jpg, "1x1.jpg").create_for(Discourse.system_user.id) + encoded = described_class.encode(upload_ids: [upload.id], max_pixels: 1_048_576) + expect(encoded.length).to eq(1) + expect(encoded[0][:base64]).to be_present + expect(encoded[0][:mime_type]).to eq("image/jpeg") + end +end