Комментарии 26
Я в свое время просто пар ил последнюю строку лога ) и мне вполне хватало )
Когда я решал такую же задачу, я смог добиться реалтаймового обновления: по факту информация о песне обновлялась даже перед тем, как она менялась в потоке. использовали php, модуль inotify к php и логи icecast2
Задача статьи состояла в том, чтобы обойти парсинг средствами PHP.
Ведь гораздо легче сгенерировать код самим icecast'ом, чем парсить файло.
Ведь гораздо легче сгенерировать код самим icecast'ом, чем парсить файло.
я не парсил ничего в php. у меня был запущен демоном конвейер из tail -f и awk, который разбирал общий лог по каналам, поэтому никаких разборов в момент запроса не было
А задача моего поста на том форуме была вообще обойтись без пхп.
Например для использования на статических сайтах))
Например для использования на статических сайтах))
Задача этого — то же самое. Здесь просто логическое ударение на слове «обойти», а не на «средствами PHP», затем и выделил.
В принципе, если бы не полтики безопасности JS, можно было бы вообще без проксирующего компонента обойтись, более того, как сказано ранее, apache2 и nginx сами умеют проксировать.
В принципе, если бы не полтики безопасности JS, можно было бы вообще без проксирующего компонента обойтись, более того, как сказано ранее, apache2 и nginx сами умеют проксировать.
На Github можно найти кастомные версии айсика который почти всю статистику умеет отдавать сразу в формате json и нинадо никаких xsl делать.
Лучше всего все-же парсить логи или постить из айсика в бд(если нужна информация о слушателях) ибо по HTTP теребить айскаст лишний раз не очень хорошо. Каждый раз когда мы подключаемся к нему чтобы получить статистику, мы занимаем слот слушателя т.к. в айскасте кол-во клиентов учитывается общее будь то слушатель и посетитель странички со статистикой. Если данные о кол-ве слушателей не нужны, то лучше узнавать играющий трек от автодиджея или попросить автодиджея постить в last.fm или twitter и оттуда дергать статистику через их API — рельно даст серверу продохнуть. Можно еще поставить на крон чтобы играющий трек и кол-во слушателей обновлялись например раз в несколько секунд, и все это дампилось в файлик stats.json и клалось в доступное место и тогда уже этот статичный файл раздавать клиенту с высокой скоростью.
Лучше всего все-же парсить логи или постить из айсика в бд(если нужна информация о слушателях) ибо по HTTP теребить айскаст лишний раз не очень хорошо. Каждый раз когда мы подключаемся к нему чтобы получить статистику, мы занимаем слот слушателя т.к. в айскасте кол-во клиентов учитывается общее будь то слушатель и посетитель странички со статистикой. Если данные о кол-ве слушателей не нужны, то лучше узнавать играющий трек от автодиджея или попросить автодиджея постить в last.fm или twitter и оттуда дергать статистику через их API — рельно даст серверу продохнуть. Можно еще поставить на крон чтобы играющий трек и кол-во слушателей обновлялись например раз в несколько секунд, и все это дампилось в файлик stats.json и клалось в доступное место и тогда уже этот статичный файл раздавать клиенту с высокой скоростью.
Зачем нужен пункт 2? Апач, нгникс и лайти умеют проксировать сами.
Как обстоят дела с разными кодировками? Сам столкнулся с проблемой, когда от одной радиостанции данные приходили в windows-1250 (да, именно в 1250 а не в 1251). Собственно я этот процесс до конца не довёл, так как сменил ту работу, но если есть нормальное решение — было бы интересно его узнать.
Чет не работает у меня это. Could not parse XSLT file.
Также появилась ошибка Could not parse XSLT file, вылечилось удалением тега
Для валидного выполнения скрипта просто прописал вместо нее
(точка монтирования у нас все равно одна)
Далее, в js файле getXmlHttp упрямо выдавал undefined. Вылечилось полной заменой функции getXmlHttp() на валидный кроссбраузерный вариант:
<xsl:value-of select="<hh user=mount>" />
Для валидного выполнения скрипта просто прописал вместо нее
"/radio":
(точка монтирования у нас все равно одна)
Далее, в js файле getXmlHttp упрямо выдавал undefined. Вылечилось полной заменой функции getXmlHttp() на валидный кроссбраузерный вариант:
function getXmlHttp() {
if (typeof XMLHttpRequest === 'undefined') {
XMLHttpRequest = function() {
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) {}
throw new Error("This browser does not support XMLHttpRequest.");
};
}
return new XMLHttpRequest();
}
«Could not parse...» выдавалось потому, что Хабрахабр заменял (собака)mount на ссылку на хабраюзера.
Вместо этого рекомендую использовать jQuery, а не изобретать велосипед, как я.
Собственно, улучшенная версия этого JS здесь:
nyanserver.com/asset/engine/track.js
Вместо этого рекомендую использовать jQuery, а не изобретать велосипед
Собственно, улучшенная версия этого JS здесь:
nyanserver.com/asset/engine/track.js
xsl:output следует добавить media-type=«application/json» что бы MIME для JSON был верным
А для кроссдоменного запроса просто делаем так:
а потом на javascript тут с jquery пример:
callback(
{
"/ns":
{
"name" : "Nyan-nyan :3",
"listeners" : "3",
"description" : "This is sparta~",
"title" : "Freaking On Shpongle - Dorset Perception Remix",
"genre" : "Kircore",
"url" : "http://*********.com"
}
}
);
а потом на javascript тут с jquery пример:
$.getJSON('http://example.com:8000/info.xsl', function(data) {
//данные в data
});
ребзя, дайте пример кода на вывод данных, потому что javascript не фурычит, или я криворукий и не знающий оного…
Class на PHP: https://github.com/xmoonlight/Icecast-Song-Info-php
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Простая реализация раздела «сейчас играет» для Icecast2 с использованием JSON