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) { try { var tag = taglib.tagSync(path); if(!tag.isEmpty()) return { 'artist': tag.artist, 'title': tag.title}; else return {'artist': '', 'title': ''}; } catch (ex) { return {'artist': '', 'title': ''}; } } 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); } }); }); }); }; walk("/storage/samba/Music", function(err, results) { if (err) throw err; var query = 'INSERT INTO songs(filename,artist,title) values ? on duplicate key update artist=artist,title=title'; var res = []; for( r in results) { var s = []; var meta = tags(results[r]); s.push(results[r]); s.push(meta.artist); s.push(meta.title); res.push(s); } connection.query(query, [res], function(err, result) { if (err) throw err; connection.end(); }); });