diff --git a/modules/db-management/database-default-manager.js b/modules/db-management/database-default-manager.js index 8046b80..a974e7f 100644 --- a/modules/db-management/database-default-manager.js +++ b/modules/db-management/database-default-manager.js @@ -197,11 +197,7 @@ function calculateHash (thisSong, songInfo) { } function deleteFile(filepath){ - console.log(filepath) - dbRead.deleteFile(filepath, loadJson.username, function(){ - // Re-add entry - parseFilesGenerator.next(); - }); + dbRead.deleteFile(filepath, loadJson.username, function(){ }); } function getFileType(filename){ diff --git a/modules/db-management/database-master.js b/modules/db-management/database-master.js index 87bd546..1f5396f 100644 --- a/modules/db-management/database-master.js +++ b/modules/db-management/database-master.js @@ -12,7 +12,6 @@ exports.setup = function(mstream, program){ - /////////////////////////// // TODO: Should we have a API call that can kill any process associated with a user and reset their scan value to false? /////////////////////////// @@ -22,28 +21,6 @@ exports.setup = function(mstream, program){ // For now we spawn indiscriminately and let the CPU sort it out /////////////////////////// - // TODO: Test this - // function forkBeets(user, dbSettings, callback){ - // var jsonLoad = { - // username:user.username, - // userDir:user.musicDir, - // dbSettings:dbSettings - // } - // - // const forkedScan = child.fork( fe.join(__dirname, 'database-beets-manager.js'), [JSON.stringify(jsonLoad)]); - // - // // forkedScan.stdout.on('data', (data) => { - // // console.log(`stdout: ${data}`); - // // }); - // // forkedScan.stderr.on('data', (data) => { - // // console.log(`stderr: ${data}`); - // // }); - // forkedScan.on('close', (code) => { - // userDBStatus[user.username] = false; - // callback(); - // console.log(`child process exited with code ${code}`); - // }); - // } function forkDefault(user, dbSettings, callback){ // TODO: Get data back from process and store it for the status API call @@ -71,43 +48,9 @@ exports.setup = function(mstream, program){ - // function updateBeets(){ - // // Pull beets commands from config - // if((typeof dbSettings.beetsCommand === 'string' || dbSettings.beetsCommand instanceof String)){ - // - // let beetsCommandArray = dbSettings.beetsCommand.split(" "); - // let mainCommand = beetsCommandArray.shift(); - // - // const forkedUpdate = child.fork(mainCommand, beetsCommandArray); - // forkedScan.on('close', (code) => { - // userDBStatus[user.username] = false; - // console.log(`child process exited with code ${code}`); - // }); - // - // // Run commands - // // beet import -A --group-albums /path/to/music - // // beet check -a - // // find ~ -type d -empty -delete - // }else{ - // userDBStatus[user.username] = false; - // console.log('No command launched'); - // return false; - // } - // } - - - - // TODO: Special function that scans beets DB - // mstream.get('/db/scan-beets', function(req,res){ - // // updateBeets(); - // res.status(500).json( {error: 'Coming Soon'} ); - // }); - // Handle user status mstream.get('/db/status', function(req, res){ - // Check what system user has - // Get number of files in DB mstreamReadPublicDB.getNumberOfFiles(req.user.username, function(numOfFiles){ var returnObject = { @@ -121,17 +64,8 @@ exports.setup = function(mstream, program){ returnObject.locked = true; } - // Check for beets - if(program.database_plugin.type === 'beets' ){ - returnObject.dbType = 'beets'; - }else if((req.user.privateDBOptions && req.user.privateDBOptions.privateDB === 'BEETS')){ - returnObject.dbType = 'beets'; - } - res.json(returnObject); }); - - }); @@ -201,18 +135,11 @@ exports.setup = function(mstream, program){ return {error:false, message: 'Scan started'}; } - // User is using Beets as a personnal DB - // if(user.privateDBOptions.privateDB === 'BEETS'){ - // forkBeets(user.privateDBOptions, callback); - // return {error:false, message: 'Import of Beets DB started'}; - // } - userDBStatus[user.username] = false; return {error:true, message: 'YOUR CONFIG IS BAD AND YOU SHOULD FEEL BAD. ABORTING!'}; } - // TODO: Make this queue run several in parallel // Scan on startup function *bootScan(){ // Loop through list of users @@ -233,5 +160,4 @@ exports.setup = function(mstream, program){ const bootScanGenerator = bootScan(); bootScanGenerator.next(); - } diff --git a/modules/db-read/database-public-loki.js b/modules/db-read/database-public-loki.js index 52f4b92..e7711bd 100644 --- a/modules/db-read/database-public-loki.js +++ b/modules/db-read/database-public-loki.js @@ -21,10 +21,15 @@ function loadDB(){ else { console.log("database loaded XXX"); } - // Add a collection to the database + // Get files collection fileCollection = filesdb.getCollection('files') - playlistColection = filesdb.getCollection('playlists') + // Initialize playlsits collection + playlistColection = filesdb.getCollection('playlists') + if (playlistColection === null) { + // first time run so add and configure collection with some arbitrary options + playlistColection = filesdb.addCollection("playlists"); + } }); } @@ -60,103 +65,105 @@ exports.setup = function (mstream, dbSettings){ "track":result.track, "title":result.title, "year":result.year, - "album-art":row.albumArtFilename + "album-art":result.albumArtFilename } }); }); - // TODO: This needs to be tested to see if it works on extra large playlists (think thousands of entries) - // TODO: Ban saving playlists that are > 10,000 items long + // Save playlist mstream.post('/playlist/save', function (req, res){ var title = req.body.title; var songs = req.body.songs; - // Check if this playlist already exists - db.all("SELECT id FROM mstream_playlists WHERE playlist_name = ? AND user = ?;", [title, req.user.username], function(err, rows) { - db.serialize(function() { - // We need to delete anys existing entries - if(rows && rows.length > 0){ - db.run("DELETE FROM mstream_playlists WHERE playlist_name = ? AND user = ?;", [title, req.user.username]); - } - - // Now we add the new entries - var sql2 = "insert into mstream_playlists (playlist_name, filepath, user) values "; - var sqlParser = []; - - while(songs.length > 0) { - var song = songs.shift(); - - sql2 += "(?, ?, ?), "; - sqlParser.push(title); - sqlParser.push( fe.join(req.user.musicDir, song) ); - sqlParser.push( req.user.username ); - } - - sql2 = sql2.slice(0, -2); - sql2 += ";"; - - db.run(sql2, sqlParser, function(){ - res.json({success: true}); - }); - - }); + // Delete existing playlist + playlistColection.findAndRemove({ + '$and': [{ + 'user' : { '$eq' : req.user.username} + },{ + 'name' : { '$eq' : title} + }] }); + + + while(songs.length > 0) { + var song = songs.shift(); + playlistColection.insert({ + name: title, + filepath: fe.join(req.user.musicDir, song), + user: req.user.username, + hide: false + }); + } + + res.json({success: true}); + + filesdb.saveDatabase(function(err) { + if (err) { + console.log("error : " + err); + } + else { + console.log("database saved."); + } + }); + + }); - - // Attach API calls to functions + // Get all playlists mstream.get('/playlist/getall', function (req, res){ - // TODO: In V2 we need to change this to ignore hidden playlists - // TODO: db.all("SELECT DISTINCT playlist_name FROM mstream_playlists WHERE hide=0;", function(err, rows){ - db.all("SELECT DISTINCT playlist_name FROM mstream_playlists WHERE user = ?", [req.user.username], function(err, rows){ - var playlists = []; + var playlists = []; - // loop through files - for (var i = 0; i < rows.length; i++) { - if(rows[i].playlist_name){ - playlists.push({name: rows[i].playlist_name}); + var result = playlistColection.mapReduce(function(obj) { + return obj.name; + }, function(arr) { + var store = []; + for(var i = 0; i < arr.length; i++) { + if(store.indexOf(arr[i]) === -1) { + playlists.push({name: arr[i]}); + store.push(arr[i]) } } - - res.json(playlists); + return; }); + + res.json(playlists); }); + // Load a playlist mstream.post('/playlist/load', function (req, res){ var playlist = req.body.playlistname; + var returnThis = []; - db.all("SELECT * FROM mstream_playlists WHERE playlist_name = ? AND user = ? ORDER BY id COLLATE NOCASE ASC", [playlist, req.user.username], function(err, rows){ - var returnThis = []; - - for (var i = 0; i < rows.length; i++) { - - // var tempName = rows[i].filepath.split('/').slice(-1)[0]; - var tempName = fe.basename(rows[i].filepath); - var extension = getFileType(rows[i].filepath); - var filepath = fe.relative(req.user.musicDir, rows[i].filepath); - filepath = filepath.replace(/\\/g, '/'); - - returnThis.push({filepath: filepath, metadata:'' }); - } - - res.json(returnThis); + var results = playlistColection.find({ + '$and': [{ + 'user' : { '$eq' : req.user.username} + },{ + 'name' : { '$eq' : playlist} + }] }); + + console.log(results) + + for(row of results){ + returnThis.push({filepath: fe.relative(req.user.musicDir, row.filepath), metadata:'' }); + } + + res.json(returnThis); }); + + // Delete playlist mstream.post('/playlist/delete', function(req, res){ var playlistname = req.body.playlistname; - // Handle a soft delete - if(req.body.hide && parseInt(req.body.hide) == true ){ - db.run("UPDATE mstream_playlists SET hide = 1 WHERE playlist_name = ? AND user = ?;", [playlistname, req.user.username], function(){ - res.json({success: true}); - }); - }else{ - // Delete playlist from DB - db.run("DELETE FROM mstream_playlists WHERE playlist_name = ? AND user = ?;", [playlistname, req.user.username], function(){ - res.json({success: true}); - }); - } + // Delete existing playlist + playlistColection.findAndRemove({ + '$and': [{ + 'user' : { '$eq' : req.user.username} + },{ + 'name' : { '$eq' : playlistname} + }] + }); }); // TODO: Re-implment search @@ -171,20 +178,18 @@ exports.setup = function (mstream, dbSettings){ }, function(arr) { for(var i = 0; i < arr.length; i++) { if(artists.artists.indexOf(arr[i]) === -1) { - console.log(arr[i]) artists.artists.push(arr[i]); } } return; }); - // artists.artists = result; res.json(artists); }); + // TODO: NOT WORKING mstream.post('/db/artists-albums', function (req, res) { var albums = {"albums":[]}; - var results = fileCollection.find({ '$and': [{ 'user' : { '$eq' : req.user.username} @@ -198,9 +203,9 @@ exports.setup = function (mstream, dbSettings){ name: row.album, album_art_file: row.albumArtFilename }); - - res.json(albums); } + + res.json(albums); }); mstream.get('/db/albums', function (req, res) { @@ -213,7 +218,6 @@ exports.setup = function (mstream, dbSettings){ var len = arr.length; var store = []; for(var i = 0; i < len; i++) { - console.log(arr[i]) if(store.indexOf(arr[i].name) === -1) { store.push(arr[i].name); ret.push(arr[i]); @@ -222,8 +226,6 @@ exports.setup = function (mstream, dbSettings){ return ret; }); - console.log(result) - albums.albums = result; res.json(albums); }); @@ -257,7 +259,6 @@ exports.setup = function (mstream, dbSettings){ }) } res.json(songs); - }); }