add webp support for uploadable images

This commit is contained in:
Jakob Ketterl 2021-05-07 16:57:54 +02:00
parent 7fc7fe5e82
commit ad8877f83c
4 changed files with 21 additions and 9 deletions

View File

@ -23,7 +23,7 @@ $.fn.imageUpload = function() {
$uploadButton.prop('disabled', true); $uploadButton.prop('disabled', true);
var input = document.createElement('input'); var input = document.createElement('input');
input.type = 'file'; input.type = 'file';
input.accept = 'image/jpeg, image/png'; input.accept = 'image/jpeg, image/png, image/webp';
input.onchange = function(e) { input.onchange = function(e) {
var reader = new FileReader() var reader = new FileReader()

View File

@ -96,7 +96,7 @@ class OwrxAssetsController(AssetsController):
} }
if file in mappedFiles and ("mapped" not in self.request.query or self.request.query["mapped"][0] != "false"): if file in mappedFiles and ("mapped" not in self.request.query or self.request.query["mapped"][0] != "false"):
config = CoreConfig() config = CoreConfig()
for ext in ["png", "jpg"]: for ext in ["png", "jpg", "webp"]:
user_file = "{}/{}.{}".format(config.get_data_directory(), mappedFiles[file], ext) user_file = "{}/{}.{}".format(config.get_data_directory(), mappedFiles[file], ext)
if os.path.exists(user_file) and os.path.isfile(user_file): if os.path.exists(user_file) and os.path.isfile(user_file):
return user_file return user_file

View File

@ -36,6 +36,9 @@ class ImageUploadController(AuthorizationMixin, AssetsController):
def _is_jpg(self, contents): def _is_jpg(self, contents):
return contents[0:3] == bytes([0xFF, 0xD8, 0xFF]) return contents[0:3] == bytes([0xFF, 0xD8, 0xFF])
def _is_webp(self, contents):
return contents[0:4] == bytes([0x52, 0x49, 0x46, 0x46]) and contents[8:12] == bytes([0x57, 0x45, 0x42, 0x50])
def processImage(self): def processImage(self):
if "id" not in self.request.query: if "id" not in self.request.query:
self.send_json_response({"error": "missing id"}, code=400) self.send_json_response({"error": "missing id"}, code=400)
@ -55,8 +58,10 @@ class ImageUploadController(AuthorizationMixin, AssetsController):
filetype = None filetype = None
if self._is_png(contents): if self._is_png(contents):
filetype = "png" filetype = "png"
if self._is_jpg(contents): elif self._is_jpg(contents):
filetype = "jpg" filetype = "jpg"
elif self._is_webp(contents):
filetype = "webp"
if filetype is None: if filetype is None:
self.send_json_response({"error": "unsupported file type"}, code=400) self.send_json_response({"error": "unsupported file type"}, code=400)
return return

View File

@ -19,6 +19,7 @@ from owrx.breadcrumb import Breadcrumb, BreadcrumbItem
from owrx.controllers.settings import SettingsBreadcrumb from owrx.controllers.settings import SettingsBreadcrumb
import shutil import shutil
import os import os
import re
from glob import glob from glob import glob
import logging import logging
@ -175,7 +176,7 @@ class GeneralSettingsController(SettingsFormController):
config = CoreConfig() config = CoreConfig()
if data[image_id] == "restore": if data[image_id] == "restore":
# remove all possible file extensions # remove all possible file extensions
for ext in ["png", "jpg"]: for ext in ["png", "jpg", "webp"]:
try: try:
os.unlink("{}/{}.{}".format(config.get_data_directory(), image_id, ext)) os.unlink("{}/{}.{}".format(config.get_data_directory(), image_id, ext))
except FileNotFoundError: except FileNotFoundError:
@ -184,11 +185,17 @@ class GeneralSettingsController(SettingsFormController):
if not data[image_id].startswith(image_id): if not data[image_id].startswith(image_id):
logger.warning("invalid file name: %s", data[image_id]) logger.warning("invalid file name: %s", data[image_id])
else: else:
# get file extension (luckily, all options are three characters long) # get file extension (at least 3 characters)
ext = data[image_id][-3:] # should be all lowercase since they are set by the upload script
data_file = "{}/{}.{}".format(config.get_data_directory(), image_id, ext) pattern = re.compile(".*\\.([a-z]{3,})$")
temporary_file = "{}/{}".format(config.get_temporary_directory(), data[image_id]) matches = pattern.match(data[image_id])
shutil.copy(temporary_file, data_file) if matches is None:
logger.warning("could not determine file extension for %s", image_id)
else:
ext = matches.group(1)
data_file = "{}/{}.{}".format(config.get_data_directory(), image_id, ext)
temporary_file = "{}/{}".format(config.get_temporary_directory(), data[image_id])
shutil.copy(temporary_file, data_file)
del data[image_id] del data[image_id]
# remove any accumulated temporary files on save # remove any accumulated temporary files on save
for file in glob("{}/{}*".format(config.get_temporary_directory(), image_id)): for file in glob("{}/{}*".format(config.get_temporary_directory(), image_id)):