| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- 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) {
- var empty = {'artist': '', 'title': '', 'album': ''};
- try {
- var tag = taglib.tagSync(path);
- if(!tag.isEmpty())
- return { 'artist': tag.artist, 'title': tag.title, 'album': tag.album};
- else
- return empty;
- } catch (ex) {
- return empty;
- }
- }
- 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);
- }
- });
- });
- });
- };
- var populate = function(path) { //"/storage/samba/Music"
- var query = 'INSERT INTO songs(filename,artist,title,album,added_on) values ? on duplicate key update artist=artist,title=title,album=album';
- var res = [];
- var now = {};
- walk(path, function(err, results) {
- if (err) throw err;
- for( r in results) {
- var s = [];
- var meta = tags(results[r]);
- s.push(results[r]);
- s.push(meta.artist);
- s.push(meta.title);
- s.push(meta.album);
- res.push(s);
- }
-
- connection.query(query, [res], function(err, result) {
- if (err) throw err;
- console.log("Finished");
- //connection.end();
- });
- });
- }
- var pathFromID = function(id, callback){
- var query = 'select filename from songs where id=? limit 1';
- connection.query(query, id, function(err, result) {
- if(result.length==1)
- callback(result[0].filename);
- //connection.end();
- });
- };
- var getArtist= function(artist, callback){
- var query = 'select * from songs where artist like ?';
- connection.query(query, "%"+artist+"%", function(err, result) {
- callback(result);
- //connection.end();
- });
- };
- var getArtists=function(callback){
- var query = 'select distinct(artist) from songs order by artist';
- connection.query(query, function(err, result) {
- callback(result);
- });
- };
- var getAlbums=function(callback){
- var query = 'select artist,album from songs group by album order by artist';
- connection.query(query, function(err, result) {
- callback(result);
- });
- };
- var getAlbumByArtist=function(artist, callback){
- var query = 'select album from songs where artist like ? group by album order by album';
- connection.query(query, "%"+artist+"%", function(err, result) {
- callback(result);
- });
- }
- var getAllArtistWithAlbums=function(callback){
- var query = 'select artist,album from songs group by artist,album order by artist,album';
- var b={};
- connection.query(query, function(err, result) {
- for (el in result) {
- var key=result[el].artist;
- if (key==null || key==undefined)
- key="";
- key=key.toString();
- if(b[key]===undefined)
- b[key]=[];
- b[key].push(result[el].album);
- }
- callback(b);
- });
- }
- module.exports.pathFromID=pathFromID;
- module.exports.getArtist=getArtist;
- module.exports.getArtists=getArtists;
- module.exports.getAlbums=getAlbums;
- module.exports.getAlbumByArtist=getAlbumByArtist;
- module.exports.populate=populate;
- module.exports.getAllArtistWithAlbums=getAllArtistWithAlbums;
- //populate("/storage/samba/Music");
|