51

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

Приветствую!
У меня следующая проблема. Мой провайдер ретранслирует 32 станции. Мне надо выводить на свой сайт общее число станций и общее число слушателей на всех станциях. Вывод общего числа станций я реализовал, но со слушателями не получается. Помогите, пожалуйста. Мой скрипт (доработал выложенный здесь).

if(!defined('DATALIFEENGINE'))
{
  die("Hacking attempt!");
}    

$radio = dle_cache("radio", $config['skin']);
$listeners = 0;
$server1 = 0;
$server2 = 0;

if (!$radio) 
{
   $fl1 = file_get_contents('http://***:8887/');
   $fl2 = file_get_contents('http://***:8888/');
  
   $title = preg_match_all("/Stream Title/i", $fl1,$m) + preg_match_all("/Stream Title/i", $fl2,$m);
   
   preg_match_all('#<td>Current Listeners:</td><td class="streamdata">([\d]*)<\/td>#Ui',$fl1,$m); 
   preg_match_all('#<td>Current Listeners:</td><td class="streamdata">([\d]*)<\/td>#Ui',$fl2,$m);
/*Тут должен идти подсчет всех слушателей, но где в строках выше задать присваивание для массивов $a, $b я не знаю
   for($y = 1; $y <= $title; $y++)
   {
    $server1 += $a[y];
            $server2 += $b[y];
   }*/
  
   $listeners = $server1 + $server2;
  
   $radio = "<b>Всего станций: </b>{$title}<br \><b>Слушателей: </b>{$listeners}<br \>";
   create_cache ("radio", $radio, $config['skin']);
}

?>


if (preg_match('#<td>Current Song\:<\/td><td class=\"streamdata\">(.*)<\/td>#Ui',$fl,$m)) {
$song = $m[1];
echo "<b>Сейчас играет:</b> {$song}<br \>";
} else {
echo "<b>Сейчас играет:</b> Нет потока<br \>";
}

52

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

У меня возникла следующая ситуация:
В айскасте несколько маунтпоинтов (3-4), скрипт приведенный в посте #9 выводит данные только по первому в списке маунтпоинту.
Может кто-то помочь, обьяснить как сделать так, чтобы скрипт обрабатывал все маунтпоинты и отдельно выводил информацию по каждому из них?
Заранее спасибо.

53

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

Сделайте несколько xsl файлов, в каждом из них выводите данные только одного маунта и парсите их по отдельности.

> WIKI.RADIOTALK.RU

Моментальное создание интернет-радио:
> Купить хостинг от SKYcast.ru


На личную почту не отвечаю, задавайте ваши вопросы на форуме.

54

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

Существуют ли скрипты вывода последних 10 треков для Ice как Shout?

Деатхекоре!

55

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

netnung такаяже проблема..
AlexIT если нет возможности сделать на сервере несколько xls файлов, можно ли как-то выполнять поиск по названию моунтпоинта и парсить только его????
Заранее спасибо!

56

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

Alex Neil да, можно очень легко самому на PHP написать, анализируя логи.

Corsair да, это возможно.

> WIKI.RADIOTALK.RU

Моментальное создание интернет-радио:
> Купить хостинг от SKYcast.ru


На личную почту не отвечаю, задавайте ваши вопросы на форуме.

57

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

Господа, никто не сталкивался с анализатором логов icecast'a и последующим забитием инфы в базу,
если сталкивались - укажите путь ссылкой(гугл не предлагать.не нашел)
Кто нибудь может самостоятельно написал анализатор логов?

58

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

На пхп не проблема написать, какие конкретно данные нужны?

> WIKI.RADIOTALK.RU

Моментальное создание интернет-радио:
> Купить хостинг от SKYcast.ru


На личную почту не отвечаю, задавайте ваши вопросы на форуме.

59

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

на php я и сам могу написать) просто интересно, есть ли готовые решения.
А интересует история песен(полагаю 10 последних), суммарное количество часов прослушивания(количество человек помноженое на время прослушивания станции)
надо будет внимательно с логами ознакомиться

60

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

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

<?php
$xml[1] = simplexml_load_file("http://линко:порт/radio.xspf");
//$xml[2] = simplexml_load_file("http://линко:порт/potok2.xspf");
//по необходимости увеличиваем
$kp=1; //количество потоков
$i=1;
$vsego=0;
while ($i <= $kp) {
    $ano = $xml[$i]->trackList->track->annotation;
    $mass=explode("\n", $ano);
    $kol=substr($mass[4],19);
    $i=$i+1;
    $vsego=$vsego+$kol;
}    
echo "Слушают: " .$vsego;
?>
-------------------------------
R244390603111<- пиво лить сюда

61

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

Klef пишет:

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

<?php
$xml[1] = simplexml_load_file("http://линко:порт/radio.xspf");
//$xml[2] = simplexml_load_file("http://линко:порт/potok2.xspf");
//по необходимости увеличиваем
$kp=1; //количество потоков
$i=1;
$vsego=0;
while ($i <= $kp) {
    $ano = $xml[$i]->trackList->track->annotation;
    $mass=explode("\n", $ano);
    $kol=substr($mass[4],19);
    $i=$i+1;
    $vsego=$vsego+$kol;
}    
echo "Слушают: " .$vsego;
?>

Чет оно не хочет пахать... все время просит исправить вторую строчку О_о

Первая сумская интернет радиостанция "LIVE" - http://www.radiolive.sumy.ua

62

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

JamStyle пишет:
Klef пишет:

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

<?php
$xml[1] = simplexml_load_file("http://линко:порт/radio.xspf");
//$xml[2] = simplexml_load_file("http://линко:порт/potok2.xspf");
//по необходимости увеличиваем
$kp=1; //количество потоков
$i=1;
$vsego=0;
while ($i <= $kp) {
    $ano = $xml[$i]->trackList->track->annotation;
    $mass=explode("\n", $ano);
    $kol=substr($mass[4],19);
    $i=$i+1;
    $vsego=$vsego+$kol;
}    
echo "Слушают: " .$vsego;
?>

Чет оно не хочет пахать... все время просит исправить вторую строчку О_о

http://wasteland.spb.su/test/
из изменений только строка $xml[1]= где прописал линк на xspf к IceCast'у

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

63

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

А какой собственно линк? По данной ссылке конечный итог только виден...

Listens: 1
Первая сумская интернет радиостанция "LIVE" - http://www.radiolive.sumy.ua

64

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

http://ip:port/potok.xspf
и проверяй личку

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

65

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

Warning: simplexml_load_file(http://radio.telesweet.net:9000/absoluteclassicrock.xspf) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.0 404 File Not Found in /var/www/radio/1.php on line 2

Огромное спасибо за скрипт!Но...
Собственно, вот что пишет:( И так на все 87 станций!!

Первая сумская интернет радиостанция "LIVE" - http://www.radiolive.sumy.ua

66

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

JamStyle пишет:
Warning: simplexml_load_file(http://radio.telesweet.net:9000/absoluteclassicrock.xspf) [function.simplexml-load-file]: failed to open stream: HTTP request failed! HTTP/1.0 404 File Not Found in /var/www/radio/1.php on line 2

Огромное спасибо за скрипт!Но...
Собственно, вот что пишет:( И так на все 87 станций!!

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

p.s. изменил скрипт для "многих" потоков, чтоб память не забивалась.

<?php
$xml[] = "http://ip:port/potok.xspf";
//добавляем по маске


$kp=1; //количество потоков
$i=0;
$vsego=0;
while ($i <= ($kp-1)) {
    
    $vizov=simplexml_load_file($xml[$i]);
    $ano = $vizov->trackList->track->annotation;
    $mass=explode("\n", $ano);
    $kol=substr($mass[4],19);
    $i=$i+1;
    $vsego=$vsego+$kol;
}
echo "Potokov: " .$kp. "<br>";
echo "Listens: " .$vsego;
?>

Добавлено спустя     1 минуту   5 секунд:
попробовал с твоими линками у себя (не 87, но первые 5)
http://wasteland.spb.su/test/telesweet.php

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

67

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

Хм...действительно, у тебя все работает, а вот у меня...все таже ошибка...Что-то блокирует доступ, судя по всему.

Первая сумская интернет радиостанция "LIVE" - http://www.radiolive.sumy.ua

68

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

веб и сервер icecasta на одной машине? или разных
icecast2_status_v1.1 пробовал?

Добавлено спустя     1 минуту  :
ого канешно напильником стругать надо, но по первому потоку он инфу точно даст

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

69

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

Да, на одной машине...но доступ только виртуальный (хостинг своеобразный)...Я так понял, судя по последнему посту, не судьба мне всех слушателей в одну кучу сбить...гггг

Первая сумская интернет радиостанция "LIVE" - http://www.radiolive.sumy.ua

70

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

о, одна машина уже гуд, попробуй линк вида http://localhost/absoluteclassicrock.xspf
но сработает или нет, от хоста зависит

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

71

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

Не сработало...

Первая сумская интернет радиостанция "LIVE" - http://www.radiolive.sumy.ua

72

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

icecast2_status_v1.3 пробовал пускать, если хоть что-то дает, то можно попробовать на основе него (там через админку Icecast'а). а там есть инфа о "общем" количестве слушателей

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

73

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

Иметься: старая машина под виндой на которой вертится Sam, Icecast, и апачь для малых нужд.

Задача: требуется собирать статистику по часам, суткам и т.д.

Условия: варианты с cacti и mrtg не подходят по причине крайне малого оставшегося машинного ресурса.

Решение:
Найдена и заюзана программа Radio Toolbox, она мониторит и ведет логи по всем необходимым потокам (в нашем случае три), логи имеют вид: 03_10_2009_rtb_log.txt

...
[03/10/2009@14:45:19] 1 listeners - [CS: nadja - bliss torn from emptiness pt.1] (this log file generated by RTB v1.1.1)
...

используем два php скрипта, один простой, другой повеселее.

1. для перевода логов RTB в что нибудь попроще.

<?php
    $y=date("Y",time()-86400);
    $m=date("m",time()-86400);
    $d=date("d",time()-86400);
    $file_name='C:/Radio Toolbox/logs/' .$m .'_' .$d. '_' .$y. '_rtb_log.txt';
    //директория хранениея логов Radio Toolbox с выборкой нужной даты
    $r=fopen($file_name,'r');
    $text=fread($r,filesize($file_name));
    fclose($r);
    $massiv=explode("\r\n", $text);
    foreach ($massiv as $txt) {
        $h = substr($txt,12,2);
        $h=$h*1;
        $temp=explode(" ", $txt);
        $l[$h]=$l[$h]+$temp[1];
        $s[$h]=$s[$h]+1;
    }
    $txtout='<?php'."\r\n";
    for ($i=0; $i<=23; $i++) {
        $txtout=$txtout. '$ls[]=' .$l[$i]. '; $kz[]=' .$s[$i]. ";\r\n";
        
    }
    $txtout=$txtout.'?>';
    //запись в файл
    $fp = fopen ("C:/listens/".$y.$m.$d.".dat", "w"); 
    fwrite($fp,$txtout); 
    fclose($fp);
?>

данный скрипт запускаем после полуночи (когда начинает вестись лог на новый день)
php toBD.php (или диспетчером задач или crontab)

в итоге у нас получается файл 20090310.dat
обыкновенный текстовик формата

<?php
$ls[]=165; $kz[]=120;
<sciped>
$ls[]=360; $kz[]=120;
?>

всего в файле 24 записе (по 1 на час), первое значение сумма слушателей зарегенных в логах за час, второе количество замеров, т.е. среднее в час, это сумма/замеры

2. вывод статистики, более сложный и веселый

<?php
    $font="fd.ttf";
    //имя шрифта
    $dir='C:/listens/*.dat';
    //путь к файлам БД =)
    $y=$_GET['y'];
    $m=$_GET['m'];
    $d=$_GET['d'];
    $in=$_GET['in'];
    $t=$_GET['t'];
    if ($y<2009) {$y=date("Y",time()-86500);}
    if ($y>2038) {$y=date("Y",time()-86500);}
    if ($m<1) {$m=date("m",time()-86500);}
    if ($m>12) {$m=date("m",time()-86500);}
    if ($d<1) {$d=date("d",time()-86500);}
    if ($d>31) {$d=date("d",time()-86500);}
    if ($in==0) {$in=1;}
    if ($in<0) {$in=1;}
    if ($in>3) {$in=1;}
    if ($t<1) {$t=1;}
    if ($t>3) {$t=1;}
    if ($t==1 && $in>2) {$in=2;}
    if ($t==2 && $in<2) {$in=2;}
    if ($t==3 && $in<3) {$in=3;}
    $d=substr("0000" .$d,-2,2);
    $m=substr("0000" .$m,-2,2);
    if ($in==1) {
    $d1=$y.$m.$d;
    $d2=$y.$m.$d;
    }
    if ($in==2) {
    $d1=$y.$m."01";
    $d2=$y.$m."31";
    }
    if ($in==3) {
    $d1=$y."0101";
    $d2=$y."1231";
    }
    $d1=$d1*1;
    $d2=$d2*1;
    if ($t<0) {$t=1;}
    if ($t>3) {$t=1;}
    $mass=glob($dir);
    $x=0;
    $td=0;
    $pem=0;
    $nachalo=mktime(0,0,0,substr($d1,4,2),substr($d1,6,2),substr($d1,0,4));
    //обработка БД согласно вводным
    foreach ($mass as $filename){
        $locfile= substr($filename,-12,8);
        $locfile=$locfile*1;
        if ($locfile >=$d1 && $locfile <=$d2) {
            $tm=1*substr($filename,-8,2);
            if ($pem==0) {$pem=1;$pm=$tm;}    
            if ($t==3 && $pm<>$tm) {
                $pm=$tm;
                $l[$td]=array_sum($ls);
                $s[$td]=array_sum($kz);
                $ls='';
                $kz='';
                $td=$td+1;
            }
            include($filename);
            if ($t==2) {
                $l[$td]=array_sum($ls);
                $s[$td]=array_sum($kz);
                $ls='';
                $kz='';
                $td=$td+1;
            }
            
        }
    }
    if ($t==1) {
        $name="hours";
            $l=$ls;
            $s=$kz;
            
    }
    if ($t==2) {
        $name="days";
    }
    if ($t==3) {
        $name="months";
        if ($t==3) {
                $l[$td]=array_sum($ls);
                $s[$td]=array_sum($kz);
            }
    }
    $k=sizeof($l);
    $vivod=0;
    if (array_sum($l)==0) {$vivod=2;}
    if ($k==0) {$vivod=1;}
    $vis=0;
    for ($i=0;$i<$k;$i++){
        $r=$l[$i]/$s[$i];
        if ($vis<$r) {$vis=$r;}
    }
    $vt=250;
    if ($t==1 && $in==2) {$vt=300;}
    if ($t==2 && $in==3) {$vt=300;}
    //генерация графика
    header("Content-type:  image/png");
    $image = imageCreate(800, $vt);
    $colorback = imageColorAllocate($image, 0, 0, 0);
    $color1 = imageColorAllocate($image, 0, 255, 0);
    $color2 = imageColorAllocate($image, 50, 160, 0);
    imageFilledRectangle($image, 0, 0, 99, 99, $colorback);
    imageLine($image,30,10,30, 240,$color2);
    $max=$k;
    if ($vivod==0) {
        if ($t==1 && $in==1) {$max=23;}
        if ($t==1 && $in==2) {$max=24*(date("t",$nachalo)-1);}
        if ($t==2 && $in==2) {$max=date("t",$nachalo)-1;}
        if ($t==2 && $in==3) {$max=365;}
        if ($t==3 && $in==3) {$max=11;}
        $sh=750/($max+1);
        $vd=round($vis);
        $st=1;
        if ($vis==0) {$rp=20;$st=1;}
        if ($vis<>0) {
            $rp=200*$st/$vis;
            while ($rp<10) {
                $st=$st+1;
                $rp=200*$st/$vis;
            }
        }    
        $i=0;
        while ($i<=$vd) {
            $v=200*$i/$vis;
            $bbox=imagettfbbox(6, 0, $font, $i);
            imageLine($image,20,229-$v,780, 229-$v,$color2);
            imagettftext ($image, 6, 0, 30-$bbox[2]-3, 229-$v-2, $color2, $font,$i);
            $i=$i+$st;
        }
        for ($i=0;$i<$k;$i++){
            $r=$l[$i]/$s[$i];
            $v=200*$r/$vis;
            $nc=$i+1;
            if ($t==1) {$nc=$i;}
            imageFilledRectangle($image, 31+$sh*$i, 229-$v, 29+$sh*($i+1), 229, $color1);
            $bbox=imagettfbbox(6, 0, $font, $i);
        }    
        
        $st=1;$oo=1;$u=0;
        if ($t==1 && $in==2) {$st=24;$oo=0;$u=-90;}
        if ($t==2 && $in==3) {$st=30;$oo=0;$u=-90;}
        $rp=750*$st/$max;
        while ($rp<10) {
            $st=$st+1;
            $rp=200*$sh;
        }
        $i=0;
        
        while ($i<=$max) {
            $v=750*$i/$max;
            $io=$i;
            if ($t<>1) {$io=$i+1;}
            if ($t==1 && $in==2) {$io=date("d-M",$nachalo+3600*$i);}
            if ($t==2 && $in==3) {$io=date("M",$nachalo+24*3600*$i);}
            if ($t==3) {$io=date("M",$nachalo+31*24*3600*$i);}
            if ($i<>0) {imagettftext ($image, 6, $u, 31+$sh+$sh*$i-$sh/2-$bbox[2]/2, 240-$bbox[3]/2, $color2, $font,$io);}
            if ($i==0 && $oo==1) {imagettftext ($image, 6, $u, 31+$sh+$sh*$i-$sh/2-$bbox[2]/2, 240-$bbox[3]/2, $color2, $font,$io);}
            $i=$i+$st;
        }
    }
    if ($vivod==1) {imagettftext ($image, 20, 0, 175, 150, $color1, $font,"NOT DATA IN STORAGE");}
    if ($vivod==2) {imagettftext ($image, 20, 0, 260, 150, $color1, $font,"Not Listens");}
        $dati=substr($d1,0,4).":".substr($d1,4,2).":".substr($d1,6,2)."-".substr($d2,0,4).":".substr($d2,4,2).":".substr($d2,6,2)." (" . date("T",$nachalo). ")";
    if ($d1==$d2) {$dati=substr($d1,0,4).":".substr($d1,4,2).":".substr($d1,6,2)." (" . date("T",$nachalo). ")";}
    imagettftext ($image, 6, 0, 40, 10, $color2, $font,$dati);
    imagettftext ($image, 6, 0, 760, 10, $color2, $font,'V.2.8');
    imagettftext ($image, 6, 0, 2, 247, $color2, $font,$name);
    imageInterlace($image, 1);
    imagepng($image);
?>

Переменные, которые можно передать скрипту
d - день
m - месяц
y - год
t - тип графика (1-по часам, 2- по дням, 3 - по месяцам)
in - период графика (1 - день, 2 - месяц, 3 - год)
т.е. можно укозать скрипту данные на которое отображать, шаг графика и период
так например:
script.php?d=8&m=3&y=2009&t=1&in=1 отразит статистику за 8 марта 2009 по часам.
script.php?y=2009&t=3&in=3 отразит статистику за 2009 год по месяцам
неуказанные данные принимаются по умолчанию: текущая дата, по часам за сутки
В целях не загромождения графика ограничения в комбинациях периода и шага (для часов, только за сутки и месяц, для дней, только за месяц и год, для месяца, только за год)

Результат работы: http://wasteland.spb.su/statistika/s.html

Аспекты: так как код и так довольно громоздок, дни когда логи не велись (с 1 января 2009 года, по 7 марта 2009 года) созданы "пустые" файлы:

<?php
$ls[]=0; $kz[]=120;
<sciped>
$ls[]=0; $kz[]=120;
?>

Заглушки: при запросе данных, которых нет в БД или только "пустые"записи, выдается соответствующее предупреждение.

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

Минусы:
1. Статистика только раньше текущих суток.
2. отображение "средних" показателей

p.s. на текущий момент по выдаче статистических данных в графической форме скрипт удовлетворяет меня и команду, ухудшения производительности не предвидеться в ближайшее время (проводилось моделирование на заполнение БД данными за весь год). Решения по минутам и годам не вводились, по причинам нецелесообразности (т.к. на минуты как то не критично, а на года пока нет смысла)


upd: по причине того что платформа с веб сервером перешла на freebsd примеров вы тут не увидите, но скрипт рабочий, долго пользовался wink

Отредактировано Klef (26-09-2009 13:52:27)

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

74

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

Отлично, спасибо!
Хотя я лично юзаю mrtg.

> WIKI.RADIOTALK.RU

Моментальное создание интернет-радио:
> Купить хостинг от SKYcast.ru


На личную почту не отвечаю, задавайте ваши вопросы на форуме.

75

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

2 AlexIT
к сожалению, я не смог поднять под  виндой mrtg, а cacti как то слишком завышено жрет ресурсы системы, а то что уже полностью обосновался на Sam'e останавливает в переходе на nix sad

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