如何获取Icecast服务器歌曲历史记录

时间:2020-03-03 07:27:12

标签: 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,它也会在网络界面中仅显示当前歌曲。

有人可以指导我如何完成它吗?

2 个答案:

答案 0 :(得分:1)

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 feed的端点中,只需回显$songInfoClass->getPlaylist(),它就会从数据库中获取最新结果。播放器的长度已设置为20个项目,但是您可以在课程属性中更改。

此外,您可以在每天结束时添加每日计划,以清理播放列表。这取决于您希望播放列表保留多长时间。

您可以在此处查看要点: https://gist.github.com/sanderdewijs/5eb38e4f4ce7fca631fb44a182e2b97a

答案 1 :(得分:0)

您可以读取播放列表日志文件并解析所需挂载点的过滤。

记录文档:https://icecast.org/docs/icecast-trunk/config_file/#logging-settings

播放列表的日志文件尾部示例:

server:~$ sudo tail -f /var/log/icecast2/playlist.icecast.log
29/Jun/2021:14:14:40 -0400|/grandefm|0|Hawai - Maluma
29/Jun/2021:14:17:55 -0400|/grandefm|1|Lean On (feat M And DJ Snake) - Major Lazer
29/Jun/2021:14:21:10 -0400|/grandefm|1|Grande FM 92,1 Mhz - DouradosMS
29/Jun/2021:14:26:25 -0400|/grandefm|1|Big In Japan - ALPHAVILLE
29/Jun/2021:14:29:55 -0400|/grandefm|1|Grande FM 92,1 Mhz - DouradosMS
29/Jun/2021:14:30:10 -0400|/grandefm|1|Tarzan Boy - Baltimora
29/Jun/2021:14:34:40 -0400|/grandefm|1|Grande FM 92,1 Mhz - DouradosMS
29/Jun/2021:14:34:58 -0400|/grandefm|1|Cheirosa - Jorge e Mateus
29/Jun/2021:14:37:40 -0400|/grandefm|2|Prudente - Thiaguinho
29/Jun/2021:14:40:55 -0400|/grandefm|2|Grande FM 92,1 Mhz - DouradosMS
29/Jun/2021:14:45:10 -0400|/grandefm|2|Paradise - Meduza Part. Dermot Kennedy