Добавляю функционал на радио. На этот раз задача простая: показывать историю треков.
Было легко найти скрипт, показывающий текущую песню, но вот найти такой для показа истории треков (последние N песен на радио) нет. Приходится делать самостоятельно:
Log file
Идем в конфигурационный файл etc/icecast2/icecast.xml. Положение файла настраивается здесь:
После находим настройки <logging>
. Убираем комментирование со строки
В стандартной настройке файл перезаписывается когда достигает определённого (<logsize>
) размера. Если настроить <logarchive>
, при достижении указанного размера создаётся новый файл с обозначением даты и времени.
Осталось сделать скрипт, который выдавал бы последние N песен для определённой радиостанции. Казалось бы. На моём сервере для радио нет поддержки php, поэтому делаю обходной путь: создаю ярлык .log файла в читаемую директорию:
ln -s /var/log/icecast2/playlist.log /usr/share/icecast2/web
Теперь этот файл доступен по адресу http://127.0.0.69:8000/playlist.log, и вот его сможет прочитать php файл на другом сервере. (Если поддержка php на сервере, откуда и играет радио, есть, переходите сразу вниз к готовому скрипту.)
Проверяем скрипт:
<?php
$file = file_get_contents("http://127.0.0.69:8000/playlist.log"); //Читаем файл
echo $file;
?>
Видим лог. Если лог не видно - проверьте оригинальный .log файл, есть ли что-нибудь там? Стандартный лог выглядит примерно так:
12/Jul/2019:08:15:35 -0400|/radio|0|Bryan Adams - Run To You
12/Jul/2019:08:15:47 -0400|/listen.mp3|1|Tame Impala - Reality In Motion
12/Jul/2019:08:17:28 -0400|/radio|0|Glenn Frey - You Belong To The City
12/Jul/2019:08:19:58 -0400|/listen.mp3|1|The Prodigy - Take Me To The Hospital
Осталось отформатировать его и привести в читаемый вид. Спасибо посту 6-летней давности на форуме radiotalk, я разобрался, как правильно сделать это.
Готовый скрипт:
<?php
$data = file("http://127.0.0.69:8000/playlist.log", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$track_count=0;
for($i=count($data)-1;$i>0;$i--){
$mass = explode("|",$data[$i]);
if ($mass[1] == '/listen.mp3'){
if ($track_count>0){
echo $mass[3]."<br>";
}
if ($track_count++==10) break;
}
}
?>
Я заменил file_get_contents()
на file()
(отличие в том, что первая функция читает файл в строку, а вторая - в массив строк). Скрипт читает файл в массив, затем с помощью explode() разделяет его (разделитель - "|") на несколько частей. Возьмём строчку:
12/Jul/2019:12:40:17 -0400|/listen.mp3|1|Hall and Oates - Out of Touch
Схематично:
----------mass[0]---------|--mass[1]--|mass[2]|----------mass[3]---------
Нам нужна четвёртая часть, она же mass[3]
.
В данном случае мы получим последние 10 песен, исключая ту, которая играет в данный момент (если нужна и она - заменяем 1 на 0 в 4 строке скрипта) на радио 127.0.0.69:8000/listen.mp3: