Сервер 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