tagger.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. var empty = {'artist': '', 'title': '', 'album': ''};
  21. try {
  22. var tag = taglib.tagSync(path);
  23. if(!tag.isEmpty())
  24. return { 'artist': tag.artist, 'title': tag.title, 'album': tag.album};
  25. else
  26. return empty;
  27. } catch (ex) {
  28. return empty;
  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. var populate = function(path) { //"/storage/samba/Music"
  57. var query = 'INSERT INTO songs(filename,artist,title,album,added_on) values ? on duplicate key update artist=artist,title=title,album=album';
  58. var res = [];
  59. var now = {};
  60. walk(path, function(err, results) {
  61. if (err) throw err;
  62. for( r in results) {
  63. var s = [];
  64. var meta = tags(results[r]);
  65. s.push(results[r]);
  66. s.push(meta.artist);
  67. s.push(meta.title);
  68. s.push(meta.album);
  69. res.push(s);
  70. }
  71. connection.query(query, [res], function(err, result) {
  72. if (err) throw err;
  73. console.log("Finished");
  74. //connection.end();
  75. });
  76. });
  77. }
  78. var pathFromID = function(id, callback){
  79. var query = 'select filename from songs where id=? limit 1';
  80. connection.query(query, id, function(err, result) {
  81. if(result.length==1)
  82. callback(result[0].filename);
  83. //connection.end();
  84. });
  85. };
  86. var getArtist= function(artist, callback){
  87. var query = 'select * from songs where artist like ?';
  88. connection.query(query, "%"+artist+"%", function(err, result) {
  89. callback(result);
  90. //connection.end();
  91. });
  92. };
  93. var getArtists=function(callback){
  94. var query = 'select distinct(artist) from songs order by artist';
  95. connection.query(query, function(err, result) {
  96. callback(result);
  97. });
  98. };
  99. var getAlbums=function(callback){
  100. var query = 'select artist,album from songs group by album order by artist';
  101. connection.query(query, function(err, result) {
  102. callback(result);
  103. });
  104. };
  105. var getAlbumByArtist=function(callback){
  106. var query = 'select album from songs group by artist order by album';
  107. connection.query(query, function(err, result) {
  108. callback(result);
  109. });
  110. }
  111. module.exports.pathFromID=pathFromID;
  112. module.exports.getArtist=getArtist;
  113. module.exports.getArtists=getArtists;
  114. module.exports.getAlbums=getAlbums;
  115. module.exports.populate=populate;
  116. //populate("/storage/samba/Music");