当前位置: 首页 > 知识库问答 >
问题:

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

邹坚壁
2023-03-14
$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,它在web界面中只显示当前歌曲。

有人能指导我如何完成这件事吗?

共有1个答案

聂迪
2023-03-14

Icecast服务器没有内置功能(不像Shoutcast)来检索播放列表。一个解决方案是使用已经有的代码自己构建一个播放列表。

我将创建一个CRON作业,它每x秒(可能每30秒)获取服务器数据。

首先,将当前结构化的歌曲数据存储在数据库(甚至文件/缓存)中。添加一个时间戳来记录歌曲的第一次出现。然后通过比较新旧$xml->tracklist->track->title来检查新获取的数据是否与旧数据不同。

我创建了一个用于从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提要的endpoint中,只需回显$songInfoClass->getPlayList(),它就可以从数据库中获取最新的结果。playist长度已设置为20项,但您可以在类属性中更改此值。

 类似资料:
  • 我在从React路由器v3迁移到v4时遇到了一些小问题。在v3中,我可以在任何地方执行此操作: 如何在v4中实现这一点。 我知道,当您在组件中时,我可以使用hoc、react context或event router道具。但我不是这样。 我正在寻找v4中组件的外部导航的等价性

  • 问题内容: 我从React-Router v3迁移到v4时遇到一些小问题。在v3中,我可以在任何地方执行此操作: 如何在v4中实现这一目标。 我知道当您在Component中时,可以使用hoc ,react上下文或事件路由器props。但对我而言并非如此。 我正在寻找v4中的NavigatingOutsideOfComponents的等效项 问题答案: 您只需要有一个导出对象的模块。然后,您将在整

  • }返回shim.success(零) 然而,每次我检查chaincode容器,它只打印最后的贸易价值比它所经历的更新次数,谁能让我知道我在这里做错了什么?

  • 我能够在Hyperledger(fabric实现)中进行事务处理。我希望通过传递用户的密钥来查看由用户发起的所有事务及其有效载荷细节。

  • 在我的react js应用程序中,我想实现服务器端渲染。因此,我遵循了这个repo。 现在我遇到了这个错误。 不变冲突:浏览器历史记录需要DOM 我以为这是错误。但是我已经导入了router并使用了函数。但我也犯了同样的错误。 app.js(客户端根文件) js(路由文件) js(服务器端文件) 我不知道实际的问题是什么。我搜索了很多google.checked这个qsalso.but没有结果。我

  • 读取播放历史信息 调用地址 http://api.bilibili.cn/history 返回 返回值字段 字段类型 字段说明 results int 返回的记录总数目 list object 返回数据 返回字段 “list” 子项 返回值字段 字段类型 字段说明 aid int 视频编号 typeid int 视频分类ID typename string 视频分类名称 title string