簡體   English   中英

如何獲取 Icecast 服務器歌曲歷史記錄

[英]How to get Icecast server songs history

我正在使用 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 ,它只會在 Web 界面中顯示當前歌曲。

有人可以指導我如何完成它嗎?

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

要使用它,您可能需要創建一個使用$songInfoClass->fetchSongInfo()每分鍾左右獲取歌曲信息的 cronjob。 然后在輸出 JSON 提要的端點中,您只需回顯$songInfoClass->getPlaylist()並從數據庫中獲取最新結果。 播放列表長度已設置為 20 個項目,但您可以在類屬性中更改此設置。

此外,您可以添加每日 cron 以在一天結束時清理播放列表。 這取決於您希望播放列表的長度。

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

您可以讀取播放列表日志文件並解析所需掛載點的過濾。

日志記錄文檔: 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM