root  / icecast tips&tricks  / icecast listeners 

icecast logo

В интернетах есть способ получить от 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;

?>
LJ