David 11 anos atrás
commit
da12d2ea58
2 arquivos alterados com 132 adições e 0 exclusões
  1. 53 0
      livestream.js
  2. 79 0
      tagger.js

+ 53 - 0
livestream.js

@@ -0,0 +1,53 @@
+var child_process 	= require("child_process");
+var http			= require('http');
+var url				= require('url');
+
+var liveStream = function (req, resp) {                                            // handle each client request by instantiating a new FFMPEG instance
+    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;
+
+    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);
+
+    transcoder.stdout.on("data",function(data) { });
+
+    transcoder.stderr.on("data", function (data) {
+        console.log(" -> " + data);
+    });
+
+    transcoder.on("exit", function (code) {
+        console.log( " live FFMPEG terminated with code " + code);
+    });
+
+    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");

+ 79 - 0
tagger.js

@@ -0,0 +1,79 @@
+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) {
+	try {
+		var tag = taglib.tagSync(path);
+		if(!tag.isEmpty())
+			return { 'artist': tag.artist, 'title': tag.title}; 
+		else
+			return {'artist': '', 'title': ''};
+	} catch (ex) {
+		return {'artist': '', 'title': ''};
+	}
+}
+
+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);
+        }
+      });
+    });
+  });
+};
+
+
+walk("/storage/samba/Music", function(err, results) {
+	if (err) throw err;
+	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);
+	}
+
+	connection.query(query, [res], function(err, result) {
+	  if (err) throw err;
+	  connection.end();
+	});
+});