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

Скрипты для Icecast

 

468
Klef @Klef
код с каментами
<?php
include "max.php";
//обращению к файлу, где храниться зафиксированный максимум
$xmlf[] = "http://adres:port/potok1.xspf";
$xmlf[] = "http://adres:port/potok2.xspf";
//прописываем потоки, сколько надо (пример "http://wasteland.spb.su:8080/radio.xspf")
$i=0;
//задаем первую позицию счетчика для цикла
$kolpotok=sizeof($xmlf)-1;
//определяем количество прописаных потоков по масиву (т.к. счет с нуля, то -1)
$VIEWERS=0;
//задаем нулевое значение счетчика слушателей
while ($i <= $kolpotok) {
$xml = simplexml_load_file($xmlf[$i]);
//обращение к xspf файлу текущего потока
$ano = $xml->trackList->track->annotation;
//выбираем значение из <trackList><track><annotation>
$mass=explode("\n", $ano);
//разбиваем знаечение на масив (т.к. там много чего а нам надо тока строку "Current Listeners:")
$kol=substr($mass[4],19);
//строка "Current Listeners" есть 5 по счету (незабываем счет с нуля, т.к. это будет 4) и т.к. нам нужна тока цифорка, то начиная с 19 символа
$i=$i+1;
//шаг счетчика для цикла
$VIEWERS=$VIEWERS+$kol;
//прибавляем полученное количество слушателей по потоку к общему значению
}
if ($VIEWERS>$maxobserve)
//проверяем текущее значение с зафиксированным максимум, если больше то записываем новое
{
$txtout='<?php'."\r\n";
$txtout=$txtout. '$maxobserve=' .$VIEWERS. ";\r\n";
$txtout=$txtout."\r\n".'?>';
//создаем переменную с текстом файла
$fp = fopen ("путь к файлу/max.php", "w");
//открываем на запись файл, путь должен быть полным, например для виндовс "C:/www/stat/max.php"
fwrite($fp,$txtout);
//записываем файл
fclose($fp);
//не забываем закрыть его
$maxobserve=$VIEWERS;
//принимаем значение максимального на текущее значение
}
echo "listens: " . $VIEWERS . "<br>";
echo "max listens: " . $maxobserve . "<br>";
//выводим полученные значения
?>

1. скрипт <censored> но работает. пиковое добавил (давно использую), реализовано на доп файле "max.php" вида:
<?php
$ml=100;
?>

в нем храниться одна переменная, которая хранит пик :)
минус, в том, что если будет зафиксирован новое пиковое значение, только в том случае, если этот скрипт вызовут. Не проверял на ОЧЕНЬ большом обращении к скрипту (хоть он и вызывается из подписи на десятках форумов, но справляется)
Канешно можно так же при парсирование xmlf файла брать значение "Peak Listeners:" но, оно обнуляется при перезапуске icecast'а. Также при наличии потоков более одного, сумма этих значений не будет истиной пиковой нагрузкой.

2. в начале добавляем "$xmlf[] = "http://adres:port/potok3.xspf";" где прописываем потоки, текущий вариант сам посчитает их.

3. не проверял, сразу с 2.3.2 начал :)

468
Klef @Klef
Symbios пишет:

ЙЮЙ ЛНФМН ЯОЮПЯХРЭ БНР Я РЮЙНЦН ТЮИКЮ?
**********
ДЕКН Б РНЛ ВРН ПЮДХНЯРЮМЖХИ ЛМНЦН, Ю ЩРНР ТЮИК ХЛЕММН РНИ ПЮДХНЯРЮМЖХХ Я ЙНРНПНИ УНВС БГЪРЭ ХМТС... ЯЙЮФХРЕ ОПНЯРН ЙЮЙ БШБЕЯРХ ЩРН Б html, ДЮКЭЬЕ Ъ ПЮГАЕПСЯЭ...

<?php
$file_name='http://radio.nextrim.ru:8000/status2.xsl?mount=/anime.ogg';
$r=fopen($file_name,'r');
$text=fread($r,10000);
fclose($r);
$mass=explode(",", $text);
echo $mass [14] ."<br>";
?>

в "$text=fread($r,10000);" 10000 означает количество запрашиваемых байт, точное число (чтоб много лишенего не просил и нужное взял подбирать опытным путем.

468
Klef @Klef
для всех, кто хочет суммировать количество слушателей по всем потокам по серверу
$file_name='http://ip:8080/status2.xsl';
$r=fopen($file_name,'r');
$text=fread($r,300);
fclose($r);
$mass=explode(",", $text);
echo $mass [9] ."<br>";

если же потоки не только свои, но и которые не нужно подсчитывать, используйте код из вышестояещго сообщения.
Работает быстрей, чем через xspf

21
djluk @djluk
Привет всем!
ВОт такой вопросец возник!
А как можно вот к примеру тот скрипт который выводит инфу о станции, доработать так, чтоб он выводил название песни и исполнителя в две строки?

468
Klef @Klef
djluk пишет:

Привет всем!
ВОт такой вопросец возник!
А как можно вот к примеру тот скрипт который выводит инфу о станции, доработать так, чтоб он выводил название песни и исполнителя в две строки?

разбивка по дефису, и надеяться, что не попадется трек с дефисом в названии :)

21
djluk @djluk
Klef пишет:

разбивка по дефису, и надеяться, что не попадется трек с дефисом в названии :)

В смысле по дефису? как это?

468
Klef @Klef
в icecast передается строка вида "Artist - Track" (во всяком случае, где я видел)
так что разделить строку по знаку разделителя (в нашем случае дефис).

21
djluk @djluk
Klef пишет:

в icecast передается строка вида "Artist - Track" (во всяком случае, где я видел)
так что разделить строку по знаку разделителя (в нашем случае дефис).

Нет ну это понятно. А вот как это сделать?

12
ramms @ramms
Народ скажите мне нужен код для вывода имени DJ пользуюсь icecast v2, и еще как в семе настроить DJ где это задавать?

144
Руся @Ruskat
Klef, а как сделать скрипт, чтобы была картинка, как у тебя вот: [imgl]**********[/imgl] ?

468
Klef @Klef
Здраствуй дорогой дружок. Сегодня я раскажу тебе сказку о кумулятиыных сведениях для создания графического информера, ака юзербара.

Предупреждение: данный пост содержит много кода, много текста, картинки и никакого смысла. Весь матеиал основан на использование php, icecast и sam broadcaster

Итак нам понадобяться:
- картинка заготовка
- прикольный шрифт в ttf формате
- веб сервер с php
- две руки со средней кривизной
- усидчивость


Сначало делаем картинку заготовку, на php моно делать всё и с нуля, но если руки под фотошоп заточены лучше, то проще и быстрей сделать заранее (либо поймать знакомого фотошопера и заставить его)

в работе можно использовать и другие форматы, такие как gif, jpg, но png мне как то нравиться больше.

Первым делом посмотрим, а как вообще писать на нашей картинки.
итак для этого на нашу тестовую площадку заливаем нашу картинку и **********.
Пишем следущий код:
<?php
header ("Content-type: image/png");
$im = ImageCreateFromPng("blank.png");
$color = imagecolorallocate ($im, 255, 255, 255);
imagettftext ($im, 6, 0, 20, 30, $color, "ft.ttf", "1");
imagettftext ($im, 14, 45, 20, 60, $color, "ft.ttf", "2");
imagettftext ($im, 14, 0, 20, 90, $color, "ft.ttf", "3");
imagettftext ($im, 14, 170, 45, 120, $color, "ft.ttf", "4");
imagepng ($im);
imagedestroy ($im);
?>

результат:

итак для тех кто не может открыть гугл коментарии
1. говорим браузеру, что он получает от нас
2. создаем изображение на основе нашего художества
3. присваиваем цвет (как видно в формате RGB)
4. 5. 6. 7. пишем текст, где первое значение: обрабатываемое изображние, второе: размер шрифта, далее: наклон, координата X, координата Y(начало отсчета в левом верхнем углу), цвет, шрифт (точнее путь к нему), текст
8. выдаем картинку браузеру.
9. разрушаем изображение (дабы не забивать память)

теперь берем под белы рученьки icecast и начинаем у него требовать информацию.
<?php
header ("Content-type: image/png");
$im = ImageCreateFromPng("blank.png");
$color = imagecolorallocate ($im, 255, 255, 255);


$file_name='http://wasteland.spb.su:8080/status2.xsl';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$current="track".$mass [16];

imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf",$current);
imagepng ($im);
imagedestroy ($im);
?>


кто читал данную тему раньше, сразу поймет, что мы запрашиваем строку статуса у icecast'a и зная, что где орабатываем нужные строки.

а теперь попробуем применить немного экспериментальной магии.
<?php
header ("Content-type: image/png");
$im = ImageCreateFromPng("blank.png");
$color = imagecolorallocate ($im, 255, 255, 255);


$file_name='http://wasteland.spb.su:8080/status2.xsl';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$current=$mass [16];
$cm=explode(" - ", $current);

imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf","Artist: ".$cm[1]);
imagettftext ($im, 6, 0, 15, 30, $color, "ft.ttf","Song: ".$cm[2]);

imagepng ($im);
imagedestroy ($im);
?>



но в этом есть одна большая опасность. если в название группы будет пробел, дефис, пробел, то результат может быть не тем.

переходим к следущему треку.
из самого icecat'а мы узнать что будет дальше не имеем возможности, т.к. он сам не знает, что поставить, но в случае если вы используете Sam Broadcast есть хитрый обходной маневр.

открываем сам, config, HTML output, и в General HTML output добавляем новую запись.
указываем источник шаблона и резальтирующий файл.

источник вида
<!--LOOP(queue,1)-->
<!--LOOP_HEADER-->
<!--LOOP_ROW-->
$queue.artist$
$queue.combine$
$queue.title$
<!--LOOP_FOOTER-->
<!--LOOP_END-->

результат же будет возращаться
типа
Jimi Hendrix
Jimi Hendrix - Pali Gap
Pali Gap

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

<?php
header ("Content-type: image/png");
$im = ImageCreateFromPng("blank.png");
$color = imagecolorallocate ($im, 255, 255, 255);


$file_name='http://wasteland.spb.su:8080/status2.xsl';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$current=$mass [16];
$cm=explode(" - ", $current);

$file_name='zago.php';
$r=fopen($file_name,'r');
$text=fread($r,filesize($file_name));
fclose($r);
$mas=explode("\r\n", $text);


imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf","Artist: ".$cm[1]);
imagettftext ($im, 6, 0, 15, 30, $color, "ft.ttf","Song: ".$cm[2]);
imagettftext ($im, 6, 0, 15, 40, $color, "ft.ttf","Next track: ".$mas[3]);
imagettftext ($im, 6, 0, 15, 50, $color, "ft.ttf","Next artist: ".$mas[2]);
imagettftext ($im, 6, 0, 15, 60, $color, "ft.ttf","Next song: ".$mas[4]);

imagepng ($im);
imagedestroy ($im);
?>



как вы поняли, мы добавили запрос к резултирующему файлу (он у нас зоветься zago.php) и разобрали его на части по символу "перевод строки" (\r\n) на unix хостингах будет "\n"

Добавляем "слушателей"

<?php
header ("Content-type: image/png");
$im = ImageCreateFromPng("blank.png");
$color = imagecolorallocate ($im, 255, 255, 255);


$file_name='http://wasteland.spb.su:8080/status2.xsl';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$current=$mass [16];
$listens=$mass [9];
$cm=explode(" - ", $current);

$file_name='zago.php';
$r=fopen($file_name,'r');
$text=fread($r,filesize($file_name));
fclose($r);
$mas=explode("\r\n", $text);


imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf","Artist: ".$cm[1]);
imagettftext ($im, 6, 0, 15, 30, $color, "ft.ttf","Song: ".$cm[2]);
imagettftext ($im, 6, 0, 15, 40, $color, "ft.ttf","Next artist: ".$mas[2]);
imagettftext ($im, 6, 0, 15, 50, $color, "ft.ttf","Next song: ".$mas[4]);
imagettftext ($im, 6, 0, 15, 60, $color, "ft.ttf","Listns: ".$listens);

imagepng ($im);
imagedestroy ($im);
?>


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

Максимальное количество.
Для этого нам нужно проявить смекалку и личную доблесть.
Можно канешно брать эту информацию из icecast'а, но в случае перезагрузки сервиса, оно обнулиться.
так что делаем замечательный финт ушами.
Создаем файл max.php
<?php
$ml=0;
?>

дальше мы его будем инклюдить. использовать переменную, а в случае изменения перезаписывать.
<?php
header ("Content-type: image/png");
$im = ImageCreateFromPng("blank.png");
$color = imagecolorallocate ($im, 255, 255, 255);


$file_name='http://wasteland.spb.su:8080/status2.xsl';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$current=$mass [16];
$listens=$mass [9];
$cm=explode(" - ", $current);

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

$file_name='zago.php';
$r=fopen($file_name,'r');
$text=fread($r,filesize($file_name));
fclose($r);
$mas=explode("\r\n", $text);


imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf","Artist: ".$cm[1]);
imagettftext ($im, 6, 0, 15, 30, $color, "ft.ttf","Song: ".$cm[2]);
imagettftext ($im, 6, 0, 15, 40, $color, "ft.ttf","Next artist: ".$mas[2]);
imagettftext ($im, 6, 0, 15, 50, $color, "ft.ttf","Next song: ".$mas[4]);
imagettftext ($im, 6, 0, 15, 60, $color, "ft.ttf","Listns: ".$listens);
imagettftext ($im, 6, 0, 15, 70, $color, "ft.ttf","Max listens: ".$max);

imagepng ($im);
imagedestroy ($im);
?>



но не збывайте, что если у вас данный информер не оторазилься, то число соответсвенно не провериться ;)

Вот так за 6 шагов на римере мы научились делать странную фигню.
Я конечно оставил такие аспекты, как проблемы с кодировкой (iconv вам поможет), проверку на длину (а то вдруг за границу текст вылезет, центрирование (imagettfbbox очень полезная вещь).
но такого рода вопросы я вам оставляю на самостоятельное изучение.

[size=10]Если вам не понятны какиелибо команды на php, то гугл вам всегда поможет.
Если же и в этом случае не поняли, то видимо вам рано изучать php.[/size]




144
Руся @Ruskat
Дякую, шановний. Буду майструвати :) И от себя добавлю ссылочку на переведённую ********** по radiotoolbox и на сам сайт [url=www.radiotoolbox.com]radiotoolbox[/url].
Будут еще вопросы. точно...

144
Руся @Ruskat
Ну.... Что ж сказать... не сразу конечно язык автора мне поддался, но всётаки по песцинке и сделал:
. Тока иногда бывает в исполнителя влазит и трек: и альбом и еще что-то :) но спасибо тебе БОООООООЛЬШОЕ, Klef.
Тык вот что хотел... Как написать код, чтобы еще вытянуть данные из Station name и station description ?

468
Klef @Klef
это тебе нужно парсить уже не status2.xml а XSPF потока (выше в теме было)
либо передавать от сама

2605
Александр @AlexIT
Klef респект за проделанную работу при создании мануальчика, такие фишки нужно в отдельные темы выносить, а то тут затеряюцца и фиг кто их найдет, а жалко...

468
Klef @Klef
2 AlexIT
могу продублировать и подополнять троху =)

144
Руся @Ruskat
Да, и скажи за одно, как информер на форум всунуть, если там запрещени изображения.РНР ? Может каким кодом, чтобы разпознавалось, как изображение?

468
Klef @Klef
Ruskat пишет:

Да, и скажи за одно, как информер на форум всунуть, если там запрещени изображения.РНР ? Может каким кодом, чтобы разпознавалось, как изображение?

был один такой как то.
есть вариант злобного обмана (но не везде)
делаем директорию, в неё наш скрипт с именем index.php
и линк кажем на **********

вот пример

144
Руся @Ruskat
Klef, А в моем случае нужны только реальные расширения изображений. Просто так не проходит. Что тогда?

468
Klef @Klef
можно попробовать обмануть типом:
**********

но помогает редко :)