2010-08-15 26 views
7

J'ai des problèmes pour afficher les statistiques (visionneuses, chansons en cours, etc.) avec PHP et je ne trouve aucune information sur la façon de procéder.Utiliser PHP pour afficher les statistiques d'Icecast2

Il y a deux fichiers XLS inclus avec Icecast2 et je pourrais inclure ces fichiers avec PHP sur mon site mais je ne veux pas mettre à jour le DIV que l'include est dans toutes les 5 secondes et cela ne marchera pas avec XLS des dossiers.

Merci!

Répondre

14

Salut à tous et merci pour le code. J'ai créé une classe à partir de celle-ci et j'ai ajouté quelques vérifications pour ne pas me plaindre lorsque le serveur est hors ligne. Depuis que je l'ai pris d'ici, je vais partager le dos de la classe:

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

très utile! merci –

+1

Ceci est une très mauvaise idée et cela va casser avec Icecast Version 1.4, car il a une interface web recréée. – ePirat

6

En utilisant ce code que je l'ai travail:

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

?> 
2

S'il vous plaît jeter un oeil à ma réponse over here pourquoi il est une très mauvaise idée d'utiliser ce script.
tl; dr: Vous ne devez pas analyser la page d'état Icecast HTML.