From 02c5ee9c495d06bc296d802f52b634489d3a3dd4 Mon Sep 17 00:00:00 2001
From: Lain Soykaf <lain@lain.com>
Date: Wed, 29 Jan 2025 18:09:13 +0400
Subject: [PATCH] MediaUpload, Settings: Add option to always convert to jpeg.

---
 changelog.d/always-jpeg.add                        | 1 +
 src/components/media_upload/media_upload.js        | 6 +++---
 src/components/settings_modal/tabs/general_tab.vue | 8 ++++++++
 src/i18n/en.json                                   | 1 +
 src/modules/config.js                              | 3 ++-
 5 files changed, 15 insertions(+), 4 deletions(-)
 create mode 100644 changelog.d/always-jpeg.add

diff --git a/changelog.d/always-jpeg.add b/changelog.d/always-jpeg.add
new file mode 100644
index 0000000000..f29ffeec48
--- /dev/null
+++ b/changelog.d/always-jpeg.add
@@ -0,0 +1 @@
+Added option to always convert images to JPEG format instead of using WebP when compressing images. 
\ No newline at end of file
diff --git a/src/components/media_upload/media_upload.js b/src/components/media_upload/media_upload.js
index f0fd0155f2..f2cbfc405a 100644
--- a/src/components/media_upload/media_upload.js
+++ b/src/components/media_upload/media_upload.js
@@ -76,9 +76,9 @@ const mediaUpload = {
           const testCanvas = document.createElement('canvas')
           const supportsWebP = testCanvas.toDataURL('image/webp').startsWith('data:image/webp')
 
-          // Convert to WebP if supported, otherwise JPEG
-          const type = supportsWebP ? 'image/webp' : 'image/jpeg'
-          const extension = supportsWebP ? '.webp' : '.jpg'
+          // Convert to WebP if supported and alwaysUseJpeg is false, otherwise JPEG
+          const type = (!this.$store.getters.mergedConfig.alwaysUseJpeg && supportsWebP) ? 'image/webp' : 'image/jpeg'
+          const extension = type === 'image/webp' ? '.webp' : '.jpg'
 
           // Remove the original extension and add new one
           const newFileName = file.name.replace(/\.[^/.]+$/, '') + extension
diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue
index 6d01f208e4..9d23630a99 100644
--- a/src/components/settings_modal/tabs/general_tab.vue
+++ b/src/components/settings_modal/tabs/general_tab.vue
@@ -269,6 +269,14 @@
             {{ $t('settings.image_compression') }}
           </BooleanSetting>
         </li>
+        <li>
+          <BooleanSetting
+            path="alwaysUseJpeg"
+            expert="1"
+          >
+            {{ $t('settings.always_use_jpeg') }}
+          </BooleanSetting>
+        </li>
         <li>
           <BooleanSetting
             path="useContainFit"
diff --git a/src/i18n/en.json b/src/i18n/en.json
index 3fad5ca831..ad81830f9d 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -440,6 +440,7 @@
     "attachmentRadius": "Attachments",
     "attachments": "Attachments",
     "image_compression": "Compress images before uploading",
+    "always_use_jpeg": "Always convert images to JPEG format",
     "avatar": "Avatar",
     "avatarAltRadius": "Avatars (notifications)",
     "avatarRadius": "Avatars",
diff --git a/src/modules/config.js b/src/modules/config.js
index ebc8b9311e..0bfe3b1e84 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -194,7 +194,8 @@ export const defaultState = {
   useAbsoluteTimeFormat: undefined, // instance default
   absoluteTimeFormatMinAge: undefined, // instance default
   absoluteTime12h: undefined, // instance default
-  imageCompression: true
+  imageCompression: true,
+  alwaysUseJpeg: false
 }
 
 // caching the instance default properties
-- 
GitLab