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

Скрипты для Icecast

 

1
sorc @sorc
Как и откуда выдирать с помощью скрипта того, кто ведущий на данный момент?

0
6245
Тарас @tarasian666
если писано в название станции то **********

0
18
boogiebomzh @boogiebomzh
написал скрипт для вывода имени исполнителя и названия песни, количества слушателей и описания потока. здесь у меня маунт /radio, к которому подключается диджей, с него фоллбэк на /playlist и с него фоллбэк на /nonstop. скрипт проверяет, какой поток сейчас работает. если на /radio нет вещания, то берутся данные из /playlist, если и он не вещает, то из /nonstop. число слушателей берется из status2.xsl, общее для всех потоков, отдельно сохраняется и выводится пиковое значение.
использовал скрипты от Klef. парсил xspf, поскольку status2.xsl у меня отображается как-то неверно. вместо Певец-Песня выводит ПевецПесня.
посмотрите, пожалуйста, как можно оптимизировать, что исправить.

еще: значения выводятся в iframe на странице радио, однако я не придумал, как красиво заставить этот iframe автообновляться отдельно от всей страницы. посредством javascript не получается. подскажите решение, пожалуйста.

сам php: **********
вывод на страницу: **********

  1. <?php
  2. //сперва счетчик слушателей всех маунтов
  3. $file_name='http://188.40.124.23:8206/status2.xsl';
  4. $r=fopen($file_name,'r');
  5. $text=fread($r,300);
  6. fclose($r);
  7. $mass=explode(",", $text);
  8. $listens=$mass [9];
  9. include "max.php"; //для отображения пикового значения
  10. if ($listens>$max)
  11. {
  12. $txtout='<?php'."\r\n";
  13. $txtout=$txtout. '$max=' .$listens. ";\r\n";
  14. $txtout=$txtout."\r\n".'?>';
  15. $fp = fopen ("max.php", "w");
  16. fwrite($fp,$txtout);
  17. fclose($fp);
  18. $max=$listens;
  19. }
  20. //дальше парсинг плейлистов для получения текущего исполнителя и песни и описания потока
  21. //записываем их в таком порядке: сперва прямой эфир, потом фоллбэки
  22. $xml[0] = "http://188.40.124.23:8206/radio.xspf";
  23. $xml[1] = "http://188.40.124.23:8206/playlist.xspf";
  24. $xml[2] = "http://188.40.124.23:8206/nonstop.xspf";
  25. $xml0 = simplexml_load_file($xml[0]);
  26. //обращение к xspf файлу текущего потока
  27. $creator = $xml0->trackList->track->creator;
  28. //выбираем значение из <trackList><track><creator>
  29. $title = $xml0->trackList->track->title;
  30. $ano = $xml0->trackList->track->annotation;
  31. //выбираем значение из <trackList><track><annotation>
  32. $mss=explode("\n", $ano);
  33. //разбиваем знаечение на масив (т.к. там много чего а нам надо тока строку "Stream Description")
  34. $stream=substr($mss[1],20);
  35. //строка "Stream Description" вторая, (не забываем, что счет с нуля, т.е. это будет 1)
  36. //берем значение начиная с 20 символа чтобы не захватывать "Stream Description:"
  37. if ($stream =='') //если в Stream Description пусто, то первый маунт не вещает, переходим ко второму потоку
  38. {
  39. $xml1 = simplexml_load_file($xml[1]);
  40. $creator = $xml1->trackList->track->creator;
  41. $title = $xml1->trackList->track->title;
  42. $ano = $xml1->trackList->track->annotation;
  43. $mss=explode("\n", $ano);
  44. $stream=substr($mss[1],20);
  45. }
  46. if ($stream =='') //если в Stream Description второго потока пусто, переходим к третьему потоку
  47. {
  48. $xml2 = simplexml_load_file($xml[2]);
  49. $creator = $xml2->trackList->track->creator;
  50. $title = $xml2->trackList->track->title;
  51. $ano = $xml2->trackList->track->annotation;
  52. $mss=explode("\n", $ano);
  53. $stream=substr($mss[1],20);
  54. }
  55. echo $creator . " - "; // вывод имени исполнителя
  56. echo $title . "<br>"; //вывод названия песни
  57. echo "Слушателей: ".$listens . "<br>"; //вывод кол-ва слушателей
  58. // echo "Max listens: ".$max . "<br>"; //вывод пикового к-ва слушателей, раскомментировать, если нужен
  59. echo $stream . "<br>"; //вывод описания текущего потока
  60. ?>

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

$xml1 = simplexml_load_file($xml[1]);
$creator = $xml1->trackList->track->creator;
$title = $xml1->trackList->track->title;
$ano = $xml1->trackList->track->annotation;
$mss=explode("\n", $ano);
$stream=substr($mss[1],20);

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

0
18
boogiebomzh @boogiebomzh
tarasian666 пишет:

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

да, дойдут руки - сделаю и выложу сюда, сейчас пока работает.
для счетчика слушателей берет значение из Global, общее для всех маунтов.

нашел сейчас ошибку:
  1. elseif ($stream =='') //если в Stream Description второго потока пусто, переходим к третьему потоку

должно выглядеть как
  1. if ($stream =='') //если в Stream Description второго потока пусто, переходим к третьему потоку

поскольку "elseif выполняется только в том случае, если предшествующее выражение if и любое предшествующее выражение elseif вычислены в FALSE, а текущее выражение elseif вычислено в TRUE."

0
6245
Тарас @tarasian666
насчет подсчета слушателей - а вдруг на сервере не все маунты ваши или не все считать надо
  1. <?php
  2. //данные для парсинга слушателей всех маунтов
  3. //можно написать их здесь сколько угодно
  4. $mount[0] = '[url]http://188.40.124.23:8206/status2.xsl?mount=/radio[/url]';
  5. $mount[1] = '[url]http://188.40.124.23:8206/status2.xsl?mount=/playlist[/url]';
  6. $mount[2] = '[url]http://188.40.124.23:8206/status2.xsl?mount=/nonstop[/url]';
  7. //считаем сколько у нас маунтов с которых считаем слушателей
  8. $mounts = count($mount);
  9. //данные для парсинга плейлистов для получения текущего исполнителя и песни и описания потока
  10. //записываем их в таком порядке: сперва прямой эфир, потом фоллбэки
  11. //можно написать их здесь сколько угодно
  12. $xml[0] = "[url]http://188.40.124.23:8206/radio.xspf[/url]";
  13. $xml[1] = "[url]http://188.40.124.23:8206/playlist.xspf[/url]";
  14. $xml[2] = "[url]http://188.40.124.23:8206/nonstop.xspf[/url]";
  15. //считаем сколько у нас маунтов с которых берем теги
  16. $xmls = count($xml);
  17. //считаем всех слушателей
  18. $i = 0;
  19. while($i<$mounts)
  20. {
  21. $text= file_get_contents($mount[$i]);
  22. $mass=explode(",", $text);
  23. $listens += $mass [14];
  24. $i ++;
  25. }
  26. //парсим по очереди все маунты пока не добьемся положительного результата
  27. $i = 0;
  28. while($stream['descr'] =='')
  29. {
  30. $xml1 = simplexml_load_file($xml[$i]);
  31. //обращение к xspf файлу текущего потока
  32. $stream['creator'] = $xml1->trackList->track->creator;
  33. //выбираем значение из <trackList><track><creator>
  34. $stream['title'] = $xml1->trackList->track->title;
  35. $ano = $xml1->trackList->track->annotation;
  36. //выбираем значение из <trackList><track><annotation>
  37. $mss=explode("\n", $ano);
  38. //разбиваем знаечение на масив (т.к. там много чего а нам надо тока строку "Stream Description")
  39. $stream['descr']=substr($mss[1],20);
  40. //строка "Stream Description" вторая, (не забываем, что счет с нуля, т.е. это будет 1)
  41. //берем значение начиная с 20 символа чтобы не захватывать "Stream Description:"
  42. $i ++;
  43. //если все перепарсили а данных нет останавливаеся с ошибкой
  44. if($i>$xmls){
  45. $stream['descr'] = "offline";
  46. }
  47. }
  48. include "max.php"; //для отображения пикового значения слушателей
  49. if ($listens>$max)
  50. {
  51. $txtout="<?php\r\n".'$max='.$listens. ";\r\n?>";
  52. $fp = fopen ("max.php", "w");
  53. fwrite($fp,$txtout);
  54. fclose($fp);
  55. $max=$listens;
  56. }
  57. echo $stream['creator'] . " - "; // вывод имени исполнителя
  58. echo $stream['title'] . "<br>"; //вывод названия песни
  59. echo "Слушателей: ".$listens . "<br>"; //вывод кол-ва слушателей
  60. //echo "Max listens: ".$max . "<br>"; //вывод пикового к-ва слушателей, раскомментировать, если нужен
  61. echo $stream['descr'] . "<br>"; //вывод описания текущего потока
  62. ?>

0
18
boogiebomzh @boogiebomzh
tarasian666 пишет:

насчет подсчета слушателей - а вдруг на сервере не все маунты ваши  или не все считать надо

здесь все маунты мои.
вами предложенный вариант подсчета у меня не работает, видимо, опять-таки, из-за ошибки в status2.xsl. даже status2.xsl?mount=/ххх выводит глобальное значение, поэтому получается не общее количество слушателей, а общее количество, помноженное на количество маунтов. остальным наверняка пригодится.

остальной код работает, спасибо.

0
6245
Тарас @tarasian666
поправил, заменил mass [9] на mass[14]
еще один нюанс получился - если не введено stream name то описание показьівает некорректно

0
39
DIESEL @DIESEL
Я сделал через фрейм и мне нужно чтобы он сам обновлялся (без перезагрузки страницы)
как это сделать?

0
6245
Тарас @tarasian666
в странице фрейма вставить мета тег
Показать текст
60 - в секундах

0
39
DIESEL @DIESEL
Спасибо)
А как правильно сделать фрейм?
Вот я думал что php файл что выше просто в ставляешь в блокнот, сохраняешь как html и при помощи кода <iframe src="ссылка> </iframe> выводишь на главную, но там неполучается
Подскажите)

0
6245
Тарас @tarasian666
не в html а в php сохранять надо

0
1572
KyPIIaToB @KyPIIaToB
<?php
$file_name='http://адрес:порт/status2.xsl?mount=/mp3_1';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$current=$mass [16];
$listens=$listens+$mass [14];
$cm=explode(" - ", $current);

$file_name='http://адрес:порт/status2.xsl?mount=/mp3_2';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];

$file_name='http://адрес:порт/status2.xsl?mount=/mp3_3';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];

$file_name='http://адрес:порт/status2.xsl?mount=/mp3_4';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];

$file_name='http://адрес:порт/status2.xsl?mount=/mp3_5';
$r=fopen($file_name,'r');
$text=fread($r,1000);
fclose($r);
$mass=explode(",", $text);
$listens=$listens+$mass [14];


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

echo "<b>Listens: ".$listens." Max: ".$max."</b>";
?>

Ребят ошибка в следующем заключается, парсится статистика с разных серверов, бывает такое что сервер какой нибудь отваливается а остальные работают..
Дак вот как сделать так, чтоб тот маунт который не откликается скрипт проскакивал и выдавал статистику только с тех что работают..
Пытался я сделать но все не как..

0
468
Klef @Klef
  1. $listens=0;
  2. $tim=0.5; //таймаут для fsockopen
  3. $file_name[]='http://адрес:порт/status2.xsl?mount=/mp3_2';
  4. $url[]='адрес';
  5. $port[]=порт
  6. $file_name[]='http://адрес2:порт/status2.xsl?mount=/mp3_3';
  7. $url[]='адрес2';
  8. $port[]=порт
  9. for ($i=0;$i<sizeof($file_name)-1;$i++){
  10. $fp = fsockopen ($url[$i], $port[$i], $errno, $errstr, $tim1);
  11. if (!$fp) {
  12. //внезапно я забыл элементарное условие, поэтому вот так через задний проход
  13. $temp=1;
  14. }
  15. else {
  16. $r=fopen($file_name[$i],'r');
  17. $text=fread($r,1000);
  18. fclose($r);
  19. $mass=explode(",", $text);
  20. $listens=$listens+$mass [14];
  21. }
  22. }
  23. echo $listens;

Проверить щяс времени нет, поэтому наглаз, так что может быть ошибки =)

Отредактировано Klef - 03.11.2010
0
1572
KyPIIaToB @KyPIIaToB
Klef пишет:

  1. $listens=0;
  2. $tim=0.5; //таймаут для fsockopen
  3. $file_name[]='http://адрес:порт/status2.xsl?mount=/mp3_2';
  4. $url[]='адрес';
  5. $port[]=порт
  6. $file_name[]='http://адрес2:порт/status2.xsl?mount=/mp3_3';
  7. $url[]='адрес2';
  8. $port[]=порт
  9. for ($i=0;$i<sizeof($file_name)-1;$i++){
  10. $fp = fsockopen ($url[$i], $port[$i], $errno, $errstr, $tim1);
  11. if (!$fp) {
  12. //внезапно я забыл элементарное условие, поэтому вот так через задний проход
  13. $temp=1;
  14. }
  15. else {
  16. $r=fopen($file_name[$i],'r');
  17. $text=fread($r,1000);
  18. fclose($r);
  19. $mass=explode(",", $text);
  20. $listens=$listens+$mass [14];
  21. }
  22. }
  23. echo $listens;

Проверить щяс времени нет, поэтому наглаз, так что может быть ошибки =)

Спасибо тебе что толкнул на путь истенный )))
Так как у меня не только инфа считывается в айса но и с других скриптов, пришлось все таки операться на свой скрипт

  1. <?php
  2. $tim=0.5; // таймаут для fsockopen
  3. error_reporting(0); // убираем ошибки
  4. $file_name='http://ИП:порт/status2.xsl?mount=/mp3_1'; // страница с информацией (?mount=/mp3_1 в данном случае нужный нам маунт)
  5. $fp = fsockopen ('ИП', порт, $errno, $errstr, $tim); // проверяем на доступность
  6. if (!$fp) {} else {
  7. $r=fopen($file_name,'r');
  8. $text=fread($r,1000);
  9. fclose($r);
  10. $mass=explode(",", $text);
  11. $current=$mass [16];
  12. $listens=$listens+$mass [14]; } // при условии если вы снимаете статистику только с задоного маунта
  13. $cm=explode(" - ", $current);
  14. $file_name='http://ИП:порт/status2.xsl?mount=/mp3_2'; // страница с информацией (?mount=/mp3_2 в данном случае нужный нам маунт)
  15. $fp = fsockopen ('ИП', порт, $errno, $errstr, $tim); // проверяем на доступность
  16. if (!$fp) {} else {
  17. $r=fopen($file_name,'r');
  18. $text=fread($r,1000);
  19. fclose($r);
  20. $mass=explode(",", $text);
  21. $listens=$listens+$mass [14]; } // при условии если вы снимаете статистику только с задоного маунта
  22. $file_name='http://ИП:порт/status2.xsl'; // страница с информацией
  23. $fp = fsockopen ('ИП', порт, $errno, $errstr, $tim); // проверяем на доступность
  24. if (!$fp) {} else {
  25. $r=fopen($file_name,'r');
  26. $text=fread($r,1000);
  27. fclose($r);
  28. $mass=explode(",", $text);
  29. $listens=$listens+$mass [9]; } //при условии если вы снимаете со всех маунтов статистику
  30. include ("max.php");
  31. if ($listens>$max) {
  32. $txtout='<?php'."\r\n";
  33. $txtout=$txtout. '$max=' .$listens. ";\r\n";
  34. $txtout=$txtout."\r\n".'?>';
  35. $fp = fopen ("max.php", "w");
  36. fwrite($fp,$txtout);
  37. fclose($fp);
  38. $max=$listens;
  39. }
  40. echo "<b>Listens: ".$listens." Max: ".$max."</b>";
  41. ?>

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

0
18
boogiebomzh @boogiebomzh
для того, чтобы php автоматически обновлялось на части страницы, не обновляя всю страницу целиком, встраиваю его следующим образом:
  1. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/
  2. libs/jquery/1.3.0/jquery.min.js"></script>
  3. <script type="text/javascript">
  4. var auto_refresh = setInterval(
  5. function ()
  6. {
  7. $('#info').load('info.php?_=' +Math.random()).fadeIn("slow");
  8. //#info - div, куда будет выводиться информация
  9. //info.php - скрипт, выводящий необходимую нам информацию
  10. }, 10000); //интервал обновления, в миллисекундах
  11. </script>

сам div прописывается так:
  1. <div id="info">
  2. <?php include("info.php"); ?>
  3. </div>

таким образом, у нас на странице в <div id="info"> раз в 10 секунд обновляется информация, которую поставляет наш скрипт info.php - текущая песня, количество слушателей, что угодно.

0
18
boogiebomzh @boogiebomzh
Как скробблить на last.fm данные, получаемые из xspf-файлов.
Имеем несколько маунтов, например live - прямой эфир, и fallback(n) - фоллбеки. Нам нужно определить, какой из маунтов сейчас вещает, выдернуть из него название исполнителя и песни, и отправить на last.fm.
Используется следующая библиотека: **********. Cохраняем ее в файл Scrobbler.php и кладем в корень сайта.
Во время исполнения скрипта создается файл last.xml, хранящий данные о последней проигранной песне, с которыми скрипт будет сравнивать вновь полученные данные. Если они будут отличаться, будет выполнен скробблинг.
Запускаем скрипт на выполнение раз в минуту, например, по cron. Комментируйте и дополняйте.

Обнаружил проблему - если в названии исполнителя или трека есть символ &, то файл live.xml не записывается и трек скробблится несколько раз, в зависимости от его продолжительности.

Показать текст

Отредактировано boogiebomzh - 10.11.2010
0
303
Сергей @Sergei
tarasian666 пишет:

$mass берем по счету
0) 21/Jul/2010:19:04:41 +0400|
1) /live21|
2) 3|
3) лилия - ты и я (remix)
т.е. $mass[3] последняя проиграная песня

Показать текст

отображает последних 20

у меня два маунта. основной для сэма и нонстоп. этот скрипт будет выводить последние песни с основного маунта а когда сэм выключен то будет вывадить с нонстопа?

0
6245
Тарас @tarasian666
он кажется будет выводить инфу о каждом маунте, так что прийдется еще определять по $mass[1] (название маунта)

0
303
Сергей @Sergei
tarasian666 пишет:

он кажется будет выводить инфу о каждом маунте, так что прийдется еще определять по $mass[1] (название маунта)

а можно для таких чайников как я написать этот скрипт?
мне бы так чтобы я скопировал, вставил, обрадовался и поблагодарил за помощь:))

0





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

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