|
@@ -0,0 +1,79 @@
|
|
|
|
|
+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();
|
|
|
|
|
+ });
|
|
|
|
|
+});
|