diff --git a/languages/en_CA.json b/languages/en_CA.json
index 2687c8fc..36698da5 100644
--- a/languages/en_CA.json
+++ b/languages/en_CA.json
@@ -254,6 +254,9 @@
"Can Edit Monitor": "Can Edit Monitor",
"Can Delete Videos": "Can Delete Videos",
"Delete Video": "Delete Video",
+ "Delete Videos": "Delete Videos",
+ "Batch Download": "Batch Download",
+ "batchDownloadText": "Do you want to download the selected files?",
"Delete Timelapse Frame": "Delete Timelapse Frame",
"Can View Videos and Events": "Can View Videos and Events",
"Can Delete Videos and Events": "Can Delete Videos and Events",
@@ -483,6 +486,7 @@
"FixVideoMsg": "Do you want to fix this video? You cannot undo this action.",
"DeleteVideoMsg": "Do you want to delete this video? You cannot recover it.",
"DeleteThisMsg": "Do you want to delete this? You cannot recover it.",
+ "DeleteTheseMsg": "Do you want to delete these? You cannot recover them.",
"dropBoxSuccess": "Success! Files saved to your Dropbox.",
"API Key Deleted": "API Key Deleted",
"APIKeyDeletedText": "Key has been deleted. It will no longer work.",
diff --git a/web/assets/js/bs5.dashboard-base.js b/web/assets/js/bs5.dashboard-base.js
index f3860b06..f6c0aa9b 100644
--- a/web/assets/js/bs5.dashboard-base.js
+++ b/web/assets/js/bs5.dashboard-base.js
@@ -812,6 +812,12 @@ function downloadJSON(jsonData,filename){
.attr('download',filename)
[0].click()
}
+function downloadFile(downloadUrl,fileName){
+ var a = document.createElement('a')
+ a.href = downloadUrl
+ a.download = fileName
+ a.click()
+}
function convertKbToHumanSize(theNumber){
var amount = theNumber / 1048576
var unit = amount / 1000 >= 1000 ? 'TB' : amount >= 1000 ? 'GB' : 'MB'
diff --git a/web/assets/js/bs5.timelapseViewer.js b/web/assets/js/bs5.timelapseViewer.js
index 94d92074..25e652ea 100644
--- a/web/assets/js/bs5.timelapseViewer.js
+++ b/web/assets/js/bs5.timelapseViewer.js
@@ -254,10 +254,7 @@ $(document).ready(function(e){
}
function downloadTimelapseVideo(data){
var downloadUrl = buildFileBinUrl(data)
- var a = document.createElement('a')
- a.href = downloadUrl
- a.download = data.name
- a.click()
+ downloadFile(downloadUrl,data.name)
}
function onTimelapseVideoBuildComplete(data){
var saveBuiltVideo = dashboardOptions().switches.timelapseSaveBuiltVideo
diff --git a/web/assets/js/bs5.videos.js b/web/assets/js/bs5.videos.js
index 0dfd5ebf..97cec906 100644
--- a/web/assets/js/bs5.videos.js
+++ b/web/assets/js/bs5.videos.js
@@ -398,32 +398,35 @@ function loadVideoData(video){
loadedVideosInMemory[`${video.mid}${video.time}`] = video
}
function getVideos(options,callback){
- options = options ? options : {}
- var requestQueries = []
- var monitorId = options.monitorId
- var limit = options.limit || 300
- var eventStartTime
- var eventEndTime
- // var startDate = options.startDate
- // var endDate = options.endDate
- if(options.startDate){
- eventStartTime = formattedTimeForFilename(options.startDate,false)
- requestQueries.push(`start=${eventStartTime}`)
- }
- if(options.endDate){
- eventEndTime = formattedTimeForFilename(options.endDate,false)
- requestQueries.push(`end=${eventEndTime}`)
- }
- $.getJSON(`${getApiPrefix(`videos`)}${monitorId ? `/${monitorId}` : ''}?${requestQueries.concat([`noLimit=1`]).join('&')}`,function(data){
- var videos = data.videos
- $.getJSON(`${getApiPrefix(`timelapse`)}${monitorId ? `/${monitorId}` : ''}?${requestQueries.concat([`noLimit=1`]).join('&')}`,function(timelapseFrames){
- $.getJSON(`${getApiPrefix(`events`)}${monitorId ? `/${monitorId}` : ''}?${requestQueries.concat([`limit=${limit}`]).join('&')}`,function(eventData){
- var newVideos = applyDataListToVideos(videos,eventData)
- newVideos = applyTimelapseFramesListToVideos(newVideos,timelapseFrames,'timelapseFrames',true)
- $.each(newVideos,function(n,video){
- loadVideoData(video)
+ return new Promise((resolve,reject) => {
+ options = options ? options : {}
+ var requestQueries = []
+ var monitorId = options.monitorId
+ var limit = options.limit || 300
+ var eventStartTime
+ var eventEndTime
+ // var startDate = options.startDate
+ // var endDate = options.endDate
+ if(options.startDate){
+ eventStartTime = formattedTimeForFilename(options.startDate,false)
+ requestQueries.push(`start=${eventStartTime}`)
+ }
+ if(options.endDate){
+ eventEndTime = formattedTimeForFilename(options.endDate,false)
+ requestQueries.push(`end=${eventEndTime}`)
+ }
+ $.getJSON(`${getApiPrefix(`videos`)}${monitorId ? `/${monitorId}` : ''}?${requestQueries.concat([`noLimit=1`]).join('&')}`,function(data){
+ var videos = data.videos
+ $.getJSON(`${getApiPrefix(`timelapse`)}${monitorId ? `/${monitorId}` : ''}?${requestQueries.concat([`noLimit=1`]).join('&')}`,function(timelapseFrames){
+ $.getJSON(`${getApiPrefix(`events`)}${monitorId ? `/${monitorId}` : ''}?${requestQueries.concat([`limit=${limit}`]).join('&')}`,function(eventData){
+ var newVideos = applyDataListToVideos(videos,eventData)
+ newVideos = applyTimelapseFramesListToVideos(newVideos,timelapseFrames,'timelapseFrames',true)
+ $.each(newVideos,function(n,video){
+ loadVideoData(video)
+ })
+ if(callback)callback({videos: newVideos, frames: timelapseFrames});
+ resolve({videos: newVideos, frames: timelapseFrames})
})
- callback({videos: newVideos, frames: timelapseFrames})
})
})
})
@@ -452,6 +455,32 @@ function getEvents(options,callback){
callback(eventData)
})
}
+function deleteVideo(video,callback){
+ return new Promise((resolve,reject) => {
+ var videoEndpoint = getApiPrefix(`videos`) + '/' + video.mid + '/' + video.filename
+ console.log(videoEndpoint)
+ $.getJSON(videoEndpoint + '/delete',function(data){
+ if(callback)callback(data)
+ resolve(data)
+ })
+ })
+}
+async function deleteVideos(videos){
+ for (let i = 0; i < videos.length; i++) {
+ var video = videos[i];
+ await deleteVideo(video)
+ }
+}
+function downloadVideo(video){
+ var videoEndpoint = getApiPrefix(`videos`) + '/' + video.mid + '/' + video.filename
+ downloadFile(videoEndpoint,video.filename)
+}
+async function downloadVideos(videos){
+ for (let i = 0; i < videos.length; i++) {
+ var video = videos[i];
+ await downloadVideo(video)
+ }
+}
onWebSocketEvent(function(d){
switch(d.f){
case'video_delete':
@@ -490,14 +519,14 @@ $(document).ready(function(){
timeInward = timeInward < 0 ? 0 : timeInward
createVideoPlayerTab(video,timeInward)
})
- .on('click','.delete-video',function(){
+ .on('click','.delete-video',function(e){
+ e.preventDefault()
var el = $(this).parents('[data-mid]')
var monitorId = el.attr('data-mid')
var videoTime = el.attr('data-time')
var video = loadedVideosInMemory[`${monitorId}${videoTime}`]
var ext = video.filename.split('.')
ext = ext[ext.length - 1]
- var videoEndpoint = getApiPrefix(`videos`) + '/' + video.mid + '/' + video.filename
$.confirm.create({
title: lang["Delete Video"] + ' : ' + video.filename,
body: `${lang.DeleteVideoMsg}