From 47817d72c502b81b7c0e942cfe5094f65536b598 Mon Sep 17 00:00:00 2001
From: Dermot Duffy <dermot.duffy@gmail.com>
Date: Mon, 6 Jun 2016 20:33:01 +0100
Subject: [PATCH] - Add minor comments.
---
motioneye/handlers.py | 10 +++++++---
motioneye/static/js/main.js | 6 ++++--
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/motioneye/handlers.py b/motioneye/handlers.py
index 1d6d17e..63b67fd 100644
--- a/motioneye/handlers.py
+++ b/motioneye/handlers.py
@@ -1381,7 +1381,7 @@ class MovieHandler(BaseHandler):
self.set_header('Content-Disposition', 'attachment; filename=' + pretty_filename + ';')
self.set_header("Content-Length", content_length)
-
+ # Yield the data to the network in chunks.
content = StaticFileHandler.get_content(full_path, start, end)
if content:
for chunk in content:
@@ -1397,8 +1397,12 @@ class MovieHandler(BaseHandler):
if error:
return self.finish_json({'error': 'Failed to download movie from %(url)s: %(msg)s.' % {
'url': remote.pretty_camera_url(camera_config), 'msg': error}})
-
- self.set_status(response.code)
+ # Copy certain critical headers out of the remote response and
+ # into our response. Propogating these headers are necessary to
+ # support in-brower playback of remote movies. Also copy the
+ # response code which might be 200 or 206 (partial content, for range
+ # requests).
+ self.set_status(response.code)
for header in ('Content-Type', 'Content-Range', 'Content-Length', 'Content-Disposition'):
if header in response.headers:
self.set_header(header, response.headers[header])
diff --git a/motioneye/static/js/main.js b/motioneye/static/js/main.js
index 3c1fa13..8c45c81 100644
--- a/motioneye/static/js/main.js
+++ b/motioneye/static/js/main.js
@@ -2950,6 +2950,8 @@ function runPictureDialog(entries, pos, mediaType) {
prevArrow.css('display', 'none');
nextArrow.css('display', 'none');
+ /* Construct a likely mime-type with 'video/' and the file extension, then see if the
+ browser can play it */
var playable = video_container.get(0).canPlayType('video/' + entry.path.split('.').pop()) != ''
playButton.hide();
video_container.hide();
@@ -2966,11 +2968,11 @@ function runPictureDialog(entries, pos, mediaType) {
playButton.on('click', function() {
video_source.attr('src', addAuthParams('GET', basePath + mediaType + '/' + entry.cameraId + '/download' + entry.path));
video_container.show();
- video_container.get(0).load();
+ video_container.get(0).load(); /* Must call load() after changing <video> source */
img.hide();
playButton.hide();
video_container.on('canplay', function() {
- video_container.get(0).play();
+ video_container.get(0).play(); /* Automatically play the video once the browser is ready */
});
});
--
2.39.5