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

Скрипты для Icecast

 

95
Артур @NoExist
При попытке вывести Описание потока выходит пустая строчка, помогите =(

<?php
echo "<meta http-equiv='refresh' content='10'>";
$ip = "localhost";
$port = "8000";
$ice2_station = "Сервер вещания:";
$page = "";

$fp = @fsockopen("$ip", $port, $errno, $errstr, 10);
$success=-999;
if(!$fp) {
$success=2;
//Если сервер вещания не запущен
echo'
<tr>
<td align="center" width="100%" colspan="2"><b>
<font face="Arial" size="3" style="font-size: 9pt; ">
<span style="color: rgb(255, 255, 255);">
Эфир <br> временно отключен!</b></td>
</tr>
';
}
if($success!=2) //if connection
{
fputs($fp,"GET /status2.xsl HTTP/1.0\r\nUser-Agent: Icecast2 XSL Parser (Mozilla Compatible)\r\n\r\n"); //get status2.xsl
while(!feof($fp)) {
$page .= fgets($fp, 1000);
}
fclose($fp); //close connection
$page = ereg_replace(".*<pre>", "", $page);
$page = ereg_replace("</pre>.*", ",", $page);
$numbers = explode(",",$page);
$mount = $numbers[0];
$connections = $numbers[1];
$stream_n = $numbers[2];
$listeners = $numbers[3];
$desc = $numbers[4];
$cur_song = $numbers[5];
$str_url = $numbers[6];
$client_info = $numbers[7];
$test1 = $numbers[8];
$mount = $numbers[11];
$connections = $numbers[12];
$station =$numbers[13];
$listeners = $numbers[14];
$description = $numbers[15];
$cur_song = $numbers[16];
$www_url = $numbers[17];
//Если сервер вещания запущен, но нет потока
if (strlen($mount)<2) echo
'
<tr>
<td align="center" width="100%"><b>
<font face="Arial" size="3" style="font-size: 9pt; ">
<span style="color: #6c6565;"><b>Статус эфира:</b></span> <span style="color: #ff0000;">Технические работы на сервере!</b></span></td>
</tr>
</tr>
<br><br>
<tr>
<td align="center" width="100%"><b>
<font face="Arial" size="3" style="font-size: 9pt; ">
<span style="color: #6c6565;"><b>Слушателей:</b> 0</b></span></td>
</tr>
';
//Если сервер вещания запущен и идёт поток
else echo
'
<tr>
<td align="center" width="100%"><b>
<font face="Arial" size="3" style="font-size: 9pt; ">
<span style="color: #6c6565;"><b>Эфир ведет:</b> '.$description.'</b></span></td>
</tr>
<br>
<tr>
<td align="center" width="100%"><b>
<font face="Arial" size="3" style="font-size: 9pt; ">
<span style="color: #6c6565;"><b>В эфире:</b> '.$cur_song.'</b></span></td>
</tr>
<br>
<tr>
<td align="center" width="100%"><b>
<font face="Arial" size="3" style="font-size: 9pt; ">
<span style="color: #6c6565;"><b>Слушателей:</b> '.$listeners.'</b></span></td>
</tr>
';
}
?>

6245
Тарас @tarasian666
посмотрите свой status2.xsl и проверьте на каком месте стоит description (не именно слово, а описание)

95
Артур @NoExist
tarasian666 пишет:

посмотрите свой status2.xsl и проверьте на каком месте стоит description (не именно слово, а описание)


Его там вообще нет "facepalm" Можно как то добавить?

<pre>
MountPoint,Connections,Stream Name,Current Listeners,Description,Currently Playing,Stream URL Global,Client:2162 Source: ,,0,,
</pre>

Отредактировано NoExist - 24.09.2013
1
Milar @Milar
Dr.And пишет:

попробуй убрать - \n


Ай спасибо.Целое утро ломал голову, в чем проблема. Убрал - заработало.
Респект!
А код их status.xsl действительно спрессован )

Блин, а что же делать с такими? - 109.120.144.213:8000/status.xsl
Это сервер вКонтакте...


Привет от Радио Рекорд -)
Наиболее удобно парсить текущий трек можно с JSON-файла: //www.radiorecord.ru/xml/record_online_v3.txt
Также, доступен стандартный //air.radiorecord.ru:8101/rr_128.xspf

В общем целом плане парсинга данных текущей станции с icecast - есть замечательнейший скрипт, находящийся по адресу: //code.google.com/p/icecast-now-playing-script/ - крайне советую обратить на него внимания.

И, спешу огорчить. Что в случае с Радио Рекорд у вас просто так не получится получить текущее количество слушателей. Дело в том, что по адресу //air.radiorecord.ru:8101 (кстати, online - устаревший домен) работает аж 3 сервера Icecast. Это работает RR-DNS балансировщик нагрузки (вы можете посмотреть как он работает, запустив ping air.radiorecord.ru - вы время от времени будете видеть разные IP-адреса). Поэтому получать данные возможно вручную обращаясь именно на IP: 78.140.251.[2-4]. Далее, суммируя количества получить правильные данные.

Сравнить ваши данные с нашей статистикой можно по адресу: //stat.radiorecord.ru/radiorecord.ru/air.radiorecord.ru/index.html#radio
Там есть данные количества слушателей на каждую станцию, каждый поток и суммарно.

Если что - обращайтесь )

8
Иван @zim0vik
Доброе время суток.

При попытке вывести:

<?php

$fl = file_get_contents('http://109.194.162.95:9300/');

if (preg_match('#<td>Current Song\:<\/td><td class=\"streamdata\">(.*)<\/td>#Ui',$fl,$m)) {
$song = $m[1];
echo "<b>Now playing:</b> {$song}<br \>";
} else {
echo "<b>Now playing:</b> Нет потока<br \>";
}

?>

Пишет: "Нет потока".
Хотя поток есть. С другим радио работает идеально, а с моим нет.

6245
Тарас @tarasian666
а если так

if (preg_match('#<td>Current Song\:<\/td>\n<td class=\"streamdata\">(.*)<\/td>#Ui',$fl,$m)) {

8
Иван @zim0vik
tarasian666 пишет:

а если так

if (preg_match('#<td>Current Song\:<\/td>\n<td class=\"streamdata\">(.*)<\/td>#Ui',$fl,$m)) {


Огромное спасибо, всё работает :3

Отредактировано zim0vik - 25.11.2013
5
butthead @butthead
Всем привет)
нужен скриптик который выводил бы последние 20 треков на хтмд страничку.
заделитесь плз

20
y4eHuK @y4eHuK
Я понимаю, что тема заезжена уже, но все таки:
Скиньте кто нибудь пример парсинга с моей странички.
**********
а то пытаюсь уже фиг знает сколько и не получается.
Буду очень благодарен!

1
Ярослав @modi_1
tarasian666 пишет:

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

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

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


немного измененный скрипт, учитывает плейлист для определенного потока, выдает последние 5 треков:

<?PHP
error_reporting(0);
$data = file("/usr/local/share/icecast/logs/playlist.log");
$track_count=0;
for($i=count($data)-2;$i>0;$i--){
$mass = explode("|",$data[$i]);
if ($mass[1] == '/play_64_aac'){
if ($track_count>0){
echo $mass[3]."<br>";
}
if ($track_count++==5) break;
}
}
?>

Отредактировано modi_1 - 24.04.2014
25
djgelius @djgelius
Подскажите в чем косяк читает только 1 мант

<meta http-equiv="refresh" content="60">
<?php
$xml[1] = simplexml_load_file("http://s1.edmradio.ru:8000/live.xspf");
$xml[2] = simplexml_load_file("http://s1.edmradio.ru:8000/play.xspf");
$xml[3] = simplexml_load_file("http://s1.edmradio.ru:8000/128.xspf");
$xml[4] = simplexml_load_file("http://s1.edmradio.ru:8000/64m.xspf");
$xml[5] = simplexml_load_file("http://s1.edmradio.ru:8000/48aac.xspf");
$xml[6] = simplexml_load_file("http://s1.edmradio.ru:8000/32aac.xspf");
//по необходимости увеличиваем
$kp=6; //количество потоков
$i=1;
$vsego=0;
while ($i <= $kp) {
$ano = $xml[$i]->trackList->track->annotation;
$mass=explode("\n", $ano);
$kol=substr($mass[4],19);
$i=$i+1;
$vsego=$vsego+$kol;
}
echo "<b>Всего слушает: </b>" .$vsego;
?>


6245
Тарас @tarasian666

<meta http-equiv="refresh" content="60">
<?php
$xml[1] = simplexml_load_file("http://s1.edmradio.ru:8000/live.xspf");
$xml[2] = simplexml_load_file("http://s1.edmradio.ru:8000/play.xspf");
$xml[3] = simplexml_load_file("http://s1.edmradio.ru:8000/128.xspf");
$xml[4] = simplexml_load_file("http://s1.edmradio.ru:8000/64m.xspf");
$xml[5] = simplexml_load_file("http://s1.edmradio.ru:8000/48aac.xspf");
$xml[6] = simplexml_load_file("http://s1.edmradio.ru:8000/32aac.xspf");

$vsego=0;

foreach ($xml as $m) {
$ano = $m->trackList->track->annotation;
$mass=explode("\n", $ano);
$vsego += substr($mass[3],19); /* у меня почему-то так: 0 - Stream Title, 1 - Stream Description, 2 - Content Type, 3 - Current Listeners, 4 - Peak Listeners, 5 - Stream Genre*/
}
echo "<b>Всего слушает: </b>" .$vsego;
?>

25
djgelius @djgelius
tarasian666 пишет:


<meta http-equiv="refresh" content="60">
<?php
$xml[1] = simplexml_load_file("http://s1.edmradio.ru:8000/live.xspf");
$xml[2] = simplexml_load_file("http://s1.edmradio.ru:8000/play.xspf");
$xml[3] = simplexml_load_file("http://s1.edmradio.ru:8000/128.xspf");
$xml[4] = simplexml_load_file("http://s1.edmradio.ru:8000/64m.xspf");
$xml[5] = simplexml_load_file("http://s1.edmradio.ru:8000/48aac.xspf");
$xml[6] = simplexml_load_file("http://s1.edmradio.ru:8000/32aac.xspf");

$vsego=0;

foreach ($xml as $m) {
$ano = $m->trackList->track->annotation;
$mass=explode("\n", $ano);
$vsego += substr($mass[3],19); /* у меня почему-то так: 0 - Stream Title, 1 - Stream Description, 2 - Content Type, 3 - Current Listeners, 4 - Peak Listeners, 5 - Stream Genre*/
}
echo "<b>Всего слушает: </b>" .$vsego;
?>

Спасибо большое! заработало, но по вашему коду считает только mp3 поток а у меня еще есть и ААС, мой код работает с ААС
но как оказалось 128 и 64m не считает вообще!

Отредактировано djgelius - 04.07.2014
382
Grigorij @gyurgin_1
Если icecast свой то почему не получить напрямую, Делаем xsl
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" >
<xsl:output omit-xml-declaration="yes" method="text" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="no" encoding="UTF-8" /><xsl:strip-space elements="*"/>
<xsl:template match = "/icestats" >
<xsl:value-of select="listeners" />
</xsl:template>
</xsl:stylesheet>

Помещаем его в webroot icecast-а и натравливаем на него file_get_contents, проще некуда.

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

tarasian666 пишет:


<meta http-equiv="refresh" content="60">
<?php
$xml[1] = simplexml_load_file("http://s1.edmradio.ru:8000/live.xspf");
$xml[2] = simplexml_load_file("http://s1.edmradio.ru:8000/play.xspf");
$xml[3] = simplexml_load_file("http://s1.edmradio.ru:8000/128.xspf");
$xml[4] = simplexml_load_file("http://s1.edmradio.ru:8000/64m.xspf");
$xml[5] = simplexml_load_file("http://s1.edmradio.ru:8000/48aac.xspf");
$xml[6] = simplexml_load_file("http://s1.edmradio.ru:8000/32aac.xspf");

$vsego=0;

foreach ($xml as $m) {
$ano = $m->trackList->track->annotation;
$mass=explode("\n", $ano);
$vsego += substr($mass[3],19); /* у меня почему-то так: 0 - Stream Title, 1 - Stream Description, 2 - Content Type, 3 - Current Listeners, 4 - Peak Listeners, 5 - Stream Genre*/
}
echo "<b>Всего слушает: </b>" .$vsego;
?>

Спасибо большое! заработало, но по вашему коду считает только mp3 поток а у меня еще есть и ААС, мой код работает с ААС
но как оказалось 128 и 64m не считает вообще!


значит смотреть все эти xspf и искать различия, возможно надо сделать более умный парсер, а не просто счет по строкам и столбцам

25
djgelius @djgelius
tarasian666 пишет:


значит смотреть все эти xspf и искать различия, возможно надо сделать более умный парсер, а не просто счет по строкам и столбцам

У меня RadioCMS + liquidsoap
Можно просто не конвертировать в RadioCMS а это все предоставить liquidsoap, тогда которая мною взята была версия скрипта будет работать и считать все потоки, но пока что у меня проблека с liquidsoap я не знаю как в автозапуск закинуть через cron с задержкой чтобы сначала RadioCMS запускалось а потом уже liquidsoap

34
Артём @Artyom_Glazunov
Не пойму в чем беда...

Вставил код на сайт: <?php
$fl = file_get_contents('http://radio.tehmir.com.ua:8000/status.xsl?mount=/tech_radio');
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);
}
$song = antara($fl, "<td>Current Song:</td>\n<td class="streamdata">", "</td>");
echo "В эфире",$song;
?>


А появляется на сайте, вместо названия трека, кусок кода:
Current Song:", ""); echo "В эфире",$song; ?>


В айсе status.xsl выводит название трека вот так:
<tr><td>Current Song:</td><td class="streamdata">
<xsl:if test="artist"><xsl:value-of select="artist" /> - </xsl:if><xsl:value-of select="title" /></td></tr>



Помогите пожалуйста, я в этих языках вообще чайник...

Вот как все выглядит сейчас, когда код установлен: test1.tehmir.com.ua

727
Leff27 @Leff27
Artyom.Glazunov пишет:

Помогите пожалуйста, я в этих языках вообще чайник...

В конце кода заменить схожую строку на эту

$song = antara( $fl, '<td>Current Song:</td>\n<td class="streamdata">', '</td>');

Отредактировано Leff27 - 10.07.2014
34
Артём @Artyom_Glazunov
Leff27 пишет:


В конце кода заменить схожую строку на эту


Не помогло:
Current Song:\n', ''); echo "В эфире",$song; ?>

Снова фигня выводится

727
Leff27 @Leff27
Artyom.Glazunov пишет:


Снова фигня выводится

Последние строчки, проверил, работает:
$song = antara($fl, "<td>Current Song:</td>\n<td class=\"streamdata\">", "</td>");
echo "В эфире: " . $song;
?>