diff --git a/src/octoprint/server/api/settings.py b/src/octoprint/server/api/settings.py index 02880093..7351ade1 100644 --- a/src/octoprint/server/api/settings.py +++ b/src/octoprint/server/api/settings.py @@ -99,6 +99,7 @@ def getSettings(): "webcam": { "streamUrl": s.get(["webcam", "stream"]), "streamRatio": s.get(["webcam", "streamRatio"]), + "streamTimeout": s.getInt(["webcam", "streamTimeout"]), "snapshotUrl": s.get(["webcam", "snapshot"]), "ffmpegPath": s.get(["webcam", "ffmpeg"]), "bitrate": s.get(["webcam", "bitrate"]), @@ -306,6 +307,7 @@ def _saveSettings(data): if "webcam" in data.keys(): if "streamUrl" in data["webcam"]: s.set(["webcam", "stream"], data["webcam"]["streamUrl"]) if "streamRatio" in data["webcam"] and data["webcam"]["streamRatio"] in ("16:9", "4:3"): s.set(["webcam", "streamRatio"], data["webcam"]["streamRatio"]) + if "streamTimeout" in data["webcam"]: s.setInt(["webcam", "streamTimeout"], data["webcam"]["streamTimeout"]) if "snapshotUrl" in data["webcam"]: s.set(["webcam", "snapshot"], data["webcam"]["snapshotUrl"]) if "ffmpegPath" in data["webcam"]: s.set(["webcam", "ffmpeg"], data["webcam"]["ffmpegPath"]) if "bitrate" in data["webcam"]: s.set(["webcam", "bitrate"], data["webcam"]["bitrate"]) diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index 0b15fa3d..6412b7ec 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -157,6 +157,7 @@ default_settings = { "webcam": { "stream": None, "streamRatio": "16:9", + "streamTimeout": 5, "snapshot": None, "ffmpeg": None, "ffmpegThreads": 1, diff --git a/src/octoprint/static/js/app/viewmodels/control.js b/src/octoprint/static/js/app/viewmodels/control.js index ecf86eb7..0ba29acd 100644 --- a/src/octoprint/static/js/app/viewmodels/control.js +++ b/src/octoprint/static/js/app/viewmodels/control.js @@ -368,10 +368,12 @@ $(function() { return; } + var timeout = self.settings.webcam_streamTimeout() || 5; self.webcamDisableTimeout = setTimeout(function () { + log.debug("Unloading webcam stream"); $("#webcam_image").attr("src", ""); self.webcamLoaded(false); - }, 5000); + }, timeout * 1000); }; self._enableWebcam = function() { diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index 4b805ead..d15f42d0 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -113,6 +113,7 @@ $(function() { self.webcam_streamUrl = ko.observable(undefined); self.webcam_streamRatio = ko.observable(undefined); + self.webcam_streamTimeout = ko.observable(undefined); self.webcam_snapshotUrl = ko.observable(undefined); self.webcam_ffmpegPath = ko.observable(undefined); self.webcam_bitrate = ko.observable(undefined); diff --git a/src/octoprint/templates/dialogs/settings/webcam.jinja2 b/src/octoprint/templates/dialogs/settings/webcam.jinja2 index a1db65ab..60a846c9 100644 --- a/src/octoprint/templates/dialogs/settings/webcam.jinja2 +++ b/src/octoprint/templates/dialogs/settings/webcam.jinja2 @@ -4,6 +4,13 @@ {% include "snippets/settings/webcam/webcamStreamUrl.jinja2" %} {% include "snippets/settings/webcam/webcamStreamRatio.jinja2" %} {% include "snippets/settings/webcam/webcamOrientation.jinja2" %} + +