tagger.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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" ]; //3289 songs in 37sec
  12. function endsWith(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; }
  13. function validMusicFile(path){
  14. for (ext in validExtensions)
  15. if (endsWith(path, validExtensions[ext]))
  16. return true;
  17. return false;
  18. }
  19. function tags(path) {
  20. try {
  21. var tag = taglib.tagSync(path);
  22. if(!tag.isEmpty())
  23. return { 'artist': tag.artist, 'title': tag.title};
  24. else
  25. return {'artist': '', 'title': ''};
  26. } catch (ex) {
  27. return {'artist': '', 'title': ''};
  28. }
  29. }
  30. var fs = require('fs');
  31. var path = require('path');
  32. var walk = function(dir, done) {
  33. var results = [];
  34. fs.readdir(dir, function(err, list) {
  35. if (err) return done(err);
  36. var pending = list.length;
  37. if (!pending) return done(null, results);
  38. list.forEach(function(file) {
  39. file = path.resolve(dir, file);
  40. fs.stat(file, function(err, stat) {
  41. if (stat && stat.isDirectory()) {
  42. walk(file, function(err, res) {
  43. results = results.concat(res);
  44. if (!--pending) done(null, results);
  45. });
  46. } else {
  47. if (validMusicFile(file))
  48. results.push(file);
  49. if (!--pending) done(null, results);
  50. }
  51. });
  52. });
  53. });
  54. };
  55. var populate = function(path) { //"/storage/samba/Music"
  56. var query = 'INSERT INTO songs(filename,artist,title) values ? on duplicate key update artist=artist,title=title';
  57. var res = [];
  58. walk(path, function(err, results) {
  59. if (err) throw err;
  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. });
  73. }
  74. var pathFromID = function(id, callback){
  75. var query = 'select filename from songs where id=? limit 1';
  76. connection.query(query, id, function(err, result) {
  77. if(result.length==1)
  78. callback(result[0].filename);
  79. //connection.end();
  80. });
  81. };
  82. var getArtist= function(artist, callback){
  83. var query = 'select * from songs where artist like ?';
  84. connection.query(query, "%"+artist+"%", function(err, result) {
  85. callback(result);
  86. //connection.end();
  87. });
  88. };
  89. module.exports.pathFromID=pathFromID;
  90. module.exports.getArtist=getArtist;
  91. module.exports.populate=populate;