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

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

 

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

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

Позже, дополню и расширю.




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

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

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


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

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

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

результат:

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

теперь берем под белы рученьки icecast и начинаем у него требовать информацию.
  1. <?php
  2. header ("Content-type: image/png");
  3. $im = ImageCreateFromPng("blank.png");
  4. $color = imagecolorallocate ($im, 255, 255, 255);
  5. $file_name='http://wasteland.su:8080/status2.xsl';
  6. $r=fopen($file_name,'r');
  7. $text=fread($r,1000);
  8. fclose($r);
  9. $mass=explode(",", $text);
  10. $current="track".$mass [16];
  11. imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf",$current);
  12. imagepng ($im);
  13. imagedestroy ($im);
  14. ?>


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

а теперь попробуем применить немного экспериментальной магии.
  1. <?php
  2. header ("Content-type: image/png");
  3. $im = ImageCreateFromPng("blank.png");
  4. $color = imagecolorallocate ($im, 255, 255, 255);
  5. $file_name='http://wasteland.su:8080/status2.xsl';
  6. $r=fopen($file_name,'r');
  7. $text=fread($r,1000);
  8. fclose($r);
  9. $mass=explode(",", $text);
  10. $current=$mass [16];
  11. $cm=explode(" - ", $current);
  12. imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf","Artist: ".$cm[1]);
  13. imagettftext ($im, 6, 0, 15, 30, $color, "ft.ttf","Song: ".$cm[2]);
  14. imagepng ($im);
  15. imagedestroy ($im);
  16. ?>



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

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

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

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

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

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

  1. <?php
  2. header ("Content-type: image/png");
  3. $im = ImageCreateFromPng("blank.png");
  4. $color = imagecolorallocate ($im, 255, 255, 255);
  5. $file_name='http://wasteland.su:8080/status2.xsl';
  6. $r=fopen($file_name,'r');
  7. $text=fread($r,1000);
  8. fclose($r);
  9. $mass=explode(",", $text);
  10. $current=$mass [16];
  11. $cm=explode(" - ", $current);
  12. $file_name='zago.php';
  13. $r=fopen($file_name,'r');
  14. $text=fread($r,filesize($file_name));
  15. fclose($r);
  16. $mas=explode("\r\n", $text);
  17. imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf","Artist: ".$cm[1]);
  18. imagettftext ($im, 6, 0, 15, 30, $color, "ft.ttf","Song: ".$cm[2]);
  19. imagettftext ($im, 6, 0, 15, 40, $color, "ft.ttf","Next track: ".$mas[3]);
  20. imagettftext ($im, 6, 0, 15, 50, $color, "ft.ttf","Next artist: ".$mas[2]);
  21. imagettftext ($im, 6, 0, 15, 60, $color, "ft.ttf","Next song: ".$mas[4]);
  22. imagepng ($im);
  23. imagedestroy ($im);
  24. ?>



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

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

  1. <?php
  2. header ("Content-type: image/png");
  3. $im = ImageCreateFromPng("blank.png");
  4. $color = imagecolorallocate ($im, 255, 255, 255);
  5. $file_name='http://wasteland.su:8080/status2.xsl';
  6. $r=fopen($file_name,'r');
  7. $text=fread($r,1000);
  8. fclose($r);
  9. $mass=explode(",", $text);
  10. $current=$mass [16];
  11. $listens=$mass [9];
  12. $cm=explode(" - ", $current);
  13. $file_name='zago.php';
  14. $r=fopen($file_name,'r');
  15. $text=fread($r,filesize($file_name));
  16. fclose($r);
  17. $mas=explode("\r\n", $text);
  18. imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf","Artist: ".$cm[1]);
  19. imagettftext ($im, 6, 0, 15, 30, $color, "ft.ttf","Song: ".$cm[2]);
  20. imagettftext ($im, 6, 0, 15, 40, $color, "ft.ttf","Next artist: ".$mas[2]);
  21. imagettftext ($im, 6, 0, 15, 50, $color, "ft.ttf","Next song: ".$mas[4]);
  22. imagettftext ($im, 6, 0, 15, 60, $color, "ft.ttf","Listns: ".$listens);
  23. imagepng ($im);
  24. imagedestroy ($im);
  25. ?>


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

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

дальше мы его будем инклюдить. использовать переменную, а в случае изменения перезаписывать.
  1. <?php
  2. header ("Content-type: image/png");
  3. $im = ImageCreateFromPng("blank.png");
  4. $color = imagecolorallocate ($im, 255, 255, 255);
  5. $file_name='http://wasteland.su:8080/status2.xsl';
  6. $r=fopen($file_name,'r');
  7. $text=fread($r,1000);
  8. fclose($r);
  9. $mass=explode(",", $text);
  10. $current=$mass [16];
  11. $listens=$mass [9];
  12. $cm=explode(" - ", $current);
  13. include "max.php";
  14. if ($listens>$max)
  15. {
  16. $txtout='<?php'."\r\n";
  17. $txtout=$txtout. '$max=' .$listens. ";\r\n";
  18. $txtout=$txtout."\r\n".'?>';
  19. $fp = fopen ("max.php", "w");
  20. fwrite($fp,$txtout);
  21. fclose($fp);
  22. $max=$listens;
  23. }
  24. $file_name='zago.php';
  25. $r=fopen($file_name,'r');
  26. $text=fread($r,filesize($file_name));
  27. fclose($r);
  28. $mas=explode("\r\n", $text);
  29. imagettftext ($im, 6, 0, 15, 20, $color, "ft.ttf","Artist: ".$cm[1]);
  30. imagettftext ($im, 6, 0, 15, 30, $color, "ft.ttf","Song: ".$cm[2]);
  31. imagettftext ($im, 6, 0, 15, 40, $color, "ft.ttf","Next artist: ".$mas[2]);
  32. imagettftext ($im, 6, 0, 15, 50, $color, "ft.ttf","Next song: ".$mas[4]);
  33. imagettftext ($im, 6, 0, 15, 60, $color, "ft.ttf","Listns: ".$listens);
  34. imagettftext ($im, 6, 0, 15, 70, $color, "ft.ttf","Max listens: ".$max);
  35. imagepng ($im);
  36. imagedestroy ($im);
  37. ?>



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

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

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




Отредактировано Klef - 04.02.2012
0
6245
Тарас @tarasian666
если появляется ошибка что не может найти файл шрифта надо перед
  1. imagettftext

добавить строчку
  1. putenv('GDFONTPATH=' . realpath('.'));

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

0
6245
Тарас @tarasian666
что то типа
  1. function antara($string, $start, $end){
  2. $string = " ".$string;
  3. $ini = strpos($string,$start);
  4. if ($ini == 0) return "";
  5. $ini += strlen($start);
  6. $len = strpos($string,$end,$ini) - $ini;
  7. return substr($string,$ini,$len);
  8. }
  9. $text = antara($text,'/82','/');

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

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

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

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

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

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

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

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

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

0
468
Klef @Klef
2 Falcon

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

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

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

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

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

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

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

Отредактировано tarasian666 - 24.12.2009
0
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

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

URL file-access is disabled in the server configuration

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

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

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

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

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

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

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

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

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

конкретнее о zago.php

0
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
0





Согласие на обработку данных на нашем сайте

Продолжая просматривать страницу, вы соглашаетесь с использованием файлов «Cookie» и с Политикой конфиденциальности «Privacy».
Наверху или внизу страницы вы можете изменить валюту и язык по умолчанию. Английская версия сайта ещё находится в доработке и доступна не полностью.