В ходе настройки радиостанции я столкнулся с некоторыми проблемами, о которых хочу рассказать и вам, мои читатели. Постараюсь лаконично и в форме коротких советов.

Разгрузи «мыло»!

Достаточно сложные обработчики метаданных, описанные мною статьями ранее, следует подключать только к потоку музыки. Ни в коем случае не цепляйте их на результирующий поток: при подключении ведущего могут возникнуть проблемы! К тому же, ведущие могут испортить метаданные, которые затем попадут и в каталоги радио. Для потоков эфира следует написать простенький обработчик, достаточно лишь корректировки входящих метаданных.

Многие трансляторы отправляют только title

И совсем забывают, что в нормальном протоколе ICY поддерживается как title, так и artist. Поэтому, как сказано ранее, для потока ведущего следует написать простой обработчик, восстанавливающий по возможности все теги. Например, вот такой:

def update_title_live(m) =
        if m["title"] == "" or m["title"] == "Unknown" then
                [("title", "Provoda.ch Live Broadcast"),
                 ("artist", "")]
        else
                if m["artist"] == "" or m["artist"] == "?" then
                        meta = string.extract(pattern='(.+)\s+-\s+(.+)', m["title"])
                        sArtist = meta["1"]
                        sTitle  = meta["2"]

                        [("title", sTitle),
                         ("artist", "[Provoda.ch Live] #{sArtist}")]
                else
                        sArtist = string.recode(out_enc="UTF-8", m["artist"])
                        sTitle = string.recode(out_enc="UTF-8", m["title"])
                        [("title", sTitle),
                         ("artist", "[Provoda.ch Live] #{sArtist}")]
                end
        end
end

По желанию можно, например, как в коде выше, дописать рекламку станции.

Генератор приостанавливает потоки

Когда ведущий подключается к эфиру, поток с музыкой ставится на паузу. Это тесно связано с советами выше: не бойтесь делать разные обработчики для разных потоков: они не будут висеть «в фоне», а приостановятся.

 Следи за логами

Следите, чтобы в логах не было фразы «We must catchup %d seconds!», это верный признак перегруженности сервера. Такие сообщения могут быть предвестниками зависаний и заиканий потока. Максимально допустимое время для «catchup» — 5 секунд, дальше начнутся ощутимые потери и прерывания.

«Мыло» не умеет в многоядерные процессоры

Это связано с особенностями языка, на котором оно написано — OCaml. Соответственно, кодирование Liquidsoap выполняет на одном ядре. Если у вас на сервере содержится несколько радиостанций, желательно для каждой написать отдельный скрипт и запустить в отдельном процессе: уж здесь операционная система разберётся, кому какое ядро дать, и всё будет хорошо. Также не следует перегружать скрипты кодировщиками («output»), это тоже может вызвать дисбаланс в нагрузке и те самые «catchup».