diff --git a/libs/monitor.js b/libs/monitor.js index f947f463..ed6ae653 100644 --- a/libs/monitor.js +++ b/libs/monitor.js @@ -491,42 +491,46 @@ module.exports = function(s,config,lang){ if(config.doSnapshot===true){ if(e.mon.mode!=='stop'){ var pathDir = s.dir.streams+e.ke+'/'+e.mid+'/' - if(fs.existsSync(pathDir+'s.jpg') === true){ - fs.readFile(pathDir+'s.jpg',function(err,data){ - if(err){s.tx({f:'monitor_snapshot',snapshot:e.mon.name,snapshot_format:'plc',mid:e.mid,ke:e.ke},'GRP_'+e.ke);return}; - s.tx({f:'monitor_snapshot',snapshot:data,snapshot_format:'ab',mid:e.mid,ke:e.ke},'GRP_'+e.ke) - }) - }else{ - e.url = s.buildMonitorUrl(e.mon) - switch(e.mon.type){ - case'mjpeg':case'h264':case'local': - if(e.mon.type==='local'){e.url=e.mon.path;} - s.getRawSnapshotFromMonitor(e.mon,'-s 200x200',function(data,isStaticFile){ - if((data[data.length-2] === 0xFF && data[data.length-1] === 0xD9)){ - if(!isStaticFile)fs.writeFile(s.dir.streams+e.ke+'/'+e.mid+'/s.jpg',data,function(){}) - s.tx({ - f:'monitor_snapshot', - snapshot:data.toString('base64'), - snapshot_format:'b64', - mid:e.mid, - ke:e.ke - },'GRP_'+e.ke) - }else{ - s.tx({f:'monitor_snapshot',snapshot:e.mon.name,snapshot_format:'plc',mid:e.mid,ke:e.ke},'GRP_'+e.ke) - } - }) - break; - case'jpeg': - request({url:e.url,method:'GET',encoding:null},function(err,data){ - if(err){s.tx({f:'monitor_snapshot',snapshot:e.mon.name,snapshot_format:'plc',mid:e.mid,ke:e.ke},'GRP_'+e.ke);return}; - s.tx({f:'monitor_snapshot',snapshot:data.body,snapshot_format:'ab',mid:e.mid,ke:e.ke},'GRP_'+e.ke) - }) - break; - default: - s.tx({f:'monitor_snapshot',snapshot:'...',snapshot_format:'plc',mid:e.mid,ke:e.ke},'GRP_'+e.ke) - break; + fs.stat(pathDir+'icon.jpg',function(err){ + if(!err){ + fs.readFile(pathDir+'icon.jpg',function(err,data){ + if(err){s.tx({f:'monitor_snapshot',snapshot:e.mon.name,snapshot_format:'plc',mid:e.mid,ke:e.ke},'GRP_'+e.ke);return}; + s.tx({f:'monitor_snapshot',snapshot:data,snapshot_format:'ab',mid:e.mid,ke:e.ke},'GRP_'+e.ke) + }) + }else{ + e.url = s.buildMonitorUrl(e.mon) + switch(e.mon.type){ + case'mjpeg':case'h264':case'local': + if(e.mon.type==='local'){e.url=e.mon.path;} + s.getRawSnapshotFromMonitor(e.mon,'-s 200x200',function(data,isStaticFile){ + if((data[data.length-2] === 0xFF && data[data.length-1] === 0xD9)){ + if(!isStaticFile){ + fs.writeFile(s.dir.streams+e.ke+'/'+e.mid+'/icon.jpg',data,function(){}) + } + s.tx({ + f:'monitor_snapshot', + snapshot:data.toString('base64'), + snapshot_format:'b64', + mid:e.mid, + ke:e.ke + },'GRP_'+e.ke) + }else{ + s.tx({f:'monitor_snapshot',snapshot:e.mon.name,snapshot_format:'plc',mid:e.mid,ke:e.ke},'GRP_'+e.ke) + } + }) + break; + case'jpeg': + request({url:e.url,method:'GET',encoding:null},function(err,data){ + if(err){s.tx({f:'monitor_snapshot',snapshot:e.mon.name,snapshot_format:'plc',mid:e.mid,ke:e.ke},'GRP_'+e.ke);return}; + s.tx({f:'monitor_snapshot',snapshot:data.body,snapshot_format:'ab',mid:e.mid,ke:e.ke},'GRP_'+e.ke) + }) + break; + default: + s.tx({f:'monitor_snapshot',snapshot:'...',snapshot_format:'plc',mid:e.mid,ke:e.ke},'GRP_'+e.ke) + break; + } } - } + }) }else{ s.tx({f:'monitor_snapshot',snapshot:'Disabled',snapshot_format:'plc',mid:e.mid,ke:e.ke},'GRP_'+e.ke) } diff --git a/libs/user.js b/libs/user.js index d9b8503a..1ed2e348 100644 --- a/libs/user.js +++ b/libs/user.js @@ -4,8 +4,83 @@ var spawn = require('child_process').spawn; var exec = require('child_process').exec; module.exports = function(s,config){ s.purgeDiskForGroup = function(e){ - if(s.group[e.ke].diskUsedEmitter){ - s.group[e.ke].diskUsedEmitter.emit('purge') + if(config.cron.deleteOverMax === true){ + s.group[e.ke].sizePurgeQueue.push(1) + if(s.group[e.ke].sizePurging !== true){ + s.group[e.ke].sizePurging = true + var finish = function(){ + //remove value just used from queue + s.group[e.ke].sizePurgeQueue.shift() + //do next one + if(s.group[e.ke].sizePurgeQueue.length > 0){ + checkQueue() + }else{ + s.group[e.ke].sizePurging=false + s.sendDiskUsedAmountToClients(e) + } + } + var checkQueue = function(){ + //get first in queue + var currentPurge = s.group[e.ke].sizePurgeQueue[0] + var deleteVideos = function(){ + //run purge command + if(s.group[e.ke].usedSpace > (s.group[e.ke].sizeLimit*config.cron.deleteOverMaxOffset)){ + s.sqlQuery('SELECT * FROM Videos WHERE status != 0 AND details NOT LIKE \'%"archived":"1"%\' AND ke=? ORDER BY `time` ASC LIMIT 3',[e.ke],function(err,videos){ + var videosToDelete = [] + var queryValues = [e.ke] + var completedCheck = 0 + if(videos){ + videos.forEach(function(video){ + video.dir = s.getVideoDirectory(video) + s.formattedTime(video.time) + '.' + video.ext + videosToDelete.push('(mid=? AND `time`=?)') + queryValues.push(video.mid) + queryValues.push(video.time) + fs.chmod(video.dir,0o777,function(err){ + fs.unlink(video.dir,function(err){ + ++completedCheck + if(err){ + fs.stat(video.dir,function(err){ + if(!err){ + s.file('delete',video.dir) + } + }) + } + if(videosToDelete.length === completedCheck){ + videosToDelete = videosToDelete.join(' OR ') + s.sqlQuery('DELETE FROM Videos WHERE ke =? AND ('+videosToDelete+')',queryValues,function(){ + deleteVideos() + }) + } + }) + }) + s.setDiskUsedForGroup(e,-(video.size/1000000)) + s.tx({ + f: 'video_delete', + ff: 'over_max', + filename: s.formattedTime(video.time)+'.'+video.ext, + mid: video.mid, + ke: video.ke, + time: video.time, + end: s.formattedTime(new Date,'YYYY-MM-DD HH:mm:ss') + },'GRP_'+e.ke) + }) + }else{ + console.log(err) + } + if(videosToDelete.length === 0){ + finish() + } + }) + }else{ + finish() + } + } + deleteVideos() + } + checkQueue() + } + }else{ + s.sendDiskUsedAmountToClients(e) } } s.setDiskUsedForGroup = function(e,bytes){ @@ -146,87 +221,10 @@ module.exports = function(s,config){ s.group[e.ke].usedSpace=0 } //change global size value - s.group[e.ke].usedSpace=s.group[e.ke].usedSpace+currentChange + s.group[e.ke].usedSpace += currentChange //remove value just used from queue s.sendDiskUsedAmountToClients(e) }) - s.group[e.ke].diskUsedEmitter.on('purge',function(){ - if(config.cron.deleteOverMax === true){ - s.group[e.ke].sizePurgeQueue.push(1) - if(s.group[e.ke].sizePurging !== true){ - s.group[e.ke].sizePurging = true - var finish = function(){ - //remove value just used from queue - s.group[e.ke].sizePurgeQueue.shift() - //do next one - if(s.group[e.ke].sizePurgeQueue.length > 0){ - checkQueue() - }else{ - s.group[e.ke].sizePurging=false - s.sendDiskUsedAmountToClients(e) - } - } - var checkQueue=function(){ - //get first in queue - var currentPurge = s.group[e.ke].sizePurgeQueue[0] - var deleteVideos = function(){ - //run purge command - if(s.group[e.ke].usedSpace > (s.group[e.ke].sizeLimit*config.cron.deleteOverMaxOffset)){ - s.sqlQuery('SELECT * FROM Videos WHERE status != 0 AND details NOT LIKE \'%"archived":"1"%\' AND ke=? ORDER BY `time` ASC LIMIT 2',[e.ke],function(err,videos){ - var videosToDelete = [] - var queryValues = [e.ke] - var completedCheck = 0 - if(!videos)return console.log(err) - videos.forEach(function(video){ - video.dir = s.getVideoDirectory(video) + s.formattedTime(video.time) + '.' + video.ext - videosToDelete.push('(mid=? AND `time`=?)') - queryValues.push(video.mid) - queryValues.push(video.time) - fs.chmod(video.dir,0o777,function(err){ - fs.unlink(video.dir,function(err){ - ++completedCheck - if(err){ - fs.stat(video.dir,function(err){ - if(!err){ - s.file('delete',video.dir) - } - }) - } - if(videosToDelete.length === completedCheck){ - videosToDelete = videosToDelete.join(' OR ') - s.sqlQuery('DELETE FROM Videos WHERE ke =? AND ('+videosToDelete+')',queryValues,function(){ - deleteVideos() - }) - } - }) - }) - s.setDiskUsedForGroup(e,-(video.size/1000000)) - s.tx({ - f: 'video_delete', - ff: 'over_max', - filename: s.formattedTime(video.time)+'.'+video.ext, - mid: video.mid, - ke: video.ke, - time: video.time, - end: s.formattedTime(new Date,'YYYY-MM-DD HH:mm:ss') - },'GRP_'+e.ke) - }) - if(videosToDelete.length === 0){ - finish() - } - }) - }else{ - finish() - } - } - deleteVideos() - } - checkQueue() - } - }else{ - s.sendDiskUsedAmountToClients(e) - } - }) } Object.keys(ar).forEach(function(v){ s.group[e.ke].init[v]=ar[v]