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

Скрипты для Icecast

 

468
Klef @Klef
код с каментами
  1. <?php
  2. include "max.php";
  3. //обращению к файлу, где храниться зафиксированный максимум
  4. $xmlf[] = "http://adres:port/potok1.xspf";
  5. $xmlf[] = "http://adres:port/potok2.xspf";
  6. //прописываем потоки, сколько надо (пример "http://wasteland.spb.su:8080/radio.xspf")
  7. $i=0;
  8. //задаем первую позицию счетчика для цикла
  9. $kolpotok=sizeof($xmlf)-1;
  10. //определяем количество прописаных потоков по масиву (т.к. счет с нуля, то -1)
  11. $VIEWERS=0;
  12. //задаем нулевое значение счетчика слушателей
  13. while ($i <= $kolpotok) {
  14. $xml = simplexml_load_file($xmlf[$i]);
  15. //обращение к xspf файлу текущего потока
  16. $ano = $xml->trackList->track->annotation;
  17. //выбираем значение из <trackList><track><annotation>
  18. $mass=explode("\n", $ano);
  19. //разбиваем знаечение на масив (т.к. там много чего а нам надо тока строку "Current Listeners:")
  20. $kol=substr($mass[4],19);
  21. //строка "Current Listeners" есть 5 по счету (незабываем счет с нуля, т.к. это будет 4) и т.к. нам нужна тока цифорка, то начиная с 19 символа
  22. $i=$i+1;
  23. //шаг счетчика для цикла
  24. $VIEWERS=$VIEWERS+$kol;
  25. //прибавляем полученное количество слушателей по потоку к общему значению
  26. }
  27. if ($VIEWERS>$maxobserve)
  28. //проверяем текущее значение с зафиксированным максимум, если больше то записываем новое
  29. {
  30. $txtout='<?php'."\r\n";
  31. $txtout=$txtout. '$maxobserve=' .$VIEWERS. ";\r\n";
  32. $txtout=$txtout."\r\n".'?>';
  33. //создаем переменную с текстом файла
  34. $fp = fopen ("путь к файлу/max.php", "w");
  35. //открываем на запись файл, путь должен быть полным, например для виндовс "C:/www/stat/max.php"
  36. fwrite($fp,$txtout);
  37. //записываем файл
  38. fclose($fp);
  39. //не забываем закрыть его
  40. $maxobserve=$VIEWERS;
  41. //принимаем значение максимального на текущее значение
  42. }
  43. echo "listens: " . $VIEWERS . "<br>";
  44. echo "max listens: " . $maxobserve . "<br>";
  45. //выводим полученные значения
  46. ?>

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

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

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

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

0
468
Klef @Klef
Symbios пишет:

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

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

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

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

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

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

0
468
Klef @Klef
djluk пишет:

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

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

0
21
djluk @djluk
Klef пишет:

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

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

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

0
21
djluk @djluk
Klef пишет:

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

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

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

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

0
468
Klef @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.spb.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.spb.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.spb.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.spb.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.spb.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]




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

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

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

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

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

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

0
468
Klef @Klef
Ruskat пишет:

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

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

вот пример

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

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

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

0