add row caching and add delete button for timelapse frames

fix-non-showing-inputs
Moe Alam 2020-10-09 22:49:11 -07:00
parent 76b9d7f105
commit 560cf2c7ec
4 changed files with 123 additions and 33 deletions

View File

@ -2,6 +2,8 @@ var fs = require('fs')
var moment = require('moment')
var express = require('express')
module.exports = function(s,config,lang,app,io){
const timelapseFramesCache = {}
const timelapseFramesCacheTimeouts = {}
s.getTimelapseFrameDirectory = function(e){
if(e.mid&&!e.id){e.id=e.mid}
s.checkDetails(e)
@ -131,6 +133,37 @@ module.exports = function(s,config,lang,app,io){
})
}else{
// console.log('Delete Failed',e)
// console.error(err)
}
})
}
const deleteTimelapseFrame = function(e){
// e = video object
s.checkDetails(e)
var frameSelector = {
ke: e.ke,
mid: e.mid,
filename: e.filename,
}
s.knexQuery({
action: "select",
columns: "*",
table: "Timelapse Frames",
where: frameSelector,
limit: 1
},function(err,r){
if(r && r[0]){
r = r[0]
s.knexQuery({
action: "delete",
table: "Timelapse Frames",
where: frameSelector,
limit: 1
},function(){
s.file('delete',e.fileLocation)
})
}else{
// console.log('Delete Failed',e)
// console.error(err)
}
})
@ -267,6 +300,7 @@ module.exports = function(s,config,lang,app,io){
*/
app.get([
config.webPaths.apiPrefix+':auth/timelapse/:ke/:id/:date/:filename',
config.webPaths.apiPrefix+':auth/timelapse/:ke/:id/:date/:filename/:action',
], function (req,res){
res.setHeader('Content-Type', 'application/json');
s.auth(req.params,function(user){
@ -279,41 +313,64 @@ module.exports = function(s,config,lang,app,io){
return
}
const monitorRestrictions = s.getMonitorRestrictions(user.details,req.params.id)
s.getDatabaseRows({
monitorRestrictions: monitorRestrictions,
table: 'Timelapse Frames',
groupKey: req.params.ke,
archived: req.query.archived,
filename: req.params.filename,
rowType: 'frames',
endIsStartTo: true
},(response) => {
var frame = response.frames[0]
if(frame){
var fileLocation
if(frame.details.dir){
fileLocation = `${s.checkCorrectPathEnding(frame.details.dir)}`
}else{
fileLocation = `${s.dir.videos}`
}
var selectedDate = req.params.date
if(selectedDate.indexOf('-') === -1){
selectedDate = req.params.filename.split('T')[0]
}
fileLocation = `${fileLocation}${frame.ke}/${frame.mid}_timelapse/${selectedDate}/${req.params.filename}`
fs.stat(fileLocation,function(err,stats){
if(!err){
const cacheKey = req.params.ke + req.params.id + req.params.filename
const processFrame = (frame) => {
var fileLocation
if(frame.details.dir){
fileLocation = `${s.checkCorrectPathEnding(frame.details.dir)}`
}else{
fileLocation = `${s.dir.videos}`
}
var selectedDate = req.params.date
if(selectedDate.indexOf('-') === -1){
selectedDate = req.params.filename.split('T')[0]
}
fileLocation = `${fileLocation}${frame.ke}/${frame.mid}_timelapse/${selectedDate}/${req.params.filename}`
fs.stat(fileLocation,function(err,stats){
if(!err){
if(req.params.action === 'delete'){
deleteTimelapseFrame({
ke: frame.ke,
mid: frame.mid,
filename: req.params.filename,
fileLocation: fileLocation,
})
delete(timelapseFramesCache[cacheKey])
s.closeJsonResponse(res,{ok: true})
}else{
res.contentType('image/jpeg')
res.on('finish',function(){res.end()})
fs.createReadStream(fileLocation).pipe(res)
}else{
s.closeJsonResponse(res,{ok: false, msg: lang[`Nothing exists`]})
}
})
}else{
s.closeJsonResponse(res,{ok: false, msg: lang[`Nothing exists`]})
}
})
}else{
s.closeJsonResponse(res,{ok: false, msg: lang[`Nothing exists`]})
}
})
}
if(timelapseFramesCache[cacheKey]){
processFrame(timelapseFramesCache[cacheKey])
}else{
s.getDatabaseRows({
monitorRestrictions: monitorRestrictions,
table: 'Timelapse Frames',
groupKey: req.params.ke,
archived: req.query.archived,
filename: req.params.filename,
rowType: 'frames',
endIsStartTo: true
},(response) => {
var frame = response.frames[0]
if(frame){
timelapseFramesCache[cacheKey] = frame
timelapseFramesCacheTimeouts[cacheKey] = setTimeout(function(){
delete(timelapseFramesCache[cacheKey])
},1000 * 60 * 10)
processFrame(frame)
}else{
s.closeJsonResponse(res,{ok: false, msg: lang[`Nothing exists`]})
}
})
}
},res,req);
});
/**

View File

@ -543,6 +543,7 @@ module.exports = function(s,config,lang){
fs.unlink(commandTempLocation,function(){
})
s.purgeDiskForGroup(ke)
setTimeout(() => {
delete(s.group[ke].activeMonitors[mid].buildingTimelapseVideo)
},5000)

View File

@ -38,7 +38,8 @@
position: relative;
cursor: pointer;
}
#timelapsejpeg .frameIcons .frame .shade{
#timelapsejpeg .frameIcons .frame .shade,
#timelapsejpeg .frameIcons .button-strip{
position: absolute;
bottom: 0;
left: 0;
@ -48,6 +49,16 @@
background: rgba(0,0,0,0.6);
color: #fff
}
#timelapsejpeg .frameIcons .button-strip{
top: 0;
bottom: auto;
opacity: 0;
transition: 0.2;
text-align: right;
}
#timelapsejpeg .frameIcons .frame:hover .button-strip{
opacity: 1;
}
#timelapsejpeg .playBackView{
position:absolute;
height: 50%;

View File

@ -82,7 +82,7 @@ $(document).ready(function(e){
$.each(data.reverse(),function(n,fileInfo){
fileInfo.href = apiURL + '/' + fileInfo.filename.split('T')[0] + '/' + fileInfo.filename
fileInfo.number = n
frameIconsHtml += '<div class="col-md-4"><div class="frame" data-filename="' + fileInfo.filename + '" style="background-image:url(\'' + fileInfo.href + '\')"><div class="shade">' + moment(fileInfo.time).format('YYYY-MM-DD HH:mm:ss') + '</div></div></div>'
frameIconsHtml += '<div class="col-md-4 frame-container"><div class="frame" data-filename="' + fileInfo.filename + '" style="background-image:url(\'' + fileInfo.href + '\')"><div class="button-strip"><button type="button" class="btn btn-sm btn-danger delete"><i class="fa fa-trash-o"></i></button></div><div class="shade">' + moment(fileInfo.time).format('YYYY-MM-DD HH:mm:ss') + '</div></div></div>'
currentPlaylist[fileInfo.filename] = fileInfo
})
currentPlaylistArray = data
@ -179,6 +179,27 @@ $(document).ready(function(e){
timelapseWindow.on('click','.playPause',function(){
togglePlayPause()
})
timelapseWindow.on('click','.frame .delete',function(e){
e.stopPropagation()
var el = $(this).parents('.frame')
var filename = el.attr('data-filename')
var frame = currentPlaylist[filename]
$.confirm.create({
title: `sdf`,
body: `sdf`,
clickOptions: {
class: 'btn-danger',
title: lang.Delete,
},
clickCallback: function(){
$.get(frame.href + '/delete',function(response){
if(response.ok){
el.parent().remove()
}
})
}
})
})
timelapseWindow.on('click','.download_mp4',function(){
if(downloaderIsChecking){
allowKeepChecking = false