UNPKG

mp3-stream-title

Version:

Получение названия текущей песни из MP3 радиопотока с ICY-метаданными

58 lines (48 loc) 1.76 kB
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); }); }); };