mirror of
https://github.com/IrosTheBeggar/mStream.git
synced 2025-10-27 07:31:02 +00:00
256 lines
5.3 KiB
JavaScript
256 lines
5.3 KiB
JavaScript
const metadata = require('musicmetadata'); // TODO: Look into replacing with taglib
|
|
const fs = require('graceful-fs'); // File System
|
|
const fe = require('path');
|
|
var dbCopy;
|
|
|
|
|
|
var arrayOfSongs = [];
|
|
var scanLock = false;
|
|
var yetAnotherArrayOfSongs = [];
|
|
var totalFileCount = 0;
|
|
|
|
|
|
function getFileType(filename){
|
|
return filename.split(".").pop();
|
|
}
|
|
|
|
function parseFile(thisSong){
|
|
var readableStream = fs.createReadStream(thisSong);
|
|
var parser = metadata(readableStream, function (err, songInfo) {
|
|
if(err){
|
|
// TODO: Do something
|
|
}
|
|
|
|
|
|
// TODO: Hash the file here and add the hash to the DB
|
|
|
|
console.log(songInfo);
|
|
|
|
|
|
// Close the stream
|
|
readableStream.close();
|
|
|
|
|
|
songInfo.filePath = thisSong;
|
|
songInfo.format = getFileType(thisSong);
|
|
|
|
arrayOfSongs.push(songInfo);
|
|
|
|
|
|
// if there are more than 100 entries, or if it's the last song
|
|
if(arrayOfSongs.length > 99){
|
|
insertEntries();
|
|
}
|
|
|
|
// For the generator
|
|
parse.next();
|
|
});
|
|
}
|
|
|
|
function *parseAllFiles(){
|
|
|
|
// Loop through local items
|
|
while(yetAnotherArrayOfSongs.length > 0) {
|
|
var file = yetAnotherArrayOfSongs.pop();
|
|
|
|
var resultX = yield parseFile(file);
|
|
|
|
}
|
|
|
|
insertEntries();
|
|
scanLock = false;
|
|
}
|
|
|
|
|
|
var parse;
|
|
|
|
|
|
|
|
// Insert
|
|
function insertEntries(){
|
|
var sql2 = "insert into items (title,artist,year,album,path,format, track, disk) values ";
|
|
var sqlParser = [];
|
|
|
|
while(arrayOfSongs.length > 0) {
|
|
var song = arrayOfSongs.pop();
|
|
|
|
// console.log(song);
|
|
|
|
|
|
var songTitle = null;
|
|
var songYear = null;
|
|
var songAlbum = null;
|
|
var artistString = null;
|
|
|
|
if(song.artist && song.artist.length > 0){
|
|
artistString = '';
|
|
for (var i = 0; i < song.artist.length; i++) {
|
|
artistString += song.artist[i] + ', ';
|
|
}
|
|
artistString = artistString.slice(0, -2);
|
|
}
|
|
if(song.title && song.title.length > 0){
|
|
songTitle = song.title;
|
|
}
|
|
if(song.year && song.year.length > 0){
|
|
songYear = song.year;
|
|
}
|
|
if(song.album && song.album.length > 0){
|
|
songAlbum = song.album;
|
|
}
|
|
|
|
|
|
sql2 += "(?, ?, ?, ?, ?, ?, ?, ?), ";
|
|
sqlParser.push(songTitle);
|
|
sqlParser.push(artistString);
|
|
sqlParser.push(songYear);
|
|
sqlParser.push(songAlbum);
|
|
sqlParser.push(song.filePath);
|
|
sqlParser.push(song.format);
|
|
sqlParser.push(song.track.no);
|
|
sqlParser.push(song.disk.no);
|
|
|
|
}
|
|
|
|
sql2 = sql2.slice(0, -2);
|
|
sql2 += ";";
|
|
|
|
console.log(sql2);
|
|
dbCopy.run(sql2, sqlParser);
|
|
}
|
|
|
|
|
|
// Count all files
|
|
function countFiles (dir, fileTypesArray) {
|
|
console.log('efwefwf');
|
|
var files = fs.readdirSync( dir );
|
|
console.log(files);
|
|
|
|
|
|
for (var i=0; i < files.length; i++) {
|
|
var filePath = fe.join(dir, files[i]);
|
|
var stat = fs.statSync(filePath);
|
|
console.log(filePath);
|
|
|
|
|
|
if(stat.isDirectory()){
|
|
console.log('qqq');
|
|
|
|
countFiles(filePath , fileTypesArray);
|
|
}else{
|
|
console.log('www');
|
|
|
|
var extension = getFileType(files[i]);
|
|
|
|
if (fileTypesArray.indexOf(extension) > -1 ) {
|
|
|
|
yetAnotherArrayOfSongs.push(filePath);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
exports.setup = function(mstream, program, rootDir, db){
|
|
const rootDirCopy = rootDir;
|
|
dbCopy = db;
|
|
|
|
// scan and screate database
|
|
mstream.get('/db/recursive-scan', function(req,res){
|
|
|
|
console.log('xxx');
|
|
|
|
// Check if this is already running
|
|
if(scanLock === true){
|
|
// Return error
|
|
res.status(401).send('{"error":"Scan in progress"}');
|
|
return;
|
|
}
|
|
|
|
try{
|
|
// turn on scan lock
|
|
scanLock = true;
|
|
|
|
|
|
// Make sure directory exits
|
|
var fileTypesArray = ["mp3", "flac", "wav", "ogg", "aac", "m4a"];
|
|
|
|
|
|
console.log(rootDirCopy);
|
|
|
|
countFiles(rootDirCopy, fileTypesArray);
|
|
|
|
|
|
totalFileCount = yetAnotherArrayOfSongs.length;
|
|
|
|
console.log(totalFileCount);
|
|
|
|
|
|
dbCopy.serialize(function() {
|
|
// These two queries will run sequentially.
|
|
dbCopy.run("drop table if exists items;");
|
|
dbCopy.run("CREATE TABLE items ( id INTEGER PRIMARY KEY AUTOINCREMENT, title varchar DEFAULT NULL, artist varchar DEFAULT NULL, year int DEFAULT NULL, album varchar DEFAULT NULL, path text, format varchar, track INTEGER, disk INTEGER);", function() {
|
|
// These queries will run in parallel and the second query will probably
|
|
// fail because the table might not exist yet.
|
|
console.log('TABLES CREATED');
|
|
|
|
parse = parseAllFiles();
|
|
parse.next();
|
|
});
|
|
});
|
|
|
|
}catch(err){
|
|
// Remove lock
|
|
scanLock = false;
|
|
|
|
// // Log error
|
|
// res.status(500).send('{"error":"'+err+'"}');
|
|
// console.log(err);
|
|
return;
|
|
}
|
|
|
|
res.send("YA DID IT");
|
|
|
|
});
|
|
|
|
|
|
|
|
mstream.get('/db/status', function(req, res){
|
|
var returnObject = {};
|
|
|
|
returnObject.locked = scanLock;
|
|
|
|
|
|
if(scanLock){
|
|
|
|
returnObject.totalFileCount = totalFileCount;
|
|
returnObject.filesLeft = yetAnotherArrayOfSongs.length;
|
|
|
|
res.json(returnObject);
|
|
|
|
}else{
|
|
var sql = 'SELECT Count(*) FROM items';
|
|
|
|
dbCopy.get(sql, function(err, row){
|
|
if(err){
|
|
console.log(err.message);
|
|
|
|
res.status(500).json({ error: err.message });
|
|
return;
|
|
}
|
|
|
|
|
|
var fileCountDB = row['Count(*)']; // TODO: Is this correct???
|
|
|
|
returnObject.totalFileCount = fileCountDB;
|
|
res.json(returnObject);
|
|
|
|
});
|
|
}
|
|
|
|
});
|
|
|
|
}
|