From b8bb4d1a697b58200c99512dff63b76707f34270 Mon Sep 17 00:00:00 2001 From: Moe Date: Mon, 28 Oct 2019 13:38:48 -0700 Subject: [PATCH] fix circular json bug and add some async methods --- libs/webServerPaths.js | 426 +++++++++++++++++------------------ libs/webServerStreamPaths.js | 2 +- 2 files changed, 214 insertions(+), 214 deletions(-) diff --git a/libs/webServerPaths.js b/libs/webServerPaths.js index 3db6d75..ad68c04 100644 --- a/libs/webServerPaths.js +++ b/libs/webServerPaths.js @@ -1419,218 +1419,218 @@ module.exports = function(s,config,lang,app,io){ } },res,req); }); - /** - * API : Zip Videos and Get Link from fileBin - */ - app.get(config.webPaths.apiPrefix+':auth/zipVideos/:ke', function (req,res){ - var failed = function(resp){ - res.setHeader('Content-Type', 'application/json'); - res.end(s.prettyPrint(resp)) - } - if(req.query.videos && req.query.videos !== ''){ - s.auth(req.params,function(user){ - var videosSelected = JSON.parse(req.query.videos) - var where = [] - var values = [] - videosSelected.forEach(function(video){ - where.push("(ke=? AND mid=? AND `time`=?)") - if(!video.ke)video.ke = req.params.ke - values.push(video.ke) - values.push(video.mid) - var time = s.nameToTime(video.filename) - if(req.query.isUTC === 'true'){ - time = s.utcToLocal(time) - } - time = new Date(time) - values.push(time) - }) - s.sqlQuery('SELECT * FROM Videos WHERE '+where.join(' OR '),values,function(err,r){ - var resp = {ok: false} - if(r && r[0]){ - resp.ok = true - var zipDownload = null - var tempFiles = [] - var fileId = s.gid() - var fileBinDir = s.dir.fileBin+req.params.ke+'/' - var tempScript = s.dir.streams+req.params.ke+'/'+fileId+'.sh' - var zippedFilename = s.formattedTime()+'-'+fileId+'-Shinobi_Recordings.zip' - var zippedFile = fileBinDir+zippedFilename - var script = 'cd '+fileBinDir+' && zip -9 -r '+zippedFile - res.on('close', () => { - if(zipDownload && zipDownload.destroy){ - zipDownload.destroy() - } - fs.unlink(zippedFile); - }) - fs.mkdir(fileBinDir,function(err){ - s.handleFolderError(err) - r.forEach(function(video){ - var timeFormatted = s.formattedTime(video.time) - video.filename = timeFormatted+'.'+video.ext - var dir = s.getVideoDirectory(video)+video.filename - var tempVideoFile = timeFormatted+' - '+video.mid+'.'+video.ext - fs.writeFileSync(fileBinDir+tempVideoFile, fs.readFileSync(dir)) - tempFiles.push(fileBinDir+tempVideoFile) - script += ' "'+tempVideoFile+'"' - }) - fs.writeFileSync(tempScript,script,'utf8') - var zipCreate = spawn('sh',(tempScript).split(' '),{detached: true}) - zipCreate.stderr.on('data',function(data){ - s.userLog({ke:req.params.ke,mid:'$USER'},{title:'Zip Create Error',msg:data.toString()}) - }) - zipCreate.on('exit',function(data){ - fs.unlinkSync(tempScript) - tempFiles.forEach(function(file){ - fs.unlink(file,function(){}) - }) - res.setHeader('Content-Disposition', 'attachment; filename="'+zippedFilename+'"') - var zipDownload = fs.createReadStream(zippedFile) - zipDownload.pipe(res) - zipDownload.on('error', function (error) { - var errorString = error.toString() - s.userLog({ - ke: req.params.ke, - mid: '$USER' - },{ - title: 'Zip Download Error', - msg: errorString - }) - if(zipDownload && zipDownload.destroy){ - zipDownload.destroy() - } - res.end(s.prettyPrint({ - ok: false, - msg: errorString - })) - }) - zipDownload.on('close', function () { - res.end() - zipDownload.destroy() - fs.unlinkSync(zippedFile) - }) - }) - }) - }else{ - failed({ok:false,msg:'No Videos Found'}) - } - }) - },res,req); - }else{ - failed({ok:false,msg:'"videos" query variable is missing from request.'}) - } - }) - /** - * API : Zip Cloud Videos and Get Link from fileBin - */ - app.get(config.webPaths.apiPrefix+':auth/zipCloudVideos/:ke', function (req,res){ - var failed = function(resp){ - res.setHeader('Content-Type', 'application/json'); - res.end(s.prettyPrint(resp)) - } - if(req.query.videos && req.query.videos !== ''){ - s.auth(req.params,function(user){ - var videosSelected = JSON.parse(req.query.videos) - var where = [] - var values = [] - videosSelected.forEach(function(video){ - where.push("(ke=? AND mid=? AND `time`=?)") - if(!video.ke)video.ke = req.params.ke - values.push(video.ke) - values.push(video.mid) - var time = s.nameToTime(video.filename) - if(req.query.isUTC === 'true'){ - time = s.utcToLocal(time) - } - time = new Date(time) - values.push(time) - }) - s.sqlQuery('SELECT * FROM `Cloud Videos` WHERE '+where.join(' OR '),values,function(err,r){ - var resp = {ok: false} - if(r && r[0]){ - resp.ok = true - var zipDownload = null - var tempFiles = [] - var fileId = s.gid() - var fileBinDir = s.dir.fileBin+req.params.ke+'/' - var tempScript = s.dir.streams+req.params.ke+'/'+fileId+'.sh' - var zippedFilename = s.formattedTime()+'-'+fileId+'-Shinobi_Cloud_Backed_Recordings.zip' - var zippedFile = fileBinDir+zippedFilename - var script = 'cd '+fileBinDir+' && zip -9 -r '+zippedFile - res.on('close', () => { - if(zipDownload && zipDownload.destroy){ - zipDownload.destroy() - } - fs.unlink(zippedFile); - }) - fs.mkdir(fileBinDir,function(err){ - var cloudDownloadCount = 0 - var getFile = function(video,completed){ - if(!video)completed(); - s.checkDetails(video) - var filename = video.href.split('/') - filename = filename[filename.length - 1] - var timeFormatted = s.formattedTime(video.time) - var tempVideoFile = video.details.type + '-' + video.mid + '-' + filename - var tempFileWriteStream = fs.createWriteStream(fileBinDir+tempVideoFile) - tempFileWriteStream.on('finish', function() { - ++cloudDownloadCount - getFile(r[cloudDownloadCount],completed) - }) - var cloudVideoDownload = request(video.href) - cloudVideoDownload.on('response', function (res) { - res.pipe(tempFileWriteStream) - }) - tempFiles.push(fileBinDir+tempVideoFile) - script += ' "'+tempVideoFile+'"' - } - getFile(r[cloudDownloadCount],function(){ - fs.writeFileSync(tempScript,script,'utf8') - var zipCreate = spawn('sh',(tempScript).split(' '),{detached: true}) - zipCreate.stderr.on('data',function(data){ - s.userLog({ke:req.params.ke,mid:'$USER'},{title:'Zip Create Error',msg:data.toString()}) - }) - zipCreate.on('exit',function(data){ - fs.unlinkSync(tempScript) - tempFiles.forEach(function(file){ - fs.unlink(file,function(){}) - }) - res.setHeader('Content-Disposition', 'attachment; filename="' + zippedFilename + '"') - var zipDownload = fs.createReadStream(zippedFile) - zipDownload.pipe(res) - zipDownload.on('error', function (error) { - var errorString = error.toString() - s.userLog({ - ke: req.params.ke, - mid: '$USER' - },{ - title: 'Zip Download Error', - msg: errorString - }) - if(zipDownload && zipDownload.destroy){ - zipDownload.destroy() - } - res.end(s.prettyPrint({ - ok: false, - msg: errorString - })) - }) - zipDownload.on('close', function () { - res.end() - zipDownload.destroy() - fs.unlinkSync(zippedFile) - }) - }) - }) - }) - }else{ - failed({ok:false,msg:'No Videos Found'}) - } - }) - },res,req); - }else{ - failed({ok:false,msg:'"videos" query variable is missing from request.'}) - } - }) + // /** + // * API : Zip Videos and Get Link from fileBin + // */ + // app.get(config.webPaths.apiPrefix+':auth/zipVideos/:ke', function (req,res){ + // var failed = function(resp){ + // res.setHeader('Content-Type', 'application/json'); + // res.end(s.prettyPrint(resp)) + // } + // if(req.query.videos && req.query.videos !== ''){ + // s.auth(req.params,function(user){ + // var videosSelected = JSON.parse(req.query.videos) + // var where = [] + // var values = [] + // videosSelected.forEach(function(video){ + // where.push("(ke=? AND mid=? AND `time`=?)") + // if(!video.ke)video.ke = req.params.ke + // values.push(video.ke) + // values.push(video.mid) + // var time = s.nameToTime(video.filename) + // if(req.query.isUTC === 'true'){ + // time = s.utcToLocal(time) + // } + // time = new Date(time) + // values.push(time) + // }) + // s.sqlQuery('SELECT * FROM Videos WHERE '+where.join(' OR '),values,function(err,r){ + // var resp = {ok: false} + // if(r && r[0]){ + // resp.ok = true + // var zipDownload = null + // var tempFiles = [] + // var fileId = s.gid() + // var fileBinDir = s.dir.fileBin+req.params.ke+'/' + // var tempScript = s.dir.streams+req.params.ke+'/'+fileId+'.sh' + // var zippedFilename = s.formattedTime()+'-'+fileId+'-Shinobi_Recordings.zip' + // var zippedFile = fileBinDir+zippedFilename + // var script = 'cd '+fileBinDir+' && zip -9 -r '+zippedFile + // res.on('close', () => { + // if(zipDownload && zipDownload.destroy){ + // zipDownload.destroy() + // } + // fs.unlink(zippedFile); + // }) + // fs.mkdir(fileBinDir,function(err){ + // s.handleFolderError(err) + // r.forEach(function(video){ + // var timeFormatted = s.formattedTime(video.time) + // video.filename = timeFormatted+'.'+video.ext + // var dir = s.getVideoDirectory(video)+video.filename + // var tempVideoFile = timeFormatted+' - '+video.mid+'.'+video.ext + // fs.writeFileSync(fileBinDir+tempVideoFile, fs.readFileSync(dir)) + // tempFiles.push(fileBinDir+tempVideoFile) + // script += ' "'+tempVideoFile+'"' + // }) + // fs.writeFileSync(tempScript,script,'utf8') + // var zipCreate = spawn('sh',(tempScript).split(' '),{detached: true}) + // zipCreate.stderr.on('data',function(data){ + // s.userLog({ke:req.params.ke,mid:'$USER'},{title:'Zip Create Error',msg:data.toString()}) + // }) + // zipCreate.on('exit',function(data){ + // fs.unlinkSync(tempScript) + // tempFiles.forEach(function(file){ + // fs.unlink(file,function(){}) + // }) + // res.setHeader('Content-Disposition', 'attachment; filename="'+zippedFilename+'"') + // var zipDownload = fs.createReadStream(zippedFile) + // zipDownload.pipe(res) + // zipDownload.on('error', function (error) { + // var errorString = error.toString() + // s.userLog({ + // ke: req.params.ke, + // mid: '$USER' + // },{ + // title: 'Zip Download Error', + // msg: errorString + // }) + // if(zipDownload && zipDownload.destroy){ + // zipDownload.destroy() + // } + // res.end(s.prettyPrint({ + // ok: false, + // msg: errorString + // })) + // }) + // zipDownload.on('close', function () { + // res.end() + // zipDownload.destroy() + // fs.unlinkSync(zippedFile) + // }) + // }) + // }) + // }else{ + // failed({ok:false,msg:'No Videos Found'}) + // } + // }) + // },res,req); + // }else{ + // failed({ok:false,msg:'"videos" query variable is missing from request.'}) + // } + // }) + // /** + // * API : Zip Cloud Videos and Get Link from fileBin + // */ + // app.get(config.webPaths.apiPrefix+':auth/zipCloudVideos/:ke', function (req,res){ + // var failed = function(resp){ + // res.setHeader('Content-Type', 'application/json'); + // res.end(s.prettyPrint(resp)) + // } + // if(req.query.videos && req.query.videos !== ''){ + // s.auth(req.params,function(user){ + // var videosSelected = JSON.parse(req.query.videos) + // var where = [] + // var values = [] + // videosSelected.forEach(function(video){ + // where.push("(ke=? AND mid=? AND `time`=?)") + // if(!video.ke)video.ke = req.params.ke + // values.push(video.ke) + // values.push(video.mid) + // var time = s.nameToTime(video.filename) + // if(req.query.isUTC === 'true'){ + // time = s.utcToLocal(time) + // } + // time = new Date(time) + // values.push(time) + // }) + // s.sqlQuery('SELECT * FROM `Cloud Videos` WHERE '+where.join(' OR '),values,function(err,r){ + // var resp = {ok: false} + // if(r && r[0]){ + // resp.ok = true + // var zipDownload = null + // var tempFiles = [] + // var fileId = s.gid() + // var fileBinDir = s.dir.fileBin+req.params.ke+'/' + // var tempScript = s.dir.streams+req.params.ke+'/'+fileId+'.sh' + // var zippedFilename = s.formattedTime()+'-'+fileId+'-Shinobi_Cloud_Backed_Recordings.zip' + // var zippedFile = fileBinDir+zippedFilename + // var script = 'cd '+fileBinDir+' && zip -9 -r '+zippedFile + // res.on('close', () => { + // if(zipDownload && zipDownload.destroy){ + // zipDownload.destroy() + // } + // fs.unlink(zippedFile); + // }) + // fs.mkdir(fileBinDir,function(err){ + // var cloudDownloadCount = 0 + // var getFile = function(video,completed){ + // if(!video)completed(); + // s.checkDetails(video) + // var filename = video.href.split('/') + // filename = filename[filename.length - 1] + // var timeFormatted = s.formattedTime(video.time) + // var tempVideoFile = video.details.type + '-' + video.mid + '-' + filename + // var tempFileWriteStream = fs.createWriteStream(fileBinDir+tempVideoFile) + // tempFileWriteStream.on('finish', function() { + // ++cloudDownloadCount + // getFile(r[cloudDownloadCount],completed) + // }) + // var cloudVideoDownload = request(video.href) + // cloudVideoDownload.on('response', function (res) { + // res.pipe(tempFileWriteStream) + // }) + // tempFiles.push(fileBinDir+tempVideoFile) + // script += ' "'+tempVideoFile+'"' + // } + // getFile(r[cloudDownloadCount],function(){ + // fs.writeFileSync(tempScript,script,'utf8') + // var zipCreate = spawn('sh',(tempScript).split(' '),{detached: true}) + // zipCreate.stderr.on('data',function(data){ + // s.userLog({ke:req.params.ke,mid:'$USER'},{title:'Zip Create Error',msg:data.toString()}) + // }) + // zipCreate.on('exit',function(data){ + // fs.unlinkSync(tempScript) + // tempFiles.forEach(function(file){ + // fs.unlink(file,function(){}) + // }) + // res.setHeader('Content-Disposition', 'attachment; filename="' + zippedFilename + '"') + // var zipDownload = fs.createReadStream(zippedFile) + // zipDownload.pipe(res) + // zipDownload.on('error', function (error) { + // var errorString = error.toString() + // s.userLog({ + // ke: req.params.ke, + // mid: '$USER' + // },{ + // title: 'Zip Download Error', + // msg: errorString + // }) + // if(zipDownload && zipDownload.destroy){ + // zipDownload.destroy() + // } + // res.end(s.prettyPrint({ + // ok: false, + // msg: errorString + // })) + // }) + // zipDownload.on('close', function () { + // res.end() + // zipDownload.destroy() + // fs.unlinkSync(zippedFile) + // }) + // }) + // }) + // }) + // }else{ + // failed({ok:false,msg:'No Videos Found'}) + // } + // }) + // },res,req); + // }else{ + // failed({ok:false,msg:'"videos" query variable is missing from request.'}) + // } + // }) /** * API : Get Cloud Video File (proxy) */ @@ -1988,7 +1988,7 @@ module.exports = function(s,config,lang,app,io){ }else{ action = Camera[req.params.action] } - console.log(s.parseJSON(req.query.options)) + // console.log(s.parseJSON(req.query.options)) if(!action || typeof action !== 'function'){ errorMessage(req.params.action+' is not an available ONVIF function. See https://github.com/futomi/node-onvif for functions.') }else{ diff --git a/libs/webServerStreamPaths.js b/libs/webServerStreamPaths.js index 614fb80..25ddd8f 100644 --- a/libs/webServerStreamPaths.js +++ b/libs/webServerStreamPaths.js @@ -24,7 +24,7 @@ module.exports = function(s,config,lang,app){ if(s.group[req.params.ke]&&s.group[req.params.ke].activeMonitors[req.params.id]){ if(s.group[req.params.ke].activeMonitors[req.params.id].isStarted === true){ req.params.uid=user.uid; - s.renderPage(req,res,config.renderPaths.embed,{data:req.params,baseUrl:req.protocol+'://'+req.hostname,config: s.getConfigWithBranding(req.hostname),lang:user.lang,mon:CircularJSON.parse(CircularJSON.stringify(s.group[req.params.ke].rawMonitorConfigurations[req.params.id])),originalURL:s.getOriginalUrl(req)}); + s.renderPage(req,res,config.renderPaths.embed,{data:req.params,baseUrl:req.protocol+'://'+req.hostname,config: s.getConfigWithBranding(req.hostname),lang:user.lang,mon:Object.assign(s.group[req.params.ke].rawMonitorConfigurations[req.params.id],{}),originalURL:s.getOriginalUrl(req)}); res.end() }else{ res.end(user.lang['Cannot watch a monitor that isn\'t running.'])