mp3-stream-title
Version:
Получение названия текущей песни из MP3 радиопотока с ICY-метаданными
58 lines (48 loc) • 1.76 kB
JavaScript
import http from "http";
import { URL } from "url";
export const getMp3StreamTitle = (streamingUrl) => {
console.log("Fetching title for stream:", streamingUrl);
return new Promise((resolve, reject) => {
const parsedUrl = new URL(streamingUrl);
const options = {
hostname: parsedUrl.hostname,
path: parsedUrl.pathname,
port: parsedUrl.port || 80,
headers: {
"Icy-MetaData": 1,
"User-Agent": "Mozilla/5.0",
},
};
const req = http.get(options, (res) => {
console.log("Received response from stream URL:", streamingUrl);
const icyMetaInt = parseInt(res.headers["icy-metaint"]);
if (!icyMetaInt) {
console.error("No icy-metaint found");
return reject("No icy-metaint found");
}
let audioData = Buffer.alloc(0);
let metaDataRead = false;
res.on("data", (chunk) => {
audioData = Buffer.concat([audioData, chunk]);
if (!metaDataRead && audioData.length >= icyMetaInt + 1) {
const metadataLength = audioData[icyMetaInt] * 16;
if (audioData.length >= icyMetaInt + 1 + metadataLength) {
const metadata = audioData
.slice(icyMetaInt + 1, icyMetaInt + 1 + metadataLength)
.toString();
const match = /StreamTitle='([^']*)'/.exec(metadata);
const title = match ? match[1] : "Unknown";
metaDataRead = true;
res.destroy();
console.log("Found title:", title);
resolve(title);
}
}
});
});
req.on("error", (err) => {
console.error("Error fetching stream title:", err);
reject(err);
});
});
};