1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

XML-Parsing (Shoutcast)

Dieses Thema im Forum "Internetradio- und Heimstudio-Software" wurde erstellt von zee100, 12. August 2006.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. zee100

    zee100 Benutzer

    Hallo Freunde.
    Habe eine Frage zum Thema Shoutcast XML Parsing.
    Nach langer Google Suche hab ich ein funktionstüchtiges XML Parsing Script für Shoutcast gefunden.
    Bin aber immer noch php Anfängerin und komme damit nicht weiter.
    Dieses Script gibt sämtliche Shoutcast XML Informationen bekannt.
    Ich möchte aus diesem Script aber nur folgendes ausgelesen haben.

    + LISTENER
    + HOSTNAME xx.xx.xx.xx
    + USERAGENT WinampMPEG/5.24
    + UNDERRUNS
    + CONNECTTIME 52733
    + POINTER
    + UID 214690

    IP Adresse hab ich jetzt mal entfernt.
    Das + Zeichen sollte möglichst nicht mit angezeigt werden.

    Hier mal das Script.

    PHP:
    <? 

    // grabxml 0.1.2 (php) 
    // 1-12-2001 t. pepper 
    // yay i made this 
    // yay i stole some of it off php.net's xml docs pages 

    // SET THESE VARIABLES 

    $password="xxxxxxxx"
    $host="209.9.226.67"
    $port="9660"

    // you can change these event handlers to do whatever 
    // you want upon receiving the XML data.  right now, they 
    // just dump the parsed xml in as pretty a way as they can 

    function startElement($parser$name$attrs) { 
      global 
    $depth$lastelem
      if(
    $lastelem!='data') echo "\n"

      for (
    $i 0$i $depth[$parser]; $i++) echo "  "
      echo 
    "+ <b>$name</b>  "
      
    $depth[$parser]++; 

      
    $lastelem='start'


    function 
    endElement($parser$name) { 
       global 
    $depth$lastelem
       
    //echo "<b>/$name</b>  "; 
       
    if ($lastelem=='data') echo "\n"
       
    $depth[$parser]--; 


    function 
    characterData($parser$data) { 
       global 
    $depth$lastelem
       
    $data=trim($data); 
       if (
    $data) { echo $data$lastelem='data'; } 


    // here we go 

    $depth = array(); 
    $lastelem=""

    // set up html 

    echo "<HTML>\n<HEAD><TITLE>XML parsing for $host:$port</TITLE></HEAD>\n<BODY><PRE>\n"

    // connect to sc_serv 

    $sp=fsockopen($host,$port,&$errno,&$errstr,10); 
    if(!
    $sp) die("Could not contact $host:$port - $errstr\n"); 

    set_socket_blocking($sp,false); 

    // send request 

    fputs($sp,"GET /admin.cgi?pass=$password&mode=viewxml HTTP/1.1\nUser-Agent:Mozilla\n\n"); 

    // fetch response, timeout if it takes > 15s 

    for($i=0$i<30$i++) { 
      if(
    feof($sp)) break; // exit if connection broken 
      
    $sp_data.=fread($sp,31337); 
      
    usleep(500000); 


    // strip HTTP headers so all we have is XML data 

    $sp_data=ereg_replace("^.*<\?xml ","<?xml ",$sp_data); 

    /* xml code goes here, here's a plain empty parser */ 

    $xml_parser xml_parser_create(); 
    xml_set_element_handler($xml_parser"startElement""endElement"); 
    xml_set_character_data_handler($xml_parser"characterData"); 

    if (!
    xml_parse($xml_parser$sp_data1)) { 
      die(
    sprintf("XML error: %s at line %d"
      
    xml_error_string(xml_get_error_code($xml_parser)), 
      
    xml_get_current_line_number($xml_parser))); 


    xml_parser_free($xml_parser); 

    // close up HTML 

    echo "</PRE></BODY></HTML>"

    ?> 
    Wenn mir eventuell jemand dabei helfen könnte, währe ich sehr dankbar.

    Grüsse
    Marion
     
  2. ForenKater

    ForenKater Benutzer

    AW: XML-Parsing (Shoutcast)

    Nehmen wir an, Du sendest unter:

    http://mein.radioserver.de:8000


    Code:
    function get_radio_item($item) { 
    
    	$file = "mein.radioserver.de";
    	$port = "8000";
    	$user = "admin";
    	$passw = "meinpasswort";
    	
      $fp = @fsockopen ($file, $port, &$errno, &$errstr, 5); 
      if (!$fp) { 
        return 0; 
      } else { 
          fputs($fp, "GET /admin.cgi?pass={$passw}&mode=viewxml HTTP/1.1\r\n"
                    ."User-Agent: XML Getter (Mozilla Compatible)\r\n\r\n");
          while (!feof($fp)) { 
            $xml .= fgets($fp,1024); 
          }
          list(,$xml) = explode("<".strtoupper($item).">",$xml); 
          list($xml,) = explode("</".strtoupper($item).">",$xml); 
          fclose($fp); 
      } 
      return $xml; 
    } 
    
    // XML mit der Funktion auslesen, Beispiel:
    $station_desc = get_radio_item("SERVERTITLE");
     
  3. zee100

    zee100 Benutzer

    AW: XML-Parsing (Shoutcast)

    Zunächst einmal meinen Dank.
    Wenn ich das so übernehme mit
    echo "<p><font size=3 face=Verdana>$station_desc</font></p>";
    am Ende des Scripts bekomme ich eine O angezeigt.
    Wie gesagt, habe nicht viel Ahnung von php.
     
  4. ForenKater

    ForenKater Benutzer

    AW: XML-Parsing (Shoutcast)

    Try mal so:

    Code:
    function get_radio_item($file, $port, $pass, $item) { 
      $fp = @fsockopen ($file, $port, &$errno, &$errstr, 5); 
      if (!$fp) { 
        return 0; 
      } else { 
          fputs($fp, "GET /admin.cgi?pass={$pass}&mode=viewxml HTTP/1.1\r\n"
                    ."User-Agent: XML Getter (Mozilla Compatible)\r\n\r\n");
          while (!feof($fp)) { 
            $xml .= fgets($fp,1024); 
          }
          list(,$xml) = explode("<".strtoupper($item).">",$xml); 
          list($xml,) = explode("</".strtoupper($item).">",$xml); 
          fclose($fp); 
      } 
      return $xml; 
    } 
    
    $station_desc = get_radio_item("mein.radioserver.de", "8000", "meinpasswort", "SERVERTITLE");
    echo $station_desc;
    Und benutz mal ne andere Angabe, zB den CURRENTLISTENERS.
     
  5. zee100

    zee100 Benutzer

    AW: XML-Parsing (Shoutcast)

    Sorry, aber das bleibt bei einer 0 als Ausgabe.
    Egal was ich versuche.
     
  6. Pegasus

    Pegasus Benutzer

    AW: XML-Parsing (Shoutcast)

    probier doch mal mein radio_stats
    da kannst du jede einzelne variable der xml-seite einfach auslesen.
    Solltest du damit Probleme haben, kann ich dir jederzeit helfen :)
     
  7. zee100

    zee100 Benutzer

    AW: XML-Parsing (Shoutcast)

    Manuel, danke.
    Hab hier noch folgende Version von dir rumliegen.

    Startdate: 09.02.05
    Version: 0.1.7

    Bringt mich aber irgendwie nicht weiter, da ich gerne den
    HOSTNAME sowie USERAGENT als einzige Ausgabe möchte.
    Für Titel und Hörerzahlen nutze ich bereits andere Scripte.
     
  8. Pegasus

    Pegasus Benutzer

    AW: XML-Parsing (Shoutcast)

    kannst du auch ausgeben lassen, und zwar über

    <?php echo $radio->value("HOSTNAME");?>
    und
    <?php echo $radio->value("USERAGENT");?>

    Das allerbeste wäre natürlich, wenn du bereits PHP5 zur Verfügung hast, das ist diese Auswertung gar kein Problem mehr ;)

    EDIT: Ansonsten kann ich dir schnell nen 10zeiler zusammenhacken, der dir nur diese beiden Werte ausgibt.
     
  9. zee100

    zee100 Benutzer

    AW: XML-Parsing (Shoutcast)

    PHP 5.1.1

    Werde mich mal dran machen, wenn ich etwas mehr Zeit finde.
    Aber so wie ich mich kenne, kommen da nur Fehlermeldungen bei herraus.

    Tja, so ist das mit den Frauen und Technik:D
     
  10. Pegasus

    Pegasus Benutzer

    AW: XML-Parsing (Shoutcast)

    So auf die Schnelle, weil mit PHP so vieles einfacher wird ;)

    PHP:
    <?php
    $host 
    "localhost";
    $port "8000";
    $pass "changeme";

    $sp = @fsockopen($host$port, &$errno, &$errstr10);
    $sp_data "";

    if (!
    $sp)
        die(
    'Error while connecting to Server.');
    else{
        
    stream_set_blocking($spfalse);
        
    fputs($sp"GET /admin.cgi?pass=" $pass "&mode=viewxml HTTP/1.1\nUser-Agent: Mozilla\n\n");
        for(
    $i 0$i 30$i++) {
            if(
    feof($sp))
                break;
            
    $sp_data .= fread($sp31337);
            
    usleep(500000);
        }
    }

    $sp_data ereg_replace("^.*<SHOUTCASTSERVER""<SHOUTCASTSERVER"$sp_data);
    $xml simplexml_load_string($sp_data);

    if(isset(
    $xml->LISTENERS->LISTENER)){
        foreach(
    $xml->LISTENERS->LISTENER as $listener){
            echo 
    "Host: " $listener->HOSTNAME "<br />\n";
            echo 
    "Useragent: " $listener->USERAGENT "<hr />\n";
        }
    }
    else
        echo 
    "no listeners";
    ?>
    Natürlich musst du $host, $port uns $pass (das Passwort) anpassen. Sollte es keine Hörer geben, kommt eine entsprechende Meldung.

    EDIT: Es gibt nicht nur keine Fehlermeldungen, sondern nichtmal Warnungen oder Notices, da ich grundsätzlich mein error_reporting auf E_ALL stehen hab ;)

    EDIT2: Wenn du andere Werte eines hörers auslesen willst, geht das einfach mit $listener->{node_name} ;) Die Schleife zeigt grundsätzlich alle Höhrer an, die aktuell vorhanden sind.
     
  11. zee100

    zee100 Benutzer

    AW: XML-Parsing (Shoutcast)

    Manuel, recht herzlichen Dank und ein kleines virtuelles Küsschen dafür.
     
  12. zee100

    zee100 Benutzer

    AW: XML-Parsing (Shoutcast)

    Habe das original Script von Manuel mal etwas erweitert.
    Zeigt jetzt zusätzlich die Zuhörzeit (irgendwie ein blödes Wort, naja..) an.
    Damit es nicht immer so umständlich ist hab ich dann auch gleich noch die Sekunden Anzeige, die Shoutcast im xml liefert in der Form von Stunden:Minuten:Sekunden umrechnen lassen.

    Vielleicht benötigt ja mal jemand dieses Script.

    PHP:
    <html>
    <body bgcolor="#333333" text="orange">

    <meta http-equiv="Refresh" content="30" />
    <div align="center">
    <?php
    function sec2hms ($sec$padHours false
      {

        
    // holds formatted string
        
    $hms "";
        
        
    // there are 3600 seconds in an hour, so if we
        // divide total seconds by 3600 and throw away
        // the remainder, we've got the number of hours
        
    $hours intval(intval($sec) / 3600); 

        
    // add to $hms, with a leading 0 if asked for
        
    $hms .= ($padHours
              ? 
    str_pad($hours2"0"STR_PAD_LEFT). ':'
              
    $hours':';
         
        
    // dividing the total seconds by 60 will give us
        // the number of minutes, but we're interested in 
        // minutes past the hour: to get that, we need to 
        // divide by 60 again and keep the remainder
        
    $minutes intval(($sec 60) % 60); 

        
    // then add to $hms (with a leading 0 if needed)
        
    $hms .= str_pad($minutes2"0"STR_PAD_LEFT). ':';

        
    // seconds are simple - just divide the total
        // seconds by 60 and keep the remainder
        
    $seconds intval($sec 60); 

        
    // add to $hms, again with a leading 0 if needed
        
    $hms .= str_pad($seconds2"0"STR_PAD_LEFT);

        
    // done!
        
    return $hms;
        
      }

    ?>
    <?php
    $host 
    "xxx.x.xxx.xx";
    $port "xxxx";
    $pass "xxxxxxxxxxxxxxx";

    $sp = @fsockopen($host$port, &$errno, &$errstr10);
    $sp_data "";

    if (!
    $sp)
        die(
    'Error while connecting to Server.');
    else{
        
    stream_set_blocking($spfalse);
        
    fputs($sp"GET /admin.cgi?pass=" $pass "&mode=viewxml HTTP/1.1\nUser-Agent: Mozilla\n\n");
        for(
    $i 0$i 30$i++) {
            if(
    feof($sp))
                break;
            
    $sp_data .= fread($sp31337);
            
    usleep(500000);
        }
    }

    $sp_data ereg_replace("^.*<SHOUTCASTSERVER""<SHOUTCASTSERVER"$sp_data);
    $xml simplexml_load_string($sp_data);

    if(isset(
    $xml->LISTENERS->LISTENER)){
        foreach(
    $xml->LISTENERS->LISTENER as $listener){
            echo
    "<font color=#ffffff font face=verdana size=1><b> Host - IP: " $listener->HOSTNAME 

    "</b></font><br />\n";
            echo 
    "<font color=#FFcc00 font face=verdana size=1><b> Media Player: " $listener-

    >
    USERAGENT "</b></font><br> \n";
    echo 
    "<font color=#ffffff font face=verdana size=1><b>Listening time: " sec2hms($listener-

    >
    CONNECTTIME) . "</b></font><hr> \n";
        }
    }
    else
        echo 
    "no listeners";
    ?> 
    </div> 
    </body>
    </html>
    Hintergrundfarbe, Schriftfarbe und Größe, sowie die refresh Zeit können natürlich geändert werden.

    Gruß
    Marion
     

Status des Themas:
Es sind keine weiteren Antworten möglich.

Diese Seite empfehlen