diff options
| author | Pliable Pixels <pliablepixels@gmail.com> | 2020-10-04 19:14:42 -0400 |
|---|---|---|
| committer | Pliable Pixels <pliablepixels@gmail.com> | 2020-10-04 19:14:42 -0400 |
| commit | 05d6ccd17d8f5d592104bd7eff5661ab78dea110 (patch) | |
| tree | cb22951bbeedd24902482c20d6fb02f5f8d60b82 | |
| parent | c8c8699ead20677754b4c2912f72691558374f05 (diff) | |
switch to browser fetch to download media for desktops, use timestamped filenames - should also resolve #989
| -rw-r--r-- | www/js/EventCtrl.js | 54 | ||||
| -rw-r--r-- | www/js/EventModalCtrl.js | 106 | ||||
| -rw-r--r-- | www/js/MonitorModalCtrl.js | 52 | ||||
| -rw-r--r-- | www/lang/locale-en.json | 2 | ||||
| -rw-r--r-- | www/templates/events-modal.html | 6 | ||||
| -rw-r--r-- | www/templates/monitors-modal.html | 2 |
6 files changed, 144 insertions, 78 deletions
diff --git a/www/js/EventCtrl.js b/www/js/EventCtrl.js index a3f86425..3d4146af 100644 --- a/www/js/EventCtrl.js +++ b/www/js/EventCtrl.js @@ -723,13 +723,15 @@ angular.module('zmApp.controllers') } - function saveNow(imgsrc) { + function saveNow(imgsrc,eid) { + + NVR.debug ("saveNow in EventCtrl called with "+imgsrc+" and "+ eid); + var fname; + //var timestamp=moment().format('-MMM-Do-YY-HH-mm-ss'); - var fname = "zmninja.jpg"; var fn = "cordova.plugins.photoLibrary.saveImage"; var loginData = NVR.getLogin(); - - + fname = "zmNinja-eid-"+eid+".jpg"; $ionicLoading.show({ template: $translate.instant('kSavingSnapshot') + "...", noBackdrop: true, @@ -770,7 +772,7 @@ angular.module('zmApp.controllers') function (entry) { NVR.debug("local download complete: " + entry.toURL()); NVR.debug("Now trying to move it to album"); - var pluginName = (fname == "zmNinja.mp4" ? "saveVideo" : "saveImage"); + var pluginName = ((fname.indexOf('.mp4') != -1) ? "saveVideo" : "saveImage"); cordova.plugins.photoLibrary[pluginName](entry.toURL(), album, @@ -824,12 +826,39 @@ angular.module('zmApp.controllers') //desktop $ionicLoading.hide(); + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...", + noBackdrop: true + }); - $rootScope.zmPopup = SecuredPopups.show('alert', { - title: $translate.instant('kNote'), - template: $translate.instant('kDownloadVideoImage') + "<br/><br/><center><a href='" + url + "' class='button button-assertive icon ion-android-download' download>" + " " + $translate.instant('kDownload') + "</a></center>", - okText: $translate.instant('kDismiss'), - okType: 'button-stable' + fname = "zmninja-eid-"+eid+".jpg"; + fetch(url).then(function (resp) { + return resp.blob(); + }).then(function (blob) { + $ionicLoading.hide(); + var url = window.URL.createObjectURL(blob); + $rootScope.zmPopup = SecuredPopups.show('alert', { + title: $translate.instant('kNote'), + template: $translate.instant('kDownloadVideoImage') + "<br/><br/><center><a href='" + url + "' class='button button-assertive icon ion-android-download' download='"+fname+"'>" + " " + $translate.instant('kDownload') + "</a></center>", + okText: $translate.instant('kDismiss'), + okType: 'button-stable' + }); + + $rootScope.zmPopup.then (function (res) { + //console.log ('DONE RELEASE'); + NVR.debug ('download successful'); + window.URL.revokeObjectURL(url); + $ionicLoading.hide(); + + + }); + }).catch(function () { + $ionicLoading.hide(); + $ionicLoading.show({ + template: $translate.instant('kErrorSave'), + noBackdrop: true, + duration: 2000 + }); }); @@ -1080,7 +1109,7 @@ angular.module('zmApp.controllers') }; $scope.showImage = function (p, f, fid, e, imode, id, parray, ndx) { - var img; + var eid = e; // console.log ("P="+p+" F="+f+" E="+e+" imode="+imode+" id="+id+" parray="+JSON.stringify(parray)+" ndx="+ndx); @@ -1140,7 +1169,7 @@ angular.module('zmApp.controllers') type: 'button-assertive button-small ion-camera', onTap: function (e) { e.preventDefault(); - saveNow($scope.imgsrc); + saveNow($scope.imgsrc,eid); } }, @@ -3193,6 +3222,7 @@ angular.module('zmApp.controllers') if (now - loadMoreTime > 1500) { NVR.debug("$scope.loadMore > loadMore() ... delta: " + (now - loadMoreTime)); loadMore(); + loadMoreTime = Date.now(); $scope.$broadcast('scroll.infiniteScrollComplete'); } else { diff --git a/www/js/EventModalCtrl.js b/www/js/EventModalCtrl.js index a6dd87e8..20d24531 100644 --- a/www/js/EventModalCtrl.js +++ b/www/js/EventModalCtrl.js @@ -544,10 +544,10 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro }; - $scope.saveEventVideoToPhoneWithPerms = function () { + $scope.saveEventVideoWithPerms = function (eid) { if ($rootScope.platformOS != 'android') { - saveNow(); + saveEvent("video", eid); return; } @@ -563,7 +563,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro } function succ(s) { - saveNow(); + saveEvent("video", eid); } function err(e) { @@ -577,10 +577,10 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro // Saves a snapshot of the monitor image to phone storage //----------------------------------------------------------------------- - $scope.saveEventImageToPhoneWithPerms = function (onlyAlarms) { + $scope.saveEventImageWithPerms = function (onlyAlarms,eid) { if ($rootScope.platformOS != 'android') { - processSaveEventImageToPhone(onlyAlarms); + saveEventImage(onlyAlarms, eid); return; } @@ -597,7 +597,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro } function succ(s) { - processSaveEventImageToPhone(onlyAlarms); + saveEventImage(onlyAlarms, eid); } function err(e) { @@ -605,32 +605,18 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro } }; - function processSaveEventImageToPhone(onlyAlarms) { - - + function saveEventImage(onlyAlarms, eid) { if ($scope.isSnapShot()) { - - $scope.selectEventUrl = $scope.constructStream(); NVR.debug("just saving current snapshot:" + $scope.selectEventUrl); - saveNow("image"); - return; - - } - - if ($scope.loginData.useNphZmsForEvents) { - NVR.log("Use ZMS stream to save to phone"); - - saveEventImageToPhoneZms(onlyAlarms); - + saveEvent("image", eid); } else { - saveEventImageToPhone(onlyAlarms); + selectFrameAndSave(onlyAlarms,eid); } - } - function saveEventImageToPhoneZms(onlyAlarms) { + function selectFrameAndSave(onlyAlarms, eid) { // The strategy here is to build the array now so we can grab frames // $scope.currentProgress.progress is the seconds where we are // $scope.eventId is the event Id @@ -645,7 +631,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro sendCommand('1', $scope.connKey). then(function (resp) { - console.log("PAUSE ANSWER IS " + JSON.stringify(resp)); + // console.log("PAUSE ANSWER IS " + JSON.stringify(resp)); if (resp && resp.data && resp.data.status) $scope.currentProgress.progress = resp.data.status.progress; @@ -735,7 +721,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro //console.log ("I PUSHED:" + p+" BUT SLIDE LENGHT BEFORE DISPLAY:"+$scope.slides.length); // console.log ("STEP 2 : calling Save Event To Phone"); $ionicLoading.hide(); - saveEventImageToPhone(onlyAlarms); + saveEventImageToPhone(onlyAlarms, eid); }, function (err) { @@ -760,8 +746,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro } // don't think this is used anymore - function saveEventImageToPhone(onlyAlarms) { - // console.log ("________________UNUSED?_______________________"); + function saveEventImageToPhone(onlyAlarms, eid) { var curState = carouselUtils.getStop(); carouselUtils.setStop(true); var url; @@ -772,7 +757,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro - NVR.debug("ModalCtrl: SaveEventImageToPhone called"); + NVR.debug("EventModalCtrl: SaveEventImageToPhone called"); var canvas, context, imageDataUrl, imageData; var loginData = NVR.getLogin(); @@ -780,12 +765,6 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro if (onlyAlarms || ($scope.defaultVideo !== undefined && $scope.defaultVideo != '')) $scope.mycarousel.index = 1; - - - - console.log("SLIDES " + JSON.stringify($scope.slides)); - console.log("CAROUSEL " + JSON.stringify($scope.mycarousel)); - url = $scope.playbackURL + '/index.php?view=image&rand=' + $rootScope.rand + "&eid=" + $scope.eventId + "&fid=" + $scope.slides[$scope.mycarousel.index - 1].id + $rootScope.authSession; @@ -908,7 +887,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro text: '', type: 'button-positive button-small ion-checkmark-round', onTap: function (e) { - saveNow("image"); + saveEvent("image",eid); } } @@ -919,9 +898,10 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro } - function saveNow(t) { + function saveEvent(t,eid) { - var fname = "zmninja.jpg"; + NVR.debug ("saveEvent in EventModalCtrl called with "+t+" and "+ eid); + var fname; var fn = "cordova.plugins.photoLibrary.saveImage"; var loginData = NVR.getLogin(); @@ -933,17 +913,17 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro if ($scope.defaultVideo !== undefined && $scope.defaultVideo != '' && t != "image") { $scope.selectEventUrl = $scope.video_url; - fname = "zmNinja.mp4"; + fname = "zmNinja-eid-"+eid+".mp4"; fn = "cordova.plugins.photoLibrary.saveVideo"; - - + } else { + fname = "zmNinja-eid-"+eid+".jpg"; } NVR.debug("-->Going to try and download " + $scope.selectEventUrl); var url = $scope.selectEventUrl; - NVR.log(">>saveNow: File path to grab is " + url); + NVR.log(">>saveEvent: File path to grab is " + url); if ($rootScope.platformOS != 'desktop') { @@ -977,7 +957,7 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro function (entry) { NVR.debug("local download complete: " + entry.toURL()); NVR.debug("Now trying to move it to album"); - var pluginName = (fname == "zmNinja.mp4" ? "saveVideo" : "saveImage"); + var pluginName = ((fname.indexOf('.mp4') != -1) ? "saveVideo" : "saveImage"); cordova.plugins.photoLibrary[pluginName](entry.toURL(), album, @@ -1031,14 +1011,42 @@ angular.module('zmApp.controllers').controller('EventModalCtrl', ['$scope', '$ro //desktop $ionicLoading.hide(); - - $rootScope.zmPopup = SecuredPopups.show('alert', { - title: $translate.instant('kNote'), - template: $translate.instant('kDownloadVideoImage') + "<br/><br/><center><a href='" + url + "' class='button button-assertive icon ion-android-download' download>" + " " + $translate.instant('kDownload') + "</a></center>", - okText: $translate.instant('kDismiss'), - okType: 'button-stable' + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...", + noBackdrop: true }); + fetch(url).then(function (resp) { + return resp.blob(); + }).then(function (blob) { + $ionicLoading.hide(); + + // console.log (blob); + var url = window.URL.createObjectURL(blob); + $rootScope.zmPopup = SecuredPopups.show('alert', { + title: $translate.instant('kNote'), + template: $translate.instant('kDownloadVideoImage') + "<br/><br/><center><a href='" + url + "' class='button button-assertive icon ion-android-download' download='"+fname+"'>" + " " + $translate.instant('kDownload') + "</a></center>", + okText: $translate.instant('kDismiss'), + okType: 'button-stable' + }); + + $rootScope.zmPopup.then (function (res) { + //console.log ('DONE RELEASE'); + NVR.debug ('download successful'); + window.URL.revokeObjectURL(url); + $ionicLoading.hide(); + + + }); + }).catch(function () { + $ionicLoading.hide(); + $ionicLoading.show({ + template: $translate.instant('kErrorSave'), + noBackdrop: true, + duration: 2000 + }); + }); + } diff --git a/www/js/MonitorModalCtrl.js b/www/js/MonitorModalCtrl.js index 4b58de4f..b9812a67 100644 --- a/www/js/MonitorModalCtrl.js +++ b/www/js/MonitorModalCtrl.js @@ -1181,9 +1181,9 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ // Saves a snapshot of the monitor image to phone storage //----------------------------------------------------------------------- - $scope.saveImageToPhoneWithPerms = function (mid) { + $scope.saveLiveImageToPhoneWithPerms = function (mid) { if ($rootScope.platformOS != 'android') { - saveImageToPhone(mid); + saveLiveImageToPhone(mid); return; } @@ -1199,7 +1199,7 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ } function succ(s) { - saveImageToPhone(mid); + saveLiveImageToPhone(mid); } function err(e) { @@ -1207,14 +1207,14 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ } }; - function saveImageToPhone(mid) { + function saveLiveImageToPhone(mid) { $ionicLoading.show({ template: $translate.instant('kSavingSnapshot') + '...', noBackdrop: true, duration: zm.httpTimeout }); - NVR.debug("ModalCtrl: SaveImageToPhone called"); + NVR.debug("ModalCtrl: SaveLiveImageToPhone called"); var canvas, context, imageDataUrl, imageData; var loginData = NVR.getLogin(); var url = loginData.streamingurl + @@ -1235,8 +1235,9 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ var fileTransfer = new FileTransfer(); var urle = encodeURI(url); - var fname = "zmninja.jpg"; - + var timestamp=moment().format('MMM-Do-YY-HH-mm-ss'); + var fname = "zmninja-mid-"+mid+'-'+timestamp+".jpg"; + fileTransfer.download(urle, cordova.file.dataDirectory + fname, function (entry) { NVR.debug("local download complete: " + entry.toURL()); @@ -1289,13 +1290,40 @@ angular.module('zmApp.controllers').controller('MonitorModalCtrl', ['$scope', '$ $ionicLoading.hide(); //SaveSuccess(); - $rootScope.zmPopup = SecuredPopups.show('alert', { - title: $translate.instant('kNote'), - template: $translate.instant('kDownloadVideoImage') + "<br/><br/><center><a href='" + url + "' class='button button-assertive icon ion-android-download' download=\"balls.jpg\">" + " " + $translate.instant('kDownload') + "</a></center>", - okText: $translate.instant('kDismiss'), - okType: 'button-stable' + $ionicLoading.show({ + template: $translate.instant('kPleaseWait') + "...", + noBackdrop: true }); + var timestamp=moment().format('MMM-Do-YY-HH-mm-ss'); + var fname = "zmninja-mid-"+mid+'-'+timestamp+".jpg"; + fetch(url).then(function (resp) { + return resp.blob(); + }).then(function (blob) { + console.log (blob); + var url = window.URL.createObjectURL(blob); + $rootScope.zmPopup = SecuredPopups.show('alert', { + title: $translate.instant('kNote'), + template: $translate.instant('kDownloadVideoImage') + "<br/><br/><center><a href='" + url + "' class='button button-assertive icon ion-android-download' download='"+fname+"'>" + " " + $translate.instant('kDownload') + "</a></center>", + okText: $translate.instant('kDismiss'), + okType: 'button-stable' + }); + + $rootScope.zmPopup.then (function (res) { + //console.log ('DONE RELEASE'); + NVR.debug ('download successful'); + $ionicLoading.hide(); + window.URL.revokeObjectURL(url); + }); + }).catch(function () { + $ionicLoading.hide(); + $ionicLoading.show({ + template: $translate.instant('kErrorSave'), + noBackdrop: true, + duration: 2000 + }); + }); + } } diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json index e23d44a8..6dcf1e53 100644 --- a/www/lang/locale-en.json +++ b/www/lang/locale-en.json @@ -80,7 +80,7 @@ "kDismiss" :"Dismiss", "kDone" :"done", "kDownload" :"Download", - "kDownloadVideoImage" :"Tap the button below to download. If you are downloading a video, there is no progress indication, so please monitor file size", + "kDownloadVideoImage" :"Tap button to save media", "kEmailNotConfigured" :"Email not configured", "kEnable24hr" :"enable 24hr time format", "kEnableDebug" :"Enable debug logs", diff --git a/www/templates/events-modal.html b/www/templates/events-modal.html index 24df4b1e..de0f74c9 100644 --- a/www/templates/events-modal.html +++ b/www/templates/events-modal.html @@ -201,7 +201,7 @@ <i class="ion-ios-loop-strong"></i>-{{loginData.gapless? ('kOn' | translate): ('kOff' | translate)}}</a> </li> <li ng-if="isToggleListMenu"> - <a href="" ng-click="saveEventImageToPhoneWithPerms(false, 'any')"> + <a href="" ng-click="saveEventImageWithPerms(false, currentEvent.Event.Id)"> <i class="ion-camera"></i> </a> </li> @@ -209,14 +209,14 @@ <li ng-if="isToggleListMenu && defaultVideo !='' && defaultVideo != undefined"> - <a href="" ng-click="saveEventVideoToPhoneWithPerms()"> + <a href="" ng-click="saveEventVideoWithPerms(currentEvent.Event.Id)"> <i class="ion-android-download"></i> </a> </li> <li ng-if="defaultVideo=='' && isToggleListMenu"> - <a href="" ng-click="saveEventImageToPhoneWithPerms(true)"> + <a href="" ng-click="saveEventImageWithPerms(true, currentEvent.Event.Id)"> <i class="ion-android-notifications"></i> </a> </li> diff --git a/www/templates/monitors-modal.html b/www/templates/monitors-modal.html index 84c9049a..0da43cfd 100644 --- a/www/templates/monitors-modal.html +++ b/www/templates/monitors-modal.html @@ -98,7 +98,7 @@ </li> <li ng-if="isToggleListMenu"> - <a id='testaut_monitormodal_camera_button' href="" ng-click="saveImageToPhoneWithPerms(monitorId)"> + <a id='testaut_monitormodal_camera_button' href="" ng-click="saveLiveImageToPhoneWithPerms(monitorId)"> <i class="icon ion-ios-camera"></i> </a> </li> |
