Skip to content

Commit 2c6568a

Browse files
committed
✨ Mimetype guessing for the webcam test
Related to OctoPrint#3207
1 parent e27c216 commit 2c6568a

File tree

4 files changed

+20
-4
lines changed

4 files changed

+20
-4
lines changed

setup.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@
6161
"monotonic>=1.5,<1.6",
6262
"frozendict>=1.2,<1.3",
6363
"sentry-sdk==0.7.7",
64-
"typing>=3.6.6,<4"
64+
"typing>=3.6.6,<4",
65+
"filetype>=1.0.5,<2"
6566
]
6667

6768
if sys.platform == "darwin":

src/octoprint/server/api/__init__.py

+10
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,17 @@ def as_dict(self):
464464
response_result = dict(headers=dict(response.headers),
465465
content_type=content_type)
466466

467+
if not content_type and data.get("content_type_guess") in valid_boolean_trues:
468+
content = response.content
469+
content_type = util.guess_mime_type(bytearray(content))
470+
471+
if not content_type:
472+
content_type = "application/octet-stream"
473+
474+
response_result = dict(assumed_content_type=content_type)
475+
467476
parsed_content_type = util.parse_mime_type(content_type)
477+
468478
in_whitelist = content_type_whitelist is None or any(
469479
map(lambda x: util.mime_type_matches(parsed_content_type, x), content_type_whitelist))
470480
in_blacklist = content_type_blacklist is not None and any(

src/octoprint/static/js/app/viewmodels/settings.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,8 @@ $(function() {
361361
response: "bytes",
362362
timeout: self.webcam_snapshotTimeout(),
363363
validSsl: self.webcam_snapshotSslValidation(),
364-
content_type_whitelist: ["image/*"]
364+
content_type_whitelist: ["image/*"],
365+
content_type_guess: true
365366
})
366367
.done(function(response) {
367368
if (!response.result) {
@@ -385,7 +386,7 @@ $(function() {
385386
}
386387

387388
var content = response.response.content;
388-
var contentType = response.response.content_type
389+
var contentType = response.response.assumed_content_type;
389390

390391
var mimeType = "image/jpeg";
391392
if (contentType) {
@@ -395,7 +396,7 @@ $(function() {
395396
var text = gettext("If you see your webcam snapshot picture below, the entered snapshot URL is ok.");
396397
showMessageDialog({
397398
title: gettext("Snapshot test"),
398-
message: $('<p>' + text + '</p><p><img src="data:' + mimeType + ';base64,' + content + '" /></p>'),
399+
message: $('<p>' + text + '</p><p><img src="data:' + mimeType + ';base64,' + content + '" style="border: 1px solid black" /></p>'),
399400
onclose: function() {
400401
self.testWebcamSnapshotUrlBusy(false);
401402
}

src/octoprint/util/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,10 @@ def server_reachable(host, port, timeout=3.05, proto="tcp", source=None):
867867
except:
868868
return False
869869

870+
def guess_mime_type(data):
871+
import filetype
872+
return filetype.guess_mime(data)
873+
870874
def parse_mime_type(mime):
871875
import cgi
872876

0 commit comments

Comments
 (0)