Przeglądaj źródła

refactor+artist+path from id

David 11 lat temu
rodzic
commit
a03e68c168
2 zmienionych plików z 81 dodań i 56 usunięć
  1. 35 39
      backend/livestream.js
  2. 46 17
      backend/tagger.js

+ 35 - 39
backend/livestream.js

@@ -1,53 +1,49 @@
 var child_process 	= require("child_process");
-var http			= require('http');
+var express			= require('express');
 var url				= require('url');
-
-var liveStream = function (req, resp) {                                            // handle each client request by instantiating a new FFMPEG instance
+var tagger			= require('./tagger');
+
+var app = express();
+app.get('/artist/:artist', function (req, resp) {
+	var artist = req.params.artist;
+	function f(a){
+		resp.send(JSON.stringify(a));
+	}
+	tagger.getArtist(artist,f);
+});
+app.get('/song/:song', function (req, resp) {
     resp.writeHead(200, {
           "Connection": "keep-alive"
         , "Content-Type": "audio/ogg"
         , "Accept-Ranges": "bytes"                 // Helps Chrome
     });
 
-	var song = "/storage/samba/Music/Chvrches - Every Open Eye/02 Leave A Trace.mp3";
-
-	var query = url.parse(req.url, true).query;
-	if ("song" in query)
-		song=query.song;
+	var song = req.params.song;
+	if (isNumeric(song)){
+		tagger.pathFromID(song, transcode);
+	}else{
+		transcode(song);
+	}
 
-    transcoder = child_process.spawn("/usr/bin/ffmpeg", [ "-i",song,	"-c:a", "libvorbis", "-vn", "-b:a", "192k", "-f", "ogg", "-y", "-" ],  {detached: false});
-    transcoder.stdout.pipe(resp);
+	function transcode(path){
+		console.log("Transcoding " + path);
+   		transcoder = child_process.spawn("/usr/bin/ffmpeg", [ "-i",path,	"-c:a", "libvorbis", "-vn", "-b:a", "192k", "-f", "ogg", "-y", "-" ],  {detached: false});
+   		transcoder.stdout.pipe(resp);
 
-    transcoder.stdout.on("data",function(data) { });
+   		transcoder.stdout.on("data",function(data) { });
+   		req.on("close", function () { shutStream("closed") })
+   		req.on("end", function () { shutStream("ended") });
 
-    transcoder.stderr.on("data", function (data) {
-        console.log(" -> " + data);
-    });
+   		function shutStream(event) {
+   		    if (typeof transcoder !== "undefined")
+   		        transcoder.kill();
+   		}
+	}
+    return true;
+});
 
-    transcoder.on("exit", function (code) {
-        console.log( " live FFMPEG terminated with code " + code);
-    });
+var server = app.listen(1337, function () {
+});
 
-    transcoder.on("error", function (e) {
-        console.log(" live FFMPEG system error: " + e);
-    });
-
-    req.on("close", function () {
-        shutStream("closed")
-    })
-    
-    req.on("end", function () {
-        shutStream("ended")
-    });
 
-    function shutStream(event) {
-        console.log("Live streaming connection to client has " + event)
-        if (typeof transcoder !== "undefined") {
-            transcoder.kill();
-        }
-    }
-    return true
-}
-
-http.createServer(liveStream).listen(1337, "0.0.0.0");
-console.log("runnen");
+function isNumeric(n) { return !isNaN(parseFloat(n)) && isFinite(n); }

+ 46 - 17
backend/tagger.js

@@ -6,20 +6,21 @@ var connection = require('mysql').createConnection({
   password: 'music',
   database: 'music',
   socketPath: '/var/run/mysqld/mysqld.sock'
-  });
+});
 
 connection.connect();
 
-var validExtensions = [ "mp3","aac","flac","alac","ogg","m4a" ];
-//3289 songs in 37sec
+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);
@@ -59,21 +60,49 @@ var walk = function(dir, done) {
 };
 
 
-walk("/storage/samba/Music", function(err, results) {
-	if (err) throw err;
+var populate = function(path) { //"/storage/samba/Music"
 	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);
-	}
+	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);
+			res.push(s);
+		}
+	
+		connection.query(query, [res], function(err, result) {
+			if (err) throw err;
+			//connection.end();
+		});
+	});
+
+}
 
-	connection.query(query, [res], function(err, result) {
-	  if (err) throw err;
-	  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();
+	});
+
+};
+
+module.exports.pathFromID=pathFromID;
+module.exports.getArtist=getArtist;
+module.exports.populate=populate;
+