ОсновноеRadiotalkПользовательское
Общие вопросы по интернет радио вещанию
6   •   Посмотреть все темы

Грфическая информация о станции (icecast2+php)

 

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

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.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.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.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.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.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]




Отредактировано Klef - 04.02.2012
6245
Тарас @tarasian666
если появляется ошибка что не может найти файл шрифта надо перед imagettftext
добавить строчку putenv('GDFONTPATH=' . realpath('.'));

Отредактировано tarasian666 - 22.12.2009
888
Falcon @Falcon
Спасибо, очень полезная инфа, но тут вопрос по ходу...если у меня радио находится по адресу fmhost.ru:7557/82
Тут **********
Статистика со всех станций, скрипт выводит статистику конкретно по 1-ой...а как мне забрать со своей?

6245
Тарас @tarasian666
что то типа
function antara($string, $start, $end){
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini += strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}

$text = antara($text,'/82','/');

не проверено, так что ни чего не могу гарантировать

Отредактировано tarasian666 - 22.12.2009
468
Klef @Klef
2 tarasian666
в этих случаях мне проще указать полный путь ;)

2 Falcon
в ближайщее время будет дополнен текст, вариантами на отдельный поток

6245
Тарас @tarasian666
Klef пишет:

2 tarasian666
в этих случаях мне проще указать полный путь

а мне нет :D
к примеру если используеться несколько шрифтов чтоб каждый раз не прописывать (или копипастить) полный путь.
но здесь уж как кому нравится ;)

888
Falcon @Falcon
Со скриптом разобрался...но возникла проблема теперь в другом...т.к. хостинг бесплатный, хост ругается на fopen
Пробовал заливать к другу на платный, тоже самое, пишет, что нету прав...Пожет есть еще какой-то вариант...Или может кто-нибудь поможет, разместит скрипт у себя, а я уже фреймом попытаюсь вставить

6245
Тарас @tarasian666
а как вам вариант на своем компе скрипт запускать?
а если используется sam то можно грабить инфу только с него

Отредактировано tarasian666 - 23.12.2009
888
Falcon @Falcon
Именно так и делаю. Но тут вот такая проблема возникает. Когда в эфир выходит другой диджей, скрипта то у него нету, да и пароль от фтп я дать не могу по определенным соображениям, статистика соответственно накрывается( вот уже который день мучаюсь с этой идеей.

468
Klef @Klef
2 Falcon

$file_name='http://fmhost.ru:7557/status2.xsl?mount=/82';

вместо
$mass [9];
использовать
$mass [14];

это для отдельного потока

Как именно ругается на fopen?

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

$file_name='http://fmhost.ru:7557/status2.xsl?mount/82';

хм.. я затупил :D
но поправлю $file_name='http://fmhost.ru:7557/status2.xsl?mount=/82';

Отредактировано tarasian666 - 24.12.2009
888
Falcon @Falcon
надо mass[16] и mass[14] для слушателей. Но тут вот такие траблы. При попытке вписать в функцию построения картинки русский текст, сразу пишет кракозябры, хотя русские названия и артисты отображаются корректно. Подскажите, как исправить. И вот, при попытке выполнить скрипт на хостинге такая ситуация:
1)Если создавать картинку, то оно тупо не создает ее.
2)Если не создавать картинку, то пишет следующее
Warning: fopen() [function.fopen]: URL file-access is disabled in the server configuration in /home/hdd1.ru/ultradio/sites/www/345.php on line 4

Warning: fopen(http://fmhost.ru:7557/status2.xsl?mount=/82) [function.fopen]: failed to open stream: no suitable wrapper could be found in /home/hdd1.ru/ultradio/sites/www/345.php on line 4

Warning: fread(): supplied argument is not a valid stream resource in /home/hdd1.ru/ultradio/sites/www/345.php on line 5

Warning: fclose(): supplied argument is not a valid stream resource in /home/hdd1.ru/ultradio/sites/www/345.php on line 6

6245
Тарас @tarasian666
Falcon пишет:

URL file-access is disabled in the server configuration

значит на сервере запрещен доступ к файлам через URL
остальные ошибки уже следствие..

Отредактировано tarasian666 - 24.12.2009
888
Falcon @Falcon
В этом то все и дело. Подскажите мне хостинг(бесплатный желательно) на котором данная фукция будет работать. Спасибо)

6245
Тарас @tarasian666
гугл в помощь

468
Klef @Klef
2 Falcon
в какой кодировке создаете скрипт?

о хостинге: бороться и искать, найти и перепрятать.

2 tarasian666
ну это уже очепятка ;)

Отредактировано Klef - 25.12.2009
888
Falcon @Falcon
В блокноте ANSI походу.
P.S. Хостинг нашел)

468
Klef @Klef
notepad ++ спасет тебя

349
Юрий @Всё-просто
что за скрипт $file_name='zago.php';
конкретнее о zago.php

468
Klef @Klef
переходим к следущему треку.
из самого 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"

Отредактировано Klef - 31.12.2009