Это поток SHOUTcast, и да, это возможно. Это никак не связано с тегами ID3. Недавно я написал сценарий для этого, но больше не могу его найти. Буквально на прошлой неделе я помог другому парню, у которого был довольно полный сценарий, сделать то же самое, но я не могу просто опубликовать исходный код, поскольку он не мой. Однако я свяжусь с ним, если вы напишите мне по адресу brad@musatcha.com.
В любом случае, вот как это сделать самостоятельно:
Первое, что вам нужно сделать, это подключиться к серверу напрямую. Не используйте HTTP. Ну, вы, вероятно, могли бы использовать cURL, но это, скорее всего, будет намного сложнее, чем стоит. Вы подключаетесь к нему с помощью fsockopen()
( doc ). Убедитесь, что вы используете правильный порт. Также обратите внимание, что многие веб-хосты блокируют много портов, но обычно вы можете использовать порт 80. К счастью, все потоки SHOUTcast, размещенные на AOL, используют порт 80.
Теперь сделайте ваш запрос так же, как ваш клиент.
GET /whatever HTTP/1.0
Но перед отправкой <CrLf><CrLf>
включите следующий заголовок!
Icy-MetaData:1
Это говорит серверу, что вы хотите метаданные. Теперь отправьте вашу пару <CrLf>
.
Хорошо, сервер ответит несколькими заголовками, а затем начнет отправлять вам данные. В этих заголовках будет icy-metaint:8192
или аналогичный. Этот 8192 является мета-интервалом . Это важно и действительно единственное значение, которое вам нужно. Обычно это 8192, но не всегда, поэтому обязательно прочитайте это значение!
В основном это означает, что вы получите 8192 байта данных MP3, а затем кусок мета, затем 8192 байта данных MP3, а затем кусок мета.
Считайте 8192 байта данных (убедитесь, что вы не включили заголовок в это число), отбросьте их, а затем прочитайте следующий байт. Этот байт является первым байтом метаданных и указывает, как долго метаданные. Возьмите значение этого байта (фактический байт с ord()
( doc )) и умножьте его на 16. Результатом является число байтов, которые нужно прочитать для метаданных. Считайте это количество байтов в строковую переменную для работы с вами.
Затем обрежьте значение этой переменной. Зачем? Потому что строка дополняется 0x0
в конце (чтобы она равномерно помещалась в кратные 16 байтов), а trim()
( doc ) позаботится об этом за нас.
У вас останется что-то вроде этого:
StreamTitle='Awesome Trance Mix - DI.fm';StreamUrl=''
Я позволю вам выбрать ваш метод выбора для анализа этого. Лично я, вероятно, просто разделю с пределом 2 на ;
, но остерегайтесь заголовков, которые содержат ;
. Я не уверен, что такое метод escape-символа. Небольшой эксперимент должен помочь вам.
Не забудьте отключиться от сервера, когда закончите!
Существует множество ссылок на метаданные SHOUTcast. Это хорошо: http://www.smackfu.com/stuff/programming/shoutcast.html