如果广告元数据,则插入mp3
所以我现在在读取元数据并在播放器中播放电台的地方工作。
但是我似乎无法更改请求文件以在需要时注入mp3。
因此,如何暂停1个请求或在需要时更改请求(来回)。
var http = require('http'),
request = require('request');
var icecast = require('icecast-stack');
remote = ':8003/stream';
var stream = icecast.createReadStream(remote);
var remoteUrl = remote;
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'audio/mpeg'
});
stream.on('connect', function() {
console.error("Radio Stream connected!");
});
stream.on('metadata', function(metadata) {
var title = icecast.parseMetadata(metadata).StreamTitle;
if(title === "SkypeTherapy.pro - Ad 1 [2b]"){
console.error("advert");
}
else{
remote='.mp3';
remoteUrl = remote+"?=Player" + req.url;
console.error(title);
console.error(remoteUrl);
}
});
// .bin
remoteUrl = remote+"?=Player" + req.url;
console.error(remoteUrl);
//stream.pipe(process.stdout);/
request(remoteUrl).pipe(res);
}).listen(8080);
更新后的尝试仍然不起作用
var http = require('http'),
request = require('request');
var icecast = require('icecast-stack');
remote = ':8003/stream';
var stream = icecast.createReadStream(remote);
var remoteUrl = remote;
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'audio/mpeg'
});
stream.on('connect', function() {
console.error("Radio Stream connected!");
});
stream.on('metadata', function(metadata) {
var title = icecast.parseMetadata(metadata).StreamTitle;
if(title === "SkypeTherapy.pro - Ad 1 [2b]"){
console.error("advert");
}
else{
remote='.mp3';
remoteUrl = remote+"?=Player" + req.url;
if(remoteUrl !== remoteUrl){
request.get(remoteUrl)
.on('response', response => {
console.error(title);
console.error(remoteUrl);
// pipe response to res
// since response is an http.IncomingMessage
response.pipe(res);
});
}
}
});
// .bin
remoteUrl = remote+"?=Player" + req.url;
//console.error(remoteUrl);
//stream.pipe(process.stdout);/
request(remoteUrl).pipe(res)
}).listen(8080);
回答如下:这是一个简单的示例,在该示例中,它关闭流并在10秒后重新打开它。因此,基本上,您可以使其适应于返回服务器并更改流的地址,等等。示例从此处How do I shutdown a Node.js http(s) server immediately?
// Create a new server on port 4000
var http = require('http');
request = require('request');
var icecast = require('icecast-stack');
let remote = 'http://stream.radiomedia.au:8003/stream';
var stream = icecast.createReadStream(remote);
var remoteUrl = remote;
var server = http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'audio/mpeg'
});
stream.on('connect', function() {
console.error("Radio Stream connected!");
});
stream.on('metadata', function(metadata) {
var title = icecast.parseMetadata(metadata).StreamTitle;
if(title === "SkypeTherapy.pro - Ad 1 [2b]"){
console.error("advert");
}
else{
remote='https://storage.googleapis/radiomediapodcast/Kegleg/season1/S01E03.mp3';
remoteUrl = remote+"?=Player" + req.url;
console.error(title);
console.error(remoteUrl);
}
});
// http://somewhere/noo.bin
remoteUrl = remote+"?=Player" + req.url;
console.error(remoteUrl);
// stream.pipe(process.stdout);
request(remoteUrl).pipe(res);
}).listen(4000);
// Maintain a hash of all connected sockets
var sockets = {}, nextSocketId = 0;
server.on('connection', function (socket) {
// Add a newly connected socket
var socketId = nextSocketId++;
sockets[socketId] = socket;
console.log('socket', socketId, 'opened');
// Remove the socket when it closes
socket.on('close', function () {
console.log('socket', socketId, 'closed');
delete sockets[socketId];
});
// Extend socket lifetime for demo purposes
socket.setTimeout(4000);
});
function two() {
var server2 = http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'audio/mpeg'
});
stream.on('connect', function() {
console.error("Radio Stream connected!");
});
stream.on('metadata', function(metadata) {
var title = icecast.parseMetadata(metadata).StreamTitle;
if(title === "SkypeTherapy.pro - Ad 1 [2b]"){
console.error("advert");
}
else{
remote='https://storage.googleapis/radiomediapodcast/Kegleg/season1/S01E03.mp3';
remoteUrl = remote+"?=Player" + req.url;
console.error(title);
console.error(remoteUrl);
}
});
// http://somewhere/noo.bin
remoteUrl = remote+"?=Player" + req.url;
console.error(remoteUrl);
// stream.pipe(process.stdout);
request(remoteUrl).pipe(res);
}).listen(4000);
// Maintain a hash of all connected sockets
var sockets = {}, nextSocketId = 0;
server2.on('connection', function (socket) {
// Add a newly connected socket
var socketId = nextSocketId++;
sockets[socketId] = socket;
console.log('socket', socketId, 'opened');
// Remove the socket when it closes
socket.on('close', function () {
console.log('socket', socketId, 'closed');
delete sockets[socketId];
});
// Extend socket lifetime for demo purposes
socket.setTimeout(4000);
});
}
// Count down from 10 seconds
(function countDown (counter) {
console.log(counter);
if (counter > 0)
return setTimeout(countDown, 1000, counter - 1);
// Close the server
server.close(function () { console.log('Server closed!'); });
// Destroy all open sockets
for (var socketId in sockets) {
console.log('socket', socketId, 'destroyed');
sockets[socketId].destroy();
}
two();
})(10);