diff --git a/app/scripts/controllers/Recordings.js b/app/scripts/controllers/Recordings.js index 04ae1ea..094de74 100644 --- a/app/scripts/controllers/Recordings.js +++ b/app/scripts/controllers/Recordings.js @@ -7,7 +7,7 @@ * # MainCtrl * Controller of Lineblocs */ -angular.module('Lineblocs').controller('RecordingsCtrl', function ($scope, Backend, pagination, $location, $state, $mdDialog, $sce, $shared, $q, $mdToast, $stateParams) { +angular.module('Lineblocs').controller('RecordingsCtrl', function ($scope, Backend, pagination, $location, $state, $mdDialog, $sce, $shared, $q, $mdToast, $stateParams, $http) { $shared.updateTitle("Recordings"); $scope.settings = { page: 0 @@ -93,6 +93,80 @@ angular.module('Lineblocs').controller('RecordingsCtrl', function ($scope, Backe }); } + function parseFilenameFromDisposition(contentDisposition) { + if (!contentDisposition) { + return null; + } + var encodedMatch = /filename\*=UTF-8''([^;]+)/i.exec(contentDisposition); + if (encodedMatch && encodedMatch[1]) { + return decodeURIComponent(encodedMatch[1]); + } + var plainMatch = /filename="?([^";]+)"?/i.exec(contentDisposition); + return plainMatch && plainMatch[1] ? plainMatch[1] : null; + } + + function triggerDownloadFromResponse(res, defaultFileName) { + var contentType = res.headers('Content-Type') || 'application/octet-stream'; + var contentDisposition = res.headers('Content-Disposition') || ''; + var fileName = parseFilenameFromDisposition(contentDisposition) || defaultFileName; + var blob = new Blob([res.data], { type: contentType }); + var url = window.URL.createObjectURL(blob); + var link = document.createElement('a'); + link.href = url; + link.download = fileName; + document.body.appendChild(link); + link.click(); + link.remove(); + window.URL.revokeObjectURL(url); + } + + $scope.downloadRecording = function(recording) { + if (!recording || !recording.id) { + return; + } + $shared.isLoading = true; + $http.post( + createUrl('/recording/downloadRecordings'), + { recording_ids: recording.id }, + { responseType: 'blob' } + ).then(function(res) { + triggerDownloadFromResponse(res, 'recording-' + recording.id + '.wav'); + }).catch(function() { + $shared.showError('Unable to download recording. Please try again.'); + }).finally(function() { + $shared.endIsLoading(); + }); + }; + + $scope.downloadAllRecordings = function() { + var checked = ($scope.recordings || []).filter(function(recording) { + return recording && recording.checked; + }); + var ids = checked.map(function(recording) { + return recording && recording.id; + }).filter(function(id) { + return !!id; + }); + + if (!ids.length) { + $shared.showError('Please select one or more recordings to download.'); + return; + } + + $shared.isLoading = true; + $http.post( + createUrl('/recording/downloadRecordings'), + { recording_ids: ids.join(',') }, + { responseType: 'blob' } + ).then(function(res) { + triggerDownloadFromResponse(res, 'recordings.zip'); + }).catch(function() { + $shared.showError('Unable to download recordings. Please try again.'); + }).finally(function() { + $shared.endIsLoading(); + }); + }; + $scope.load(); }); diff --git a/app/views/pages/recordings.html b/app/views/pages/recordings.html index 10fbe89..febfdde 100644 --- a/app/views/pages/recordings.html +++ b/app/views/pages/recordings.html @@ -71,14 +71,14 @@
No recordings listed
-
-
+
+
@@ -93,10 +93,14 @@
No recordings listed
- - - Delete All - + + + Download All + + + + Delete All +
@@ -147,6 +151,14 @@
No recordings found
+ + + + + Download recording + + +