tagger.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. var taglib=require('taglib');
  2. // 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));
  3. // ALTER TABLE songs ADD CONSTRAINT constr_fname UNIQUE (filename);
  4. var connection = require('mysql').createConnection({
  5. user: 'music',
  6. password: 'music',
  7. database: 'music',
  8. socketPath: '/var/run/mysqld/mysqld.sock'
  9. });
  10. connection.connect();
  11. var validExtensions = [ "mp3","aac","flac","alac","ogg","m4a" ];
  12. //3289 songs in 37sec
  13. function endsWith(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; }
  14. function validMusicFile(path){
  15. for (ext in validExtensions)
  16. if (endsWith(path, validExtensions[ext]))
  17. return true;
  18. return false;
  19. }
  20. function tags(path) {
  21. try {
  22. var tag = taglib.tagSync(path);
  23. if(!tag.isEmpty())
  24. return { 'artist': tag.artist, 'title': tag.title};
  25. else
  26. return {'artist': '', 'title': ''};
  27. } catch (ex) {
  28. return {'artist': '', 'title': ''};
  29. }
  30. }
  31. var fs = require('fs');
  32. var path = require('path');
  33. var walk = function(dir, done) {
  34. var results = [];
  35. fs.readdir(dir, function(err, list) {
  36. if (err) return done(err);
  37. var pending = list.length;
  38. if (!pending) return done(null, results);
  39. list.forEach(function(file) {
  40. file = path.resolve(dir, file);
  41. fs.stat(file, function(err, stat) {
  42. if (stat && stat.isDirectory()) {
  43. walk(file, function(err, res) {
  44. results = results.concat(res);
  45. if (!--pending) done(null, results);
  46. });
  47. } else {
  48. if (validMusicFile(file))
  49. results.push(file);
  50. if (!--pending) done(null, results);
  51. }
  52. });
  53. });
  54. });
  55. };
  56. walk("/storage/samba/Music", function(err, results) {
  57. if (err) throw err;
  58. var query = 'INSERT INTO songs(filename,artist,title) values ? on duplicate key update artist=artist,title=title';
  59. var res = [];
  60. for( r in results) {
  61. var s = [];
  62. var meta = tags(results[r]);
  63. s.push(results[r]);
  64. s.push(meta.artist);
  65. s.push(meta.title);
  66. res.push(s);
  67. }
  68. connection.query(query, [res], function(err, result) {
  69. if (err) throw err;
  70. connection.end();
  71. });
  72. });