php - 如何获取 Icecast 服务器歌曲历史记录
问题描述
我正在使用 PHP 将来自 icecast 服务器的实时流集成到我的自定义音频播放器。我需要在播放器中显示最近播放的歌曲。但我无法使用以下代码获取它:
$XSPFurl = "http://IP:PORT/mount.xspf";
$XSPFans = file_get_contents($XSPFurl);
if ($XSPFans === false) {
return 'error';
}
$stream = $this->getXSPF($XSPFans);
$song_pieces = explode(" - ", $stream['info']['title']);
$row[0]['song_name'] = isset($song_pieces[1]) ? $song_pieces[1] : '';
$row[0]['artist'] = isset($song_pieces[0]) ? $song_pieces[0] : '';
$row[0]['time'] = 'Currently';
return $row;
function getXSPF($data) {
$xml = new SimpleXMLElement($data);
$stream['info']['title'] = (string) $xml->trackList->track->title;
$stream['info']['location'] = (string) $xml->trackList->track->location;
preg_match_all('/^(.*):(.*)/m', (string) $xml->trackList->track->annotation, $matches);
if (isset($matches[1]) && isset($matches[2])) {
$t = @array_combine($matches[1], $matches[2]);
foreach ($t as $key => $val) {
$fkey = str_replace(" ", "_", $key);
$stream['info'][strtolower($fkey)] = trim($val);
}
}
return $stream;
}
此外,如果我IP:PORT
在浏览器上访问,它只会在网络界面中显示当前歌曲。
有人可以指导我如何完成它吗?
解决方案
Icecast 服务器没有内置函数(与 Shoutcast 不同)来检索播放列表。一种解决方案是使用已有的代码自己构建播放列表。
我会创建一个 CRON 作业,每 x 秒(可能每 30 秒)获取服务器数据。
首先将当前结构化歌曲数据存储在数据库(甚至是文件/缓存)中。添加时间戳以记录歌曲的第一次出现。然后检查新获取的数据是否与旧数据不同,例如通过比较新旧数据$xml->trackList->track->title
。
如果不同,请使用新时间戳将新条目添加到数据库/缓存中。通过这种方式,您可以创建一个包含歌曲播放时间的播放列表。
由于最近的 Shoutcast 溢价问题,我目前需要这样的解决方案,因为我切换到 Icecast。一旦我创建了一个体面的解决方案,我就会在这里发布。
更新
首先,以下要点不是即插即用代码,而是为具有 PHP 基础知识的人创建的起点。如果您只是将其复制粘贴到您的站点中,它可能无法正常工作。
我创建了一个基本类,用于从 Icecast 服务器创建和检索 JSON 播放列表。它从服务器获取当前歌曲,检查它是否已经存储。如果没有,它会在数据库中添加一个条目。
首先,在您的数据库中创建一个包含必要字段的表:
CREATE TABLE `now_playing` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`playedat` varchar(255) DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`artist` varchar(255) DEFAULT NULL,
`coverImage` mediumtext,
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
要使用它,您可能需要创建一个 cronjob,每分钟左右使用$songInfoClass->fetchSongInfo()
. 然后在您输出 JSON 提要的端点中,您只需回$songInfoClass->getPlaylist()
显它就会从数据库中获取最新结果。播放器长度已设置为 20 个项目,但您可以在类属性中更改此设置。
此外,您可以添加每日 cron 以在一天结束时清理播放列表。这取决于您希望播放列表的长度。
你可以在这里查看要点: https ://gist.github.com/sanderdewijs/5eb38e4f4ce7fca631fb44a182e2b97a
推荐阅读
- casting - Rust:如何从有符号整数类型转换为更大的有符号整数类型*没有*符号扩展
- python - 为什么迭代循环不起作用
- ruby - 为什么'bundler gem'将'rake'和'rspec'添加到Gemfile而不是.gemspec文件作为开发依赖项?
- android - QT 创建者 - 部署到 Android 模拟器失败 - INSTALL_FAILED_NO_MATCHING_ABIS
- python - 发生异常:TypeError 'in
' 需要字符串作为左操作数,而不是 Series - anaconda - 从本地 C++ 程序构建 conda 包
- python - 如何在 SHAP 汇总图上绘制特定特征?
- javascript - 如何使用 HTML id 属性为使用 JavaScript 创建的元素设置样式
- javascript - 未捕获的类型错误:无法读取未定义的属性“codiCombi”
- java - 从python运行java服务器并等待它启动