Что играет на радио?

30 апреля 2012, 22:39

Делая вторую версию лампача столкнулся с интересной проблемой — получение тегов из определенного интернет-потока. Готовый инструмент так и не нашёл, пришлось изучать матчасть и писать свой.

Итак, вкратце.
Существует два гиганта интернет-радиовещания: Shoutcast и Icecast. Я предпочитаю второй по многим субъективным причинам, но нужно решение универсальное. Различий в протоколе у них нет, разве что шоуткасту нужно насильно сказать, что я хочу получать от него теги помимо мп3-потока.

Сам протокол представляет собой обычный хттп, оформленный в виде непрерывного октет-стрима. Поэтому его можно даже скачивать браузером, на выходе получим обычный мп3 файл. Но можно также получить различные плюшки в виде тегов и описания потока. Если правильно попросить.

При хттп-запросе потока нужно дополнительно указать заголовок «Icy-MetaData:1» и юзер-агент какого-нибудь плеера. Некоторые серверы, получая юзер-агент браузера, выдают статусную страничку с количеством слушателей, битрейтом, и прочими ненужными в данный момент. А нам нужен именно поток. После того, как получили правильный контент, осталось считать заголовки ответа и найти среди них «icy-metaint».

Тут первая странность протокола — теги отдаются не сразу. Обычно нужно скачать секунду потока, а там уже лежит заветное название трека. Тут то и пригодится заголовок «icy-metaint», который хранит смещение в байтах, через которое прервется поток и пойдут мета-данные. Пропускаем mp3 данные, читаем один байт и умножаем его значение на 16. Столько байтов будет размер самих данных. Считываем их и радуемся — у нас есть теги.

Алсо, после нескольких тестов на разных радиостанциях заметил интересную особенность: ICY заголовки могут в http идти как обычными заголовками, так и обычным текстом. Пришлось учесть.

В скрипт осталось добавить поддержку локейшен-редиректов и все точно будут счастливы.

Скачать готовый скрипт на питоне.


4 комментария

АНОНИМУСЫ

Глиро! Где наше радио! ААААААаааааааааааааа!

Глиро

Скоро будет, не переживайте

кувтусл

Ссылка не работает

кувтусл

Ваш комментарий

адрес не будет опубликован

ХТМЛ не работает


Ctrl + Enter