301

Re: Скрипты для Icecast

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

302

Re: Скрипты для Icecast

если писано в название станции то Скрипт срочно

303

Re: Скрипты для Icecast

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

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

сам php: http://tundraradio.ru/info.php
вывод на страницу: http://tundraradio.ru/

<?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 14:17:31)

304

Re: Скрипты для Icecast

пишет 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

305

Re: Скрипты для Icecast

пишет tarasian666:

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

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

нашел сейчас ошибку:

elseif ($stream =='') //если в Stream Description второго потока пусто, переходим к третьему потоку

должно выглядеть как

if ($stream =='') //если в Stream Description второго потока пусто, переходим к третьему потоку

поскольку "elseif выполняется только в том случае, если предшествующее выражение if и любое предшествующее выражение elseif вычислены в FALSE, а текущее выражение elseif вычислено в TRUE."

306

Re: Скрипты для Icecast

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

<?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>"; //вывод описания текущего потока
?>

307

Re: Скрипты для Icecast

пишет tarasian666:

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

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

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

308

Re: Скрипты для Icecast

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

309

Re: Скрипты для Icecast

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

310

Re: Скрипты для Icecast

в странице фрейма вставить мета тег

Показать / Cкрыть текст
60 - в секундах

311

Re: Скрипты для Icecast

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

312

Re: Скрипты для Icecast

не в html а в php сохранять надо

313

Re: Скрипты для Icecast

<?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>";
?>

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

В здоровом теле - здоровый дух!

314

Re: Скрипты для Icecast

$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;

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

Отредактировано Klef (03-11-2010 03:14:44)

-------------------------------
R244390603111<- пиво лить сюда

315

Re: Скрипты для Icecast

пишет 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;

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

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

<?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>";
?>

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

В здоровом теле - здоровый дух!

316

Re: Скрипты для Icecast

для того, чтобы 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 - текущая песня, количество слушателей, что угодно.

317

Re: Скрипты для Icecast

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

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

Показать / Cкрыть текст

Отредактировано boogiebomzh (10-11-2010 11:17:19)

318

Re: Скрипты для Icecast

пишет tarasian666:

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

Показать / Cкрыть текст

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

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

И да поможет мне F1,
И да сохранит меня F6,
Во имя Ctr'а, Alt'a и святого Delit'а.
Enter...

319

Re: Скрипты для Icecast

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

320

Re: Скрипты для Icecast

пишет tarasian666:

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

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

И да поможет мне F1,
И да сохранит меня F6,
Во имя Ctr'а, Alt'a и святого Delit'а.
Enter...

321

Re: Скрипты для Icecast

Этот скрипт отдельно тебе нада сделать проверку что бы если основной недоступен то $xml[1] = $xml[2]

322

Re: Скрипты для Icecast

урааа... я понял что я нифига в этом не понимаю:D
кстати.. а не проще сделать так (особенно важно для тех у кого нет файла playlist.log и нет возможности редактировать icecast.xml) например чтобы это скрипт
<?php

function get_title ($mount){
$r=fopen($mount,'r');
$text=fread($r,2000);
fclose($r);
$mass=explode(",", $text);
return $mass [16];
}
$mount1 = "ссылка на status2xsl первого маунта";
$mount2 = "--//-- второго --//--";
$mount3 = "--//-- третьего --//--";

if(get_title($mount1) !='')
{
echo get_title($mount1);
}
elseif(get_title($mount2) !='')
{
echo get_title($mount2);
}
else
{
echo get_title($mount3);
}
?>
записывал всё в какой нибудь лог файл и потом из него выводил последние 20 песен?

И да поможет мне F1,
И да сохранит меня F6,
Во имя Ctr'а, Alt'a и святого Delit'а.
Enter...

323

Re: Скрипты для Icecast

у меня тоже нет файла playlist.log но

пишет boogiebomzh:

Во время исполнения скрипта создается файл last.xml, хранящий данные о последней проигранной песне, с которыми скрипт будет сравнивать вновь полученные данные. Если они будут отличаться, будет выполнен скробблинг.

324

Re: Скрипты для Icecast

пишет boogiebomzh:

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

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

Показать / Cкрыть текст

интересная штука.. я зарегистрировался на last.fm добавил себе на хостинг Scrobbler.php но вот только не понял как всё это заставить работать sad

И да поможет мне F1,
И да сохранит меня F6,
Во имя Ctr'а, Alt'a и святого Delit'а.
Enter...

325

Re: Скрипты для Icecast

пишет Sergei:

интересная штука.. я зарегистрировался на last.fm добавил себе на хостинг Scrobbler.php но вот только не понял как всё это заставить работать sad

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