ОсновноеRadiotalkПользовательское
Технологии вещания, софт, скрипты
6   •   Посмотреть все темы

Скрипты для Icecast

 

1
sorc @sorc
Как и откуда выдирать с помощью скрипта того, кто ведущий на данный момент?

6245
Тарас @tarasian666
если писано в название станции то **********

18
boogiebomzh @boogiebomzh
написал скрипт для вывода имени исполнителя и названия песни, количества слушателей и описания потока. здесь у меня маунт /radio, к которому подключается диджей, с него фоллбэк на /playlist и с него фоллбэк на /nonstop. скрипт проверяет, какой поток сейчас работает. если на /radio нет вещания, то берутся данные из /playlist, если и он не вещает, то из /nonstop. число слушателей берется из status2.xsl, общее для всех потоков, отдельно сохраняется и выводится пиковое значение.
использовал скрипты от Klef. парсил xspf, поскольку status2.xsl у меня отображается как-то неверно. вместо Певец-Песня выводит ПевецПесня.
посмотрите, пожалуйста, как можно оптимизировать, что исправить.

еще: значения выводятся в iframe на странице радио, однако я не придумал, как красиво заставить этот iframe автообновляться отдельно от всей страницы. посредством javascript не получается. подскажите решение, пожалуйста.

сам php: **********
вывод на страницу: **********

<?php
//сперва счетчик слушателей всех маунтов
$file_name='http://188.40.124.23:8206/status2.xsl';
$r=fopen($file_name,'r');
$text=fread($r,300);
fclose($r);
$mass=explode(",", $text);
$listens=$mass [9];

include "max.php"; //для отображения пикового значения
if ($listens>$max)
{
$txtout='<?php'."\r\n";
$txtout=$txtout. '$max=' .$listens. ";\r\n";
$txtout=$txtout."\r\n".'?>';
$fp = fopen ("max.php", "w");
fwrite($fp,$txtout);
fclose($fp);
$max=$listens;
}

//дальше парсинг плейлистов для получения текущего исполнителя и песни и описания потока
//записываем их в таком порядке: сперва прямой эфир, потом фоллбэки
$xml[0] = "http://188.40.124.23:8206/radio.xspf";
$xml[1] = "http://188.40.124.23:8206/playlist.xspf";
$xml[2] = "http://188.40.124.23:8206/nonstop.xspf";

$xml0 = simplexml_load_file($xml[0]);
//обращение к xspf файлу текущего потока
$creator = $xml0->trackList->track->creator;
//выбираем значение из <trackList><track><creator>
$title = $xml0->trackList->track->title;
$ano = $xml0->trackList->track->annotation;
//выбираем значение из <trackList><track><annotation>
$mss=explode("\n", $ano);
//разбиваем знаечение на масив (т.к. там много чего а нам надо тока строку "Stream Description")
$stream=substr($mss[1],20);
//строка "Stream Description" вторая, (не забываем, что счет с нуля, т.е. это будет 1)
//берем значение начиная с 20 символа чтобы не захватывать "Stream Description:"

if ($stream =='') //если в Stream Description пусто, то первый маунт не вещает, переходим ко второму потоку
{
$xml1 = simplexml_load_file($xml[1]);
$creator = $xml1->trackList->track->creator;
$title = $xml1->trackList->track->title;
$ano = $xml1->trackList->track->annotation;
$mss=explode("\n", $ano);
$stream=substr($mss[1],20);
}
if ($stream =='') //если в Stream Description второго потока пусто, переходим к третьему потоку
{
$xml2 = simplexml_load_file($xml[2]);
$creator = $xml2->trackList->track->creator;
$title = $xml2->trackList->track->title;
$ano = $xml2->trackList->track->annotation;
$mss=explode("\n", $ano);
$stream=substr($mss[1],20);
}
echo $creator . " - "; // вывод имени исполнителя
echo $title . "<br>"; //вывод названия песни
echo "Слушателей: ".$listens . "<br>"; //вывод кол-ва слушателей
// echo "Max listens: ".$max . "<br>"; //вывод пикового к-ва слушателей, раскомментировать, если нужен
echo $stream . "<br>"; //вывод описания текущего потока
?>

Отредактировано boogiebomzh - 27.10.2010
6245
Тарас @tarasian666
boogiebomzh пишет:

$xml1 = simplexml_load_file($xml[1]);
$creator = $xml1->trackList->track->creator;
$title = $xml1->trackList->track->title;
$ano = $xml1->trackList->track->annotation;
$mss=explode("\n", $ano);
$stream=substr($mss[1],20);

можно засунуть в функцию чтоб не писать несколько раз одно и тоже
а так неплохо сделано )
а еще для сокращения скрипта можно использовать file_get_contents
и не уверен насчет счетчика слушателей всех маунтов, помоему оно посчитает только первый в списке status2.xsl

18
boogiebomzh @boogiebomzh
tarasian666 пишет:

можно засунуть в функцию чтоб не писать несколько раз одно и тоже
а так неплохо сделано )
а еще для сокращения скрипта можно использовать file_get_contents
и не уверен насчет счетчика слушателей всех маунтов, помоему оно посчитает только первый в списке status2.xsl

да, дойдут руки - сделаю и выложу сюда, сейчас пока работает.
для счетчика слушателей берет значение из Global, общее для всех маунтов.

нашел сейчас ошибку:
elseif ($stream =='') //если в Stream Description второго потока пусто, переходим к третьему потоку
должно выглядеть как
if ($stream =='') //если в Stream Description второго потока пусто, переходим к третьему потоку
поскольку "elseif выполняется только в том случае, если предшествующее выражение if и любое предшествующее выражение elseif вычислены в FALSE, а текущее выражение elseif вычислено в TRUE."

6245
Тарас @tarasian666
насчет подсчета слушателей - а вдруг на сервере не все маунты ваши или не все считать надо
<?php
//данные для парсинга слушателей всех маунтов
//можно написать их здесь сколько угодно
$mount[0] = '[url]http://188.40.124.23:8206/status2.xsl?mount=/radio[/url]';
$mount[1] = '[url]http://188.40.124.23:8206/status2.xsl?mount=/playlist[/url]';
$mount[2] = '[url]http://188.40.124.23:8206/status2.xsl?mount=/nonstop[/url]';

//считаем сколько у нас маунтов с которых считаем слушателей
$mounts = count($mount);

//данные для парсинга плейлистов для получения текущего исполнителя и песни и описания потока
//записываем их в таком порядке: сперва прямой эфир, потом фоллбэки
//можно написать их здесь сколько угодно
$xml[0] = "[url]http://188.40.124.23:8206/radio.xspf[/url]";
$xml[1] = "[url]http://188.40.124.23:8206/playlist.xspf[/url]";
$xml[2] = "[url]http://188.40.124.23:8206/nonstop.xspf[/url]";

//считаем сколько у нас маунтов с которых берем теги
$xmls = count($xml);

//считаем всех слушателей
$i = 0;
while($i<$mounts)
{
$text= file_get_contents($mount[$i]);
$mass=explode(",", $text);
$listens += $mass [14];
$i ++;
}

//парсим по очереди все маунты пока не добьемся положительного результата
$i = 0;
while($stream['descr'] =='')
{
$xml1 = simplexml_load_file($xml[$i]);
//обращение к xspf файлу текущего потока
$stream['creator'] = $xml1->trackList->track->creator;
//выбираем значение из <trackList><track><creator>
$stream['title'] = $xml1->trackList->track->title;
$ano = $xml1->trackList->track->annotation;
//выбираем значение из <trackList><track><annotation>
$mss=explode("\n", $ano);
//разбиваем знаечение на масив (т.к. там много чего а нам надо тока строку "Stream Description")
$stream['descr']=substr($mss[1],20);
//строка "Stream Description" вторая, (не забываем, что счет с нуля, т.е. это будет 1)
//берем значение начиная с 20 символа чтобы не захватывать "Stream Description:"
$i ++;
//если все перепарсили а данных нет останавливаеся с ошибкой
if($i>$xmls){
$stream['descr'] = "offline";
}
}

include "max.php"; //для отображения пикового значения слушателей
if ($listens>$max)
{
$txtout="<?php\r\n".'$max='.$listens. ";\r\n?>";
$fp = fopen ("max.php", "w");
fwrite($fp,$txtout);
fclose($fp);
$max=$listens;
}

echo $stream['creator'] . " - "; // вывод имени исполнителя
echo $stream['title'] . "<br>"; //вывод названия песни
echo "Слушателей: ".$listens . "<br>"; //вывод кол-ва слушателей
//echo "Max listens: ".$max . "<br>"; //вывод пикового к-ва слушателей, раскомментировать, если нужен
echo $stream['descr'] . "<br>"; //вывод описания текущего потока
?>

18
boogiebomzh @boogiebomzh
tarasian666 пишет:

насчет подсчета слушателей - а вдруг на сервере не все маунты ваши  или не все считать надо

здесь все маунты мои.
вами предложенный вариант подсчета у меня не работает, видимо, опять-таки, из-за ошибки в status2.xsl. даже status2.xsl?mount=/ххх выводит глобальное значение, поэтому получается не общее количество слушателей, а общее количество, помноженное на количество маунтов. остальным наверняка пригодится.

остальной код работает, спасибо.

6245
Тарас @tarasian666
поправил, заменил mass [9] на mass[14]
еще один нюанс получился - если не введено stream name то описание показьівает некорректно

39
DIESEL @DIESEL
Я сделал через фрейм и мне нужно чтобы он сам обновлялся (без перезагрузки страницы)
как это сделать?

6245
Тарас @tarasian666
в странице фрейма вставить мета тег
Показать текст
60 - в секундах

39
DIESEL @DIESEL
Спасибо)
А как правильно сделать фрейм?
Вот я думал что php файл что выше просто в ставляешь в блокнот, сохраняешь как html и при помощи кода <iframe src="ссылка> </iframe> выводишь на главную, но там неполучается
Подскажите)

6245
Тарас @tarasian666
не в html а в php сохранять надо

1572
KyPIIaToB @KyPIIaToB
<?php
$file_name='http://адрес:порт/status2.xsl?mount=/mp3_1';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$current=$mass [16];
$listens=$listens+$mass [14];
$cm=explode(" - ", $current);

$file_name='http://адрес:порт/status2.xsl?mount=/mp3_2';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];

$file_name='http://адрес:порт/status2.xsl?mount=/mp3_3';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];

$file_name='http://адрес:порт/status2.xsl?mount=/mp3_4';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];

$file_name='http://адрес:порт/status2.xsl?mount=/mp3_5';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];


include ("max.php");
if ($listens>$max) {
$txtout='<?php'."\r\n";
$txtout=$txtout. '$max=' .$listens. ";\r\n";
$txtout=$txtout."\r\n".'?>';
$fp = fopen ("max.php", "w");
fwrite($fp,$txtout);
fclose($fp);
$max=$listens;
}

echo "<b>Listens: ".$listens." Max: ".$max."</b>";
?>

Ребят ошибка в следующем заключается, парсится статистика с разных серверов, бывает такое что сервер какой нибудь отваливается а остальные работают..
Дак вот как сделать так, чтоб тот маунт который не откликается скрипт проскакивал и выдавал статистику только с тех что работают..
Пытался я сделать но все не как..

468
Klef @Klef
$listens=0;
$tim=0.5; //таймаут для fsockopen
$file_name[]='http://адрес:порт/status2.xsl?mount=/mp3_2';
$url[]='адрес';
$port[]=порт
$file_name[]='http://адрес2:порт/status2.xsl?mount=/mp3_3';
$url[]='адрес2';
$port[]=порт

for ($i=0;$i<sizeof($file_name)-1;$i++){
$fp = fsockopen ($url[$i], $port[$i], $errno, $errstr, $tim1);
if (!$fp) {
//внезапно я забыл элементарное условие, поэтому вот так через задний проход
$temp=1;
}
else {
$r=fopen($file_name[$i],'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];
}
}
echo $listens;

Проверить щяс времени нет, поэтому наглаз, так что может быть ошибки =)

Отредактировано Klef - 03.11.2010
1572
KyPIIaToB @KyPIIaToB
Klef пишет:

$listens=0;
$tim=0.5; //таймаут для fsockopen
$file_name[]='http://адрес:порт/status2.xsl?mount=/mp3_2';
$url[]='адрес';
$port[]=порт
$file_name[]='http://адрес2:порт/status2.xsl?mount=/mp3_3';
$url[]='адрес2';
$port[]=порт

for ($i=0;$i<sizeof($file_name)-1;$i++){
$fp = fsockopen ($url[$i], $port[$i], $errno, $errstr, $tim1);
if (!$fp) {
//внезапно я забыл элементарное условие, поэтому вот так через задний проход
$temp=1;
}
else {
$r=fopen($file_name[$i],'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];
}
}
echo $listens;

Проверить щяс времени нет, поэтому наглаз, так что может быть ошибки =)

Спасибо тебе что толкнул на путь истенный )))
Так как у меня не только инфа считывается в айса но и с других скриптов, пришлось все таки операться на свой скрипт

<?php
$tim=0.5; // таймаут для fsockopen
error_reporting(0); // убираем ошибки

$file_name='http://ИП:порт/status2.xsl?mount=/mp3_1'; // страница с информацией (?mount=/mp3_1 в данном случае нужный нам маунт)
$fp = fsockopen ('ИП', порт, $errno, $errstr, $tim); // проверяем на доступность
if (!$fp) {} else {
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$current=$mass [16];
$listens=$listens+$mass [14]; } // при условии если вы снимаете статистику только с задоного маунта
$cm=explode(" - ", $current);

$file_name='http://ИП:порт/status2.xsl?mount=/mp3_2'; // страница с информацией (?mount=/mp3_2 в данном случае нужный нам маунт)
$fp = fsockopen ('ИП', порт, $errno, $errstr, $tim); // проверяем на доступность
if (!$fp) {} else {
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14]; } // при условии если вы снимаете статистику только с задоного маунта

$file_name='http://ИП:порт/status2.xsl'; // страница с информацией
$fp = fsockopen ('ИП', порт, $errno, $errstr, $tim); // проверяем на доступность
if (!$fp) {} else {
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [9]; } //при условии если вы снимаете со всех маунтов статистику

include ("max.php");
if ($listens>$max) {
$txtout='<?php'."\r\n";
$txtout=$txtout. '$max=' .$listens. ";\r\n";
$txtout=$txtout."\r\n".'?>';
$fp = fopen ("max.php", "w");
fwrite($fp,$txtout);
fclose($fp);
$max=$listens;
}

echo "<b>Listens: ".$listens." Max: ".$max."</b>";
?>

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

18
boogiebomzh @boogiebomzh
для того, чтобы php автоматически обновлялось на части страницы, не обновляя всю страницу целиком, встраиваю его следующим образом:<script type="text/javascript" src="http://ajax.googleapis.com/ajax/
libs/jquery/1.3.0/jquery.min.js"></script>
<script type="text/javascript">
var auto_refresh = setInterval(
function ()
{
$('#info').load('info.php?_=' +Math.random()).fadeIn("slow");
//#info - div, куда будет выводиться информация
//info.php - скрипт, выводящий необходимую нам информацию
}, 10000); //интервал обновления, в миллисекундах
</script>

сам div прописывается так:<div id="info">
<?php include("info.php"); ?>
</div>

таким образом, у нас на странице в <div id="info"> раз в 10 секунд обновляется информация, которую поставляет наш скрипт info.php - текущая песня, количество слушателей, что угодно.

18
boogiebomzh @boogiebomzh
Как скробблить на last.fm данные, получаемые из xspf-файлов.
Имеем несколько маунтов, например live - прямой эфир, и fallback(n) - фоллбеки. Нам нужно определить, какой из маунтов сейчас вещает, выдернуть из него название исполнителя и песни, и отправить на last.fm.
Используется следующая библиотека: **********. Cохраняем ее в файл Scrobbler.php и кладем в корень сайта.
Во время исполнения скрипта создается файл last.xml, хранящий данные о последней проигранной песне, с которыми скрипт будет сравнивать вновь полученные данные. Если они будут отличаться, будет выполнен скробблинг.
Запускаем скрипт на выполнение раз в минуту, например, по cron. Комментируйте и дополняйте.

Обнаружил проблему - если в названии исполнителя или трека есть символ &, то файл live.xml не записывается и трек скробблится несколько раз, в зависимости от его продолжительности.

Показать текст

Отредактировано boogiebomzh - 10.11.2010
303
Сергей @Sergei
tarasian666 пишет:

$mass берем по счету
0) 21/Jul/2010:19:04:41 +0400|
1) /live21|
2) 3|
3) лилия - ты и я (remix)
т.е. $mass[3] последняя проиграная песня

Показать текст

отображает последних 20

у меня два маунта. основной для сэма и нонстоп. этот скрипт будет выводить последние песни с основного маунта а когда сэм выключен то будет вывадить с нонстопа?

6245
Тарас @tarasian666
он кажется будет выводить инфу о каждом маунте, так что прийдется еще определять по $mass[1] (название маунта)

303
Сергей @Sergei
tarasian666 пишет:

он кажется будет выводить инфу о каждом маунте, так что прийдется еще определять по $mass[1] (название маунта)

а можно для таких чайников как я написать этот скрипт?
мне бы так чтобы я скопировал, вставил, обрадовался и поблагодарил за помощь:))