История треков на радио (Icecast)

Добавляю функционал на радио. На этот раз задача простая: показывать историю треков.

Было легко найти скрипт, показывающий текущую песню, но вот найти такой для показа истории треков (последние N песен на радио) нет. Приходится делать самостоятельно:

Log file

Идем в конфигурационный файл etc/icecast2/icecast.xml. Положение файла настраивается здесь: /var/log/icecast2

После находим настройки <logging>. Убираем комментирование со строки playlist.log. Перезагружаем сервер. Теперь плейлист на все станции на сервере будет записываться в этот файл.

В стандартной настройке файл перезаписывается когда достигает определённого (<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:

July 18, 2019