From a2b68925ac3c1a7aa2d2e806abbdd8d48f4224f6 Mon Sep 17 00:00:00 2001 From: Ruin0x11 Date: Sun, 9 May 2021 01:29:36 -0700 Subject: [PATCH] Support BMP format uploads --- client/html/post_merge_side.tpl | 1 + client/html/post_readonly_sidebar.tpl | 1 + client/js/views/post_upload_view.js | 2 ++ server/szurubooru/func/mime.py | 5 +++++ server/szurubooru/tests/assets/bmp.bmp | Bin 0 -> 30054 bytes server/szurubooru/tests/func/test_mime.py | 4 ++++ server/szurubooru/tests/func/test_posts.py | 7 +++++++ 7 files changed, 20 insertions(+) create mode 100644 server/szurubooru/tests/assets/bmp.bmp diff --git a/client/html/post_merge_side.tpl b/client/html/post_merge_side.tpl index 53dd31f..a4e77ed 100644 --- a/client/html/post_merge_side.tpl +++ b/client/html/post_merge_side.tpl @@ -36,6 +36,7 @@ 'image/jpeg': 'JPEG', 'image/png': 'PNG', 'image/webp': 'WEBP', + 'image/bmp': 'BMP', 'video/webm': 'WEBM', 'video/mp4': 'MPEG-4', 'application/x-shockwave-flash': 'SWF', diff --git a/client/html/post_readonly_sidebar.tpl b/client/html/post_readonly_sidebar.tpl index cfbfd10..a54e7bb 100644 --- a/client/html/post_readonly_sidebar.tpl +++ b/client/html/post_readonly_sidebar.tpl @@ -9,6 +9,7 @@ 'image/jpeg': 'JPEG', 'image/png': 'PNG', 'image/webp': 'WEBP', + 'image/bmp': 'BMP', 'video/webm': 'WEBM', 'video/mp4': 'MPEG-4', 'application/x-shockwave-flash': 'SWF', diff --git a/client/js/views/post_upload_view.js b/client/js/views/post_upload_view.js index 7daf4fb..f1eb47c 100644 --- a/client/js/views/post_upload_view.js +++ b/client/js/views/post_upload_view.js @@ -15,6 +15,7 @@ function _mimeTypeToPostType(mimeType) { "image/jpeg": "image", "image/png": "image", "image/webp": "image", + "image/bmp": "image", "video/mp4": "video", "video/webm": "video", }[mimeType] || "unknown" @@ -109,6 +110,7 @@ class Url extends Uploadable { png: "image/png", gif: "image/gif", webp: "image/webp", + bmp: "image/bmp", mp4: "video/mp4", webm: "video/webm", }; diff --git a/server/szurubooru/func/mime.py b/server/szurubooru/func/mime.py index bd553fc..e521c25 100644 --- a/server/szurubooru/func/mime.py +++ b/server/szurubooru/func/mime.py @@ -21,6 +21,9 @@ def get_mime_type(content: bytes) -> str: if content[8:12] == b"WEBP": return "image/webp" + if content[0:2] == b"BM": + return "image/bmp" + if content[0:4] == b"\x1A\x45\xDF\xA3": return "video/webm" @@ -37,6 +40,7 @@ def get_extension(mime_type: str) -> Optional[str]: "image/jpeg": "jpg", "image/png": "png", "image/webp": "webp", + "image/bmp": "bmp", "video/mp4": "mp4", "video/webm": "webm", "application/octet-stream": "dat", @@ -58,6 +62,7 @@ def is_image(mime_type: str) -> bool: "image/png", "image/gif", "image/webp", + "image/bmp", ) diff --git a/server/szurubooru/tests/assets/bmp.bmp b/server/szurubooru/tests/assets/bmp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3a1826913cea61635d84d4d4537a23035fc7dd28 GIT binary patch literal 30054 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