Как получить историю песен сервера Icecast - PullRequest
0 голосов
/ 03 марта 2020

Я интегрирую потоковую трансляцию с сервера icecast в свой собственный аудиоплеер, используя PHP. Мне нужно показать недавно сыгранные песни в плеере. Но я не могу получить его, используя код ниже:

$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 в браузере, он показывает только текущую песню в веб-интерфейсе.

Может кто-нибудь направить мне о том, как я могу это сделать?

1 Ответ

0 голосов
/ 22 марта 2020

Сервер Icecast не имеет встроенной функции (в отличие от Shoutcast) для получения списка воспроизведения. Одним из решений является создание списка воспроизведения самостоятельно с использованием кода, который у вас уже есть.

Я бы создал задание CRON, которое извлекает данные сервера каждые x секунд (возможно, каждые 30 секунд).

Сначала сохраните данные текущей структурированной песни в базе данных (или даже в файле / кэше). Добавьте метку времени, чтобы зарегистрировать первое вхождение песни. Затем проверьте, отличаются ли вновь полученные данные от старых, сравнив, например, старые и новые $xml->trackList->track->title.

Если они отличаются, добавьте новую запись в базу данных / кэш с новой отметкой времени. Таким образом, вы можете создать список воспроизведения со временем воспроизведения песни.

Мне нужно такое решение, поскольку я перешел на Icecast из-за недавних проблем с премией Shoutcast. Как только я создам достойное решение, я опубликую его здесь.

update

Во-первых, следующий гист - не код plug-n-play, и создан в качестве отправной точки для людей с базовыми знаниями PHP. Если вы просто скопируете это на свой сайт, это, вероятно, не будет работать.

Я создал базовый класс c для создания и извлечения списка воспроизведения JSON с сервера Icecast. Извлекает текущую песню с сервера, проверяет, сохранена ли она уже. Если нет, он добавляет запись в базу данных.

Для начала создайте таблицу в вашей базе данных с необходимыми полями:

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 пунктов, но вы можете изменить это в свойствах класса.

Кроме того, вы можете добавить ежедневный хрон для очистки плейлиста в конце дня. Это зависит от того, как долго вы хотите, чтобы ваш плейлист был.

Вы можете просмотреть суть здесь: https://gist.github.com/sanderdewijs/5eb38e4f4ce7fca631fb44a182e2b97a

...