icy-metadata
Version:
Inject icy metadata to stream. Allow to display text info during stream plays (like station name or song title)
53 lines (47 loc) • 1.86 kB
JavaScript
let IcyMetadata = require('./icy-metadata'),
express = require('express'),
fs = require('fs'),
app = express(),
readStream = null,
streamSource = ['./samples/01.mp3', './samples/02.mp3'],
streamIndex = 0,
icyMetadata = new IcyMetadata(30000),
exampleDescription = 'Open "Winamp" or e.t. then play stream url "http://localhost/stream" to see stream metadata.',
storedResponse;
app.get('/', function(request, response) {
response.send('<html><body>' + exampleDescription + '</body></html>');
});
app.listen(80, 'localhost', function() {
console.log(exampleDescription);
});
let playNextSource = () => {
if (streamIndex >= streamSource.length){
return;
}
streamIndex++;
var newReadStream = fs.createReadStream(streamSource[streamIndex]);
var newIcyMetadata = new IcyMetadata(30000, icyMetadata.bytesBeforeMeta);
newIcyMetadata.setStreamTitle('some drum roll');
newReadStream.pipe(newIcyMetadata).pipe(storedResponse, {end: false});
readStream.close();
icyMetadata.unpipe();
}
app.get('\/stream', function(request, response) {
if (!readStream) {
readStream = fs.createReadStream(streamSource[streamIndex]);
readStream.on('end', playNextSource)
let header = {
'icy-name': 'icy-metadata usage example',
'Content-Type': 'audio/mpeg',
'icy-metaint': icyMetadata.metaInt,
'Connection': 'keep-alive'
};
response.writeHead(200, header);
icyMetadata.setStreamTitle('Super Mario Bros');
readStream.pipe(icyMetadata).pipe(response, {end: false});
storedResponse = response;
} else {
response.send('<html><body>Only one connection allowed for this example</body></html>');
}
});
exports = app;