Здраствуй дорогой дружок. Сегодня я раскажу тебе сказку о кумулятиыных сведениях для создания графического информера, ака юзербара.
Предупреждение: данный пост содержит много кода, много текста, картинки и никакого смысла. Весь матеиал основан на использование 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
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]
-------------------------------
R244390603111<- пиво лить сюда