Use PHP to show Icecast2 statistics

前端 未结 3 1538
死守一世寂寞
死守一世寂寞 2020-12-28 12:08

I have some trouble viewing statistics (viewers, current song playing etc) with PHP and I can\'t find any information how to do this.

There is a couple of XLS files

相关标签:
3条回答
  • 2020-12-28 12:32

    By using this code I've got it working:

    <?php
    
    /*
     * SCRIPT CONFIGURATIONS
    */
    $SERVER = 'http://myserver.com:8000'; //URL TO YOUR ICECAST SERVER
    $STATS_FILE = '/status.xsl'; //PATH TO STATUS.XSL PAGE YOU CAN SEE IN YOUR BROWSER (LEAVE BLANK UNLESS DIFFERENT)
    
    ///////////////////// END OF CONFIGURATION --- DO NOT EDIT BELOW THIS LINE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    
    //create a new curl resource
    $ch = curl_init();
    
    //set url
    curl_setopt($ch,CURLOPT_URL,$SERVER.$STATS_FILE);
    
    //return as a string
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    
    //$output = our stauts.xsl file
    $output = curl_exec($ch);
    
    //close curl resource to free up system resources
    curl_close($ch);
    
    //build array to store our radio stats for later use
    $radio_info = array();
    $radio_info['server'] = $SERVER;
    $radio_info['title'] = '';
    $radio_info['description'] = '';
    $radio_info['content_type'] = '';
    $radio_info['mount_start'] = '';
    $radio_info['bit_rate'] = '';
    $radio_info['listeners'] = '';
    $radio_info['most_listeners'] = '';
    $radio_info['genre'] = '';
    $radio_info['url'] = '';
    $radio_info['now_playing'] = array();
       $radio_info['now_playing']['artist'] = '';
       $radio_info['now_playing']['track'] = '';
    
    //loop through $ouput and sort into our different arrays
    $temp_array = array();
    
    $search_for = "<td\s[^>]*class=\"streamdata\">(.*)<\/td>";
    $search_td = array('<td class="streamdata">','</td>');
    
    if(preg_match_all("/$search_for/siU",$output,$matches)) {
       foreach($matches[0] as $match) {
          $to_push = str_replace($search_td,'',$match);
          $to_push = trim($to_push);
          array_push($temp_array,$to_push);
       }
    }
    
    //sort our temp array into our ral array
    $radio_info['title'] = $temp_array[0];
    $radio_info['description'] = $temp_array[1];
    $radio_info['content_type'] = $temp_array[2];
    $radio_info['mount_start'] = $temp_array[3];
    $radio_info['bit_rate'] = $temp_array[4];
    $radio_info['listeners'] = $temp_array[5];
    $radio_info['most_listeners'] = $temp_array[6];
    $radio_info['genre'] = $temp_array[7];
    $radio_info['url'] = $temp_array[8];
    
    $x = explode(" - ",$temp_array[9]);
    $radio_info['now_playing']['artist'] = $x[0];
    $radio_info['now_playing']['track'] = $x[1];
    
    ?> 
    
    0 讨论(0)
  • 2020-12-28 12:32

    Please take a look at my answer over here why it is a very bad idea to use this script.
    tl;dr: You should not parse the Icecast HTML status page.

    0 讨论(0)
  • 2020-12-28 12:35

    Hi there and thanks for the code. I made a class from it and added some checks so it doesn't complain when the server is offline. Since I took it from here I will share the class back:

    <?php
    
    class IceCast {
        var $server = "http://localhost:8000";
        var $stats_file = "/status.xsl";
        var $radio_info=array();
    
        function __construct() {
            //build array to store our radio stats for later use        
            $this->radio_info['server'] = $this->server;
            $this->radio_info['title'] = 'Offline';
            $this->radio_info['description'] = 'Radio offline';
            $this->radio_info['content_type'] = '';
            $this->radio_info['mount_start'] = '';
            $this->radio_info['bit_rate'] = '';
            $this->radio_info['listeners'] = '';
            $this->radio_info['most_listeners'] = '';
            $this->radio_info['genre'] = '';
            $this->radio_info['url'] = '';
            $this->radio_info['now_playing'] = array();
            $this->radio_info['now_playing']['artist'] = 'Unknown';
            $this->radio_info['now_playing']['track'] = 'Unknown';
        }
    
        function setUrl($url) {
            $this->server=$url;
            $this->radio_info['server'] = $this->server;
        }
    
        private function fetch() {
            //create a new curl resource
            $ch = curl_init();
    
            //set url
            curl_setopt($ch,CURLOPT_URL,$this->server.$this->stats_file);
    
            //return as a string
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    
            //$output = our stauts.xsl file
            $output = curl_exec($ch);
    
            //close curl resource to free up system resources
            curl_close($ch);
    
            return $output;
        }
    
        function getStatus() {
            $output=$this->fetch();
    
            //loop through $ouput and sort into our different arrays
            $temp_array = array();
    
            $search_for = "<td\s[^>]*class=\"streamdata\">(.*)<\/td>";
            $search_td = array('<td class="streamdata">','</td>');
    
    
            if(preg_match_all("/$search_for/siU",$output,$matches)) {
               foreach($matches[0] as $match) {
                  $to_push = str_replace($search_td,'',$match);
                  $to_push = trim($to_push);
                  array_push($temp_array,$to_push);
               }
            }
    
            if(count($temp_array)) {
                //sort our temp array into our ral array
                $this->radio_info['title'] = $temp_array[0];
                $this->radio_info['description'] = $temp_array[1];
                $this->radio_info['content_type'] = $temp_array[2];
                $this->radio_info['mount_start'] = $temp_array[3];
                $this->radio_info['bit_rate'] = $temp_array[4];
                $this->radio_info['listeners'] = $temp_array[5];
                $this->radio_info['most_listeners'] = $temp_array[6];
                $this->radio_info['genre'] = $temp_array[7];
                $this->radio_info['url'] = $temp_array[8];
    
                if(isset($temp_array[9])) {
                    $x = explode(" - ",$temp_array[9]);
                    $this->radio_info['now_playing']['artist'] = $x[0];
                    $this->radio_info['now_playing']['track'] = $x[1];
                }
            }
            return $this->radio_info;
            }
    
    }
    ?>
    
    0 讨论(0)
提交回复
热议问题