var taglib=require('taglib'); // create table songs (id int not null auto_increment, artist varchar(300), title varchar(300) , album varchar(300), added_on DATE, filename varchar(300) not null, transcoded varchar(300), primary key ( id)); // ALTER TABLE songs ADD CONSTRAINT constr_fname UNIQUE (filename); var connection = require('mysql').createConnection({ user: 'music', password: 'music', database: 'music', socketPath: '/var/run/mysqld/mysqld.sock' }); connection.connect(); var validExtensions = [ "mp3","aac","flac","alac","ogg","m4a" ]; //3289 songs in 37sec function endsWith(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; } function validMusicFile(path){ for (ext in validExtensions) if (endsWith(path, validExtensions[ext])) return true; return false; } function tags(path) { var empty = {'artist': '', 'title': '', 'album': ''}; try { var tag = taglib.tagSync(path); if(!tag.isEmpty()) return { 'artist': tag.artist, 'title': tag.title, 'album': tag.album}; else return empty; } catch (ex) { return empty; } } var fs = require('fs'); var path = require('path'); var walk = function(dir, done) { var results = []; fs.readdir(dir, function(err, list) { if (err) return done(err); var pending = list.length; if (!pending) return done(null, results); list.forEach(function(file) { file = path.resolve(dir, file); fs.stat(file, function(err, stat) { if (stat && stat.isDirectory()) { walk(file, function(err, res) { results = results.concat(res); if (!--pending) done(null, results); }); } else { if (validMusicFile(file)) results.push(file); if (!--pending) done(null, results); } }); }); }); }; var populate = function(path) { //"/storage/samba/Music" var query = 'INSERT INTO songs(filename,artist,title,album,added_on) values ? on duplicate key update artist=artist,title=title,album=album'; var res = []; var now = {}; walk(path, function(err, results) { if (err) throw err; for( r in results) { var s = []; var meta = tags(results[r]); s.push(results[r]); s.push(meta.artist); s.push(meta.title); s.push(meta.album); res.push(s); } connection.query(query, [res], function(err, result) { if (err) throw err; console.log("Finished"); //connection.end(); }); }); } var pathFromID = function(id, callback){ var query = 'select filename from songs where id=? limit 1'; connection.query(query, id, function(err, result) { if(result.length==1) callback(result[0].filename); //connection.end(); }); }; var getArtist= function(artist, callback){ var query = 'select * from songs where artist like ?'; connection.query(query, "%"+artist+"%", function(err, result) { callback(result); //connection.end(); }); }; var getArtists=function(callback){ var query = 'select distinct(artist) from songs order by artist'; connection.query(query, function(err, result) { callback(result); }); }; var getAlbums=function(callback){ var query = 'select artist,album from songs group by album order by artist'; connection.query(query, function(err, result) { callback(result); }); }; module.exports.pathFromID=pathFromID; module.exports.getArtist=getArtist; module.exports.getArtists=getArtists; module.exports.getAlbums=getAlbums; module.exports.populate=populate; //populate("/storage/samba/Music");