mirror of
https://github.com/IrosTheBeggar/mStream.git
synced 2025-10-27 07:31:02 +00:00
133 lines
3.5 KiB
JavaScript
133 lines
3.5 KiB
JavaScript
exports.setup = function(mstream, program){
|
|
const child = require('child_process');
|
|
const fe = require('path');
|
|
|
|
// Load in API enndpoints
|
|
// TODO: Change the name of this file
|
|
const mstreamReadPublicDB = require('../db-read/database-public-loki.js');
|
|
mstreamReadPublicDB.setup(mstream, program);
|
|
|
|
// Var that keeps track of DB scans going on
|
|
var isScanning = false;
|
|
|
|
|
|
|
|
///////////////////////////
|
|
// TODO: Should we have a API call that can kill any process associated with a user and reset their scan value to false?
|
|
///////////////////////////
|
|
|
|
///////////////////////////
|
|
// TODO: We could use some kind of manager to make sure we don't spawn to many child processes
|
|
// For now we spawn indiscriminately and let the CPU sort it out
|
|
///////////////////////////
|
|
|
|
|
|
// Get db status
|
|
mstream.get('/db/status', function(req, res){
|
|
// Get number of files in DB
|
|
mstreamReadPublicDB.getNumberOfFiles(req.user.vpaths, function(numOfFiles){
|
|
res.json({
|
|
totalFileCount: numOfFiles,
|
|
dbType: 'default',
|
|
locked: isScanning
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
// TODO: Is this still necessary???
|
|
// mstream.get('/db/download-db', function(req, res){
|
|
// // Download File
|
|
// res.download(req.user.privateDBOptions.importDB);
|
|
// });
|
|
// // Get hash of database
|
|
// mstream.get( '/db/hash', function(req, res){
|
|
// var hash = crypto.createHash('sha256');
|
|
// hash.setEncoding('hex');
|
|
//
|
|
// var fileStream = fs.createReadStream(req.user.privateDBOptions.importDB);
|
|
// fileStream.on('end', function () {
|
|
// hash.end();
|
|
// res.json( {hash:String(hash.read())} );
|
|
// });
|
|
//
|
|
// fileStream.pipe(hash, { end: false });
|
|
// });
|
|
|
|
|
|
|
|
// Scan library
|
|
mstream.get('/db/recursive-scan', function(req,res){
|
|
var scan = runScan();
|
|
|
|
var statusCode = (scan.error === true) ? 555 : 200;
|
|
res.status(statusCode).json({ status: scan.message });
|
|
});
|
|
|
|
|
|
|
|
|
|
function scanIt(scanPackage, callback){
|
|
// Prepare JSON load for forked process
|
|
var jsonLoad = {
|
|
directory: scanPackage.directory,
|
|
vpath: scanPackage.vpath,
|
|
dbSettings: program.database_plugin,
|
|
albumArtDir: program.albumArtDir
|
|
}
|
|
|
|
const forkedScan = child.fork( fe.join(__dirname, 'database-default-manager.js'), [JSON.stringify(jsonLoad)], {silent: true});
|
|
|
|
forkedScan.stdout.on('data', (data) => {
|
|
// TODO: Move this to a interval
|
|
mstreamReadPublicDB.loadDB();
|
|
console.log(`stdout: ${data}`);
|
|
});
|
|
forkedScan.stderr.on('data', (data) => {
|
|
console.log(`stderr: ${data}`);
|
|
});
|
|
forkedScan.on('close', (code) => {
|
|
isScanning = false;
|
|
callback();
|
|
console.log(`child process exited with code ${code}`);
|
|
});
|
|
|
|
return {error:false, message: 'Scan started'};
|
|
}
|
|
|
|
|
|
// Scan on startup
|
|
function *bootScan(){
|
|
// Loop through list of users
|
|
for (let vpath in program.folders) {
|
|
|
|
yield scanIt( {
|
|
directory: program.folders[vpath].root,
|
|
vpath: vpath
|
|
}, function(){
|
|
mstreamReadPublicDB.loadDB();
|
|
bootScanGenerator.next();
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
var bootScanGenerator
|
|
function runScan(){
|
|
// Check that scan is not already in progress
|
|
if(isScanning === true){
|
|
return {error:true, message: 'Scan in Progress'}; // Need to return a status
|
|
}
|
|
|
|
// Lock user
|
|
isScanning= true;
|
|
|
|
bootScanGenerator = bootScan();
|
|
bootScanGenerator.next();
|
|
|
|
return {error:false, message: 'Scan Started'};
|
|
}
|
|
|
|
runScan();
|
|
}
|