root / icecast tips&tricks / icecast listeners |
|
|
В интернетах есть способ получить от icecast реальное количество слушателей. Так вот, обычно web-интерфейс icecast лежит в /usr/share/icecast/web соответственно там я создал и слегка модифицировал status3.xsl, финальный вариант: <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > <xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" /> <xsl:template match = "/icestats" > <xsl:for-each select="source"> !!<xsl:value-of select="@mount" /> %%<xsl:value-of select="listeners" /> %%<xsl:value-of select="artist" /> %%<xsl:value-of select="title" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> Два символа ! я использовал как разделители информации о потоках, а два % - разделители информации внутри потока, ибо возвращаемое является литой строкой из количества слушателей на каналах включая нули (на сколько я понял). Сбор статистики я делаю так: <?php
$scip = $_SERVER['HTTP_HOST']; // Сервер, на котором висит Icecast
$scport = 8000; // Порт
$scfp = fsockopen($scip, $scport, &$errno, &$errstr, 10);
fputs($scfp,"GET /status3.xsl HTTP/1.0\r\n User-Agent: Icecast Song Status (Mozilla Compatible)\r\n\r\n");
$info = '';
while(!feof($scfp)) {
$listeners = fgets($scfp, 1000); // Вот то, что нам надо
//вывод количества слушателей
$info .= trim($listeners);
}
fclose($scfp);
$info = explode('!!', $info);
foreach ($info as $value) {
$exploded = explode('%%', $value);
$new_info[$exploded[0]] = $exploded;
}
$radio_info[] = array('/nashe-192', 'Наше радио (192kbps)');
$radio_info[] = array('/nashe-128', 'Наше радио (128kbps)');
$radio_info[] = array('/animeradio_su', 'AnimeRadio.su');
$radio_info[] = array('/otaku_radio', 'Otaku Radio - Non-stop');
$radio_info[] = array('/16bit_fm_club', '16BitT.FM CLUB Channel');
$radio_info[] = array('/16bit_fm_IDEA', '16Bit.FM I.D.E.A Channel');
$radio_info[] = array('/16bit_fm_BTM', '16Bit.FM B.T.M. Channel');
$radio_info[] = array('/16bit_fm_cafe', '16Bit.FM CAFE Channel');
$radio_info[] = array('/16bit_fm_main', '16Bit.FM Main Channel');
?>
<table border="1" cellpadding="2" cellspacing="1">
<tr>
<td>Радио</td>
<td>Слушать</td>
<td>Сейчас слушают</td>
<td>Артист</td>
<td>Композиция</td>
</tr>
<?php
foreach ($radio_info as $value) {
$stream = $value[0];
if (!isset($new_info[$stream])) $new_info[$stream] = array('', 0, '', '');
echo '<tr>
<td>' . $value[1] . '</td>
<td><a href="http://' . $_SERVER['HTTP_HOST'] . ':8000' . $stream . '.m3u"><img src="/listen.jpg" border="0"></a></td>
<td>' . $new_info[$stream][1] . '</td>
<td>' . $new_info[$stream][2] . '</td>
<td>' . $new_info[$stream][3] . '</td>
</tr>';
}
?>
</table>
А если будет необходимо выбрать только активные в данный момент радиостанции, то скрипт будет примерно такой:
<?php
$scip = '*****.********.**'; // Сервер, на котором висит Icecast
$scport = 8000; // Порт
$scfp = fsockopen($scip, $scport, &$errno, &$errstr, 10);
if ($scfp) {
fputs($scfp,"GET /status3.xsl HTTP/1.0\r\n User-Agent: Icecast Song Status (Mozilla Compatible)\r\n\r\n");
$info = '';
while(!feof($scfp)) {
$listeners = fgets($scfp, 1000); // Вот то, что нам надо
//вывод количества слушателей
$info .= trim($listeners);
}
fclose($scfp);
$info = explode('!!', $info);
unset($info[0]);
foreach ($info as $value) {
$exploded = explode('%%', $value);
$new_info[$exploded[0]] = $exploded;
}
$listeners = 0;
echo '<table class="icecast">
<tr>
<th>iсecast-поток</th>
<th> </td>
<th>Слушателей<br>сейчас</th>
<th>Композиция</th>
</tr>';
foreach ($new_info as $key => $value) {
$listeners += $value[1];
if ($value[1] > 0) {
echo '<tr>';
echo '<td>' . $value[0] . '</td>'; // stream
echo '<td><a href="http://*****.********.**:8000' . $value[0] . '.m3u"><img src="images/admins/listen.jpg"></a></td>'; // link to stream
echo '<td>' . $value[1] . '</td>'; // listeners
echo '<td>';
// check artist in listener
if ( (!empty($value[2])) && (stripos($value[3], $value[2]) === false) ) echo $value[2] . ': '; // artist
$value[3] = (empty($value[3])) ? ' ' : $value[3];
echo '' . $value[3] . '</td>'; // title
echo '</tr>';
}
}
echo '</table><br><strong>Всего слушателей:</strong> ' . $listeners;
} else $page_content = 'Socket error: ' . $errno . ' - ' . $errstr;
?>
| |