XML-Parsing (Shoutcast)

Status
Für weitere Antworten geschlossen.

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_data, 1)) { 
  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
 
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");
 
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.
 
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.
 
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 :)
 
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.
 
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.
 
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
 
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, &$errstr, 10);
$sp_data = "";

if (!$sp)
	die('Error while connecting to Server.');
else{
	stream_set_blocking($sp, false);
	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($sp, 31337);
		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.
 
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($hours, 2, "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($minutes, 2, "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($seconds, 2, "0", STR_PAD_LEFT);

    // done!
    return $hms;
    
  }

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

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

if (!$sp)
    die('Error while connecting to Server.');
else{
    stream_set_blocking($sp, false);
    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($sp, 31337);
        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
Für weitere Antworten geschlossen.
Zurück
Oben