I have researched this and found that I cannot find data on our how to read live metadata from Icecast streams.
What I would like to do is something like this. Note this script may not work - it's just a concept:
var http = require('http');
var fs = require('fs');
http.createServer(function(req, res) {
res.writeHead(200, {
'Content-Type': 'audio/mp3'
});
var rs = fs.createReadStream('ICECAST STREAM');
rs.pipe(res);
})
However, when you try this script it won't work due to it can't read a remote stream.
Another issue is how do I get it to read metadata in the stream? I want to do some triggering when the metadata equals a certain tag.
Update script
var http = require('http'),fs = require('fs'),request = require('request');
var icecast = require('icecast-stack');
var url = 'http://stream.radiomedia.com.au:8003/stream'; // URL to a known Icecast stream
var stream = icecast.createReadStream(url);
http.createServer(function(request, response) {
response.writeHead(200, {
'Content-Type': 'audio/mpeg',
'Content-Length': 15000
});
// Fired when the `net.Stream` has it's 'connect' event.
stream.on('connect', function() {
console.error("Radio Stream connected!");
});
// Fired after the HTTP response headers have been received.
stream.on('response', function(res) {
console.error("Radio Stream response!");
console.error(res.headers);
});
// When a 'metadata' event happens, usually a new song is starting.
stream.on('metadata', function(metadata) {
var title = icecast.parseMetadata(metadata).StreamTitle;
if(title === "SkypeTherapy.pro - Ad 1 [2b]"){
console.error("advert");
}
else{
console.error(title);
}
});
// Proxy the raw audio stream to 'stdout', redirect to a file!
//stream.pipe(process.stdout);
http.get(url, res => res.pipe(fs.createReadStream('some.mp3')));
})
.listen(2000);
However the script does not play and instead just prints data in the console.