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