ShoutCast auslesen

#1
Nabend...

gibt es irgendwie die Möglichkeit die ShoutCast auszulesen und auf einer HP anzuzeigen, wenn möglich sogar in nem LiveTicker (Laufschrift o.ä.).

Wäre ja für jede Hilfe dankebar, da ich sowat noch nich gemacht hab.

Thx Itchy
 

ERit

New member
#2
hm, also was mir bekannt ist nicht ... und ja ... mit php ist das vielleicht möglich, aber das script müsste den stream entschlüsseln denk ich mal ... und da bräuchtest du ein aufwändigeres script ... das den header lesen kann bzw den namen des songs oder sowas in der art. also nicht unmöglich, aber mit sehr viel aufwand verbunden. kenn mich da überhaupt nicht aus, obwohl ich nächstes jahr als diplomarbeit einen live-tv streaming server schreibe ?( und leider noch keinen ansatz gefunden habe.
lg
 
#3
habe hier mal was zusammengecodet ...

funzt auf jeden fall - denn ich habe es getestet.

aus verschiedensten sachen zusammengestellt ... einiges habe ich schon in der ausgabe drin, ein paar andere sachen kannst du noch einfügen

$server und $port anpassen!

Code:
<?php
## shoutcasthack by bikky on ##
$server = "deinserver.de";
$port = 8000;
    $fp = @fsockopen($server, $port, $errno, $errstr, 30);
    
    if ($fp) {
        fputs($fp, "GET /7.html HTTP/1.0\r\nUser-Agent: XML Getter (Mozilla Compatible)\r\n\r\n");
        while(!feof($fp))
            $page .= fgets($fp, 1000);
        fclose($fp);
        $page = ereg_replace(".*<body>", "", $page);
        $page = ereg_replace("</body>.*", ",", $page);
        $numbers = explode(",", $page);
        $shoutcast_currentlisteners = $numbers[0];
        $connected = $numbers[1];
        if($connected == 1) {
            $radio_status = 1;
            $wordconnected = "yes";
        }
        else
            $wordconnected = "no";
        $shoutcast_peaklisteners = $numbers[2];
        $shoutcast_maxlisteners = $numbers[3];
        $shoutcast_reportedlisteners = $numbers[4];
        $shoutcast_bitrate = $numbers[5];
        $shoutcast_cursong = $numbers[6];
        $shoutcast_curbwidth = $shoutcast_bitrate * $shoutcast_currentlisteners;
        $shoutcast_peakbwidth = $shoutcast_bitrate * $shoutcast_peaklisteners;
    }

## output on ##    
echo '<html><title>Shoutcasthack by bikky</title><body>';
echo 'Anzahl der hoerer: ' . $shoutcast_currentlisteners . '<br />';
echo 'Bitrate: ' . $shoutcast_bitrate .'kb/s <br />';
echo 'Zuhoerer Peak: ' . $shoutcast_peaklisteners . '<br />';
echo 'Maximale Zuhoerer: ' . $shoutcast_maxlisteners . '<br />';
echo 'Aktueller Song: >>' . $shoutcast_cursong . '<< <br />';
echo '</body></html>';
## output off ##
## shoutcasthack by bikky off ##
?>
mfg bikky

p.s. wäre über eine meldung HOCH erfreut ...
 
#5
geht 100%

habe es auf 2verschiedenen servern gerade nochmal probiert!!!

mfg bikky

hier nochmal eine besser kommentierte version (die 100% funzt...)
Code:
<?php
## shoutcasthack by bikky on ##
$server = "deinserver.de"; //hier deinen server eintragen z.b. musik.de oder 213.61.885.8
$port = 8000; //hier den port eintragen (ist standart 8000)
    $fp = @fsockopen($server, $port, $errno, $errstr, 30);
    
    if ($fp) {
        fputs($fp, "GET /7.html HTTP/1.0\r\nUser-Agent: XML Getter (Mozilla Compatible)\r\n\r\n");
        while(!feof($fp))
            $page .= fgets($fp, 1000);
        fclose($fp);
        $page = ereg_replace(".*<body>", "", $page);
        $page = ereg_replace("</body>.*", ",", $page);
        $numbers = explode(",", $page);
        $shoutcast_currentlisteners = $numbers[0]; //variable ueber die aktuelle anzahl der zuhoerer
        $connected = $numbers[1]; //variable zum anzeigen ob ein sender verbunden sind
        if($connected == 1) {
            $radio_status = 1; //variable zum anzeigen ob radio an ist oder nicht
            $wordconnected = "yes"; //zusaetzliche variable die ich brauchte ;)
        }
        else
            $wordconnected = "no"; //zusaetzliche variable die ich brauchte
        $shoutcast_peaklisteners = $numbers[2]; //variable die die anzahl der peaks angiebt
        $shoutcast_maxlisteners = $numbers[3]; //variable ueber die maximal moegliche anzahl der zuhoerer
        $shoutcast_reportedlisteners = $numbers[4]; //
        $shoutcast_bitrate = $numbers[5]; //bitrate ;)
        $shoutcast_cursong = $numbers[6]; //aktueller song 
        $shoutcast_curbwidth = $shoutcast_bitrate * $shoutcast_currentlisteners; //gesamtbandbreite
        $shoutcast_peakbwidth = $shoutcast_bitrate * $shoutcast_peaklisteners; //gesamtpeakbandbreite
    }

## output on ##    
echo '<html><title>Shoutcasthack by bikky</title><body>';
if ($radio_status == 1) {
	echo 'Anzahl der hoerer: ' . $shoutcast_currentlisteners . '<br />';
	echo 'Gesamtbandbreite: ' . $shoutcast_curbwidth . ' kb/s<br />';
	echo 'Bitrate: ' . $shoutcast_bitrate .' kb/s <br />';
	echo 'Zuhoerer Peak: ' . $shoutcast_peaklisteners . '<br />';
	echo 'Bandbreite Peak: ' . $shoutcast_peakbwidth . ' kb/s<br />';
	echo 'Max. moegliche Zuhoerer: ' . $shoutcast_maxlisteners . '<br />';
	echo 'Aktueller Song: >>' . $shoutcast_cursong . '<< <br />';
}	
	else {
		echo '<h1>Sorry aber das radio ist zur zeit offline!</h1>';
}
echo '</body></html>';
## output off ##
## shoutcasthack by bikky off ##
?>
 
#6
Soweit funzt das super...thx =)

Kann man da auch noch den Moderator anzeigen lassen?

Normalerweise müsste man dieses doch auch an ein Template anpassen können, oder?
 
#9
bikmaek, gute Script. Mich interessiert, wie du da vorgegangen bist. Paket abgefangen oder bei google gesucht, oder doch anders?
 
#10
Original von Digi
bikmaek, gute Script. Mich interessiert, wie du da vorgegangen bist. Paket abgefangen oder bei google gesucht, oder doch anders?
1. interessierte ich mich schon länger dafür (nur der anreiz fehlte)
2. habe ich wbb2 boards und dafür gibt es so was ähnliches
3. aus verschiedenen scripten / hacks zusammengebastelt
4. ein wenig suchmaschinen (ja auch google ;) )
5. ein wenig php kenntnisse
6. ist dann das rausgekommen was da ist ;)

mfg bikky

[edit]
p.s. das mit dem aktuellen DJ geht so ohne weiteres NICHT, da diese angabe nicht auf die page übertragen wird und ich die somit nicht auslesen kann ...

mfg bikky
[/edit]
 
#13
Was isn der AIM?

Zum vorigen Thema.. Beim Shoutcastz server gibt es die 7.html, welche ohne passwort ausgelesen werden kann.
Wenn du aber ganz aufmerksamm bist, kannst du dir im administrationspanel eine xml datei ausgebnen lassen, in der noch viel mehr informationen stehen.
Das einzige problem dabei, ist dass du dazu das passwort mit angeben musst. Was ein gewisses Sicherheitsrisiko birgt.
 
#14
AIM=AOL Instant Messenger

Jetzt hab ich hier nen Codeschnippse verfasst, der euch sicherlich helfen wird ;)

<?php

function shoutcast_info($file, $port, $pass, $item, $quantity=10) {
$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);
}
fclose($fp);
if (is_array($item)) {
$return_r = array();
foreach ($item as $value) {
preg_match("/\<".$value."\>(.*?)\<\/".$value."\>/si", $xml, $return);
$tempArray = array( $value => $return[1]);
$return_r = array_merge($return_r, $tempArray);
}
return $return_r;
}
if ($item == "playlist") {
$return_r = array();
preg_match_all("/\<SONG\>(.*?)\<\/SONG\>/si", $xml, $results);
for($i=0; $i<$quantity && $i<count($results[1]);$i++) {
preg_match("/\<PLAYEDAT\>(.*?)\<\/PLAYEDAT\>/si", $results[1][$i], $date);
preg_match("/\<TITLE\>(.*?)\<\/TITLE\>/si", $results[1][$i], $title);
$date = $date[1];
$title = $title[1];
$return_r[] = date("G:i:s", $date)." ".$title;
}
return $return_r;
} else {
preg_match("/\<".$item."\>(.*?)\<\/".$item."\>/si", $xml, $return);
return $return[1];
}
}
}


$item = array('streamstatus',
'servergenre',
'currentlisteners'
'bitrate');
$value = shoutcast_info("streamurl", "streamport", "streampass", $item);
if ($value[streamstatus] == 0) {
echo "<center />Webradio offline";
} else {
echo "<center />Webradio online<br />\n
Zuhörer: {$value[currentlisteners]}<br />\n";
Aktuelles Genre: {$value[servergenre]}<br />n";
Song: {$value[currentsong]}<br />\n";
DJ: {$value[servertitle]}<br />n";
Bitrate: {$value[bitrate]}<br />\n";
}


?>

Ich persönlich hänge an dem Problem, auszulesen, ob man selbst gerade zuhört ;) Weiß jemand Rat?!?
 
#15
Das mit dem selbst zuhören ist eigentlich relativ einfach.
Falls es noch interessiert.

In den XML Stats von shoutcast stehen immer die IPs der Listener.

Man lese diese IPs aus und vergleiche die mit der des aktuellen Listeners der gerade auf der Seite rumsurft.

Stimmt seine mit der die in Shoutcast geloggt ist überein hört er zu, wenn nicht hört er nicht zu.

Aber wie genau ich das machen muss weiß ich auch noch nicht.
 
#17
Ich bin jetzt aktuell soweit das ich mit diesem code zumindest eine Listener IP auslesen kann:
PHP:
$scip = "xxx.xxx.xxx.xxx"; // ip or url of shoutcast server
$scport = "12345";                   // port of shoutcast server
$scpass = "xxx";                 // password to shoutcast server

$scfp = @fsockopen("$scip", $scport, &$errno, &$errstr, 30);

if(!$scfp) {
  $scsuccs=1;
}

if($scsuccs!=1){
 fputs($scfp,"GET /admin.cgi?pass=$scpass&mode=viewxml HTTP/1.0\r\nUser-Agent: SHOUTcast Song Status (Mozilla Compatible)\r\n\r\n");
 while(!feof($scfp)) {
  $page .= fgets($scfp, 1000);
 }

 $loop = array("HOSTNAME");
 $y=0;

 while($loop[$y]!=''){
  $pageed = ereg_replace(".*<$loop[$y]>", "", $page);
  $scphp = strtolower($loop[$y]);
  $$scphp = ereg_replace("</$loop[$y]>.*", "", $pageed);
  
  if($loop[$y]==HOSTNAME)
   $$scphp = urldecode($$scphp);

$y++;

 }
fclose($scfp);
}
Dieser wird in der variable $hostname gespeichert.
Nur wie krieg ich die restlichen IPs jetzt noch ausgelesen?
 
#18
Shoutcast AIM=AOL Instant Messenger

Hallo TrioxX

Habe deinen codeschnipsel mal getestet -- leider funzt das bei mir nicht.. null Ahnung halt .. sorry .. alsooo ich würde mich freuen wenn Du mir sagen könntest .. WO muss ich genau stream URL .. Port und PW eintragen ??

Des weiteren bekomme ich beim Aufruf des Scripts folgende Fehlermeldung

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in /pages/68/6e/d0005160/home/htdocs/NetRadio-HP/shoutcast_stats/shoutcast_info.php on line 46

in dieser Zeile habe ich ... 'bitrate');

Währe toll wenn Du mir da weiterhelfen könntest, zumal ich ein wenig ausgekürzt diesen schnipsel gern einbauen und nützen würde .. für mich wichtig währe .. den laufenden titel .. sowie den Moderator (der ist im shoutcast unter AIM eingetragen) auf unserer HP anzuzeigen, evtl durch die Vergabe einer Ziffer im ICQ, soll dazu dann ein Foto/Bild eingebunden werden.

Danke im Voraus !!
Mfg
DJPeter
 
#19
Hi @all

Ich hätte da auch ne Frage zu...
kann man die listener von zwei servern mit jeweils 4 ports anzeigen?

ich mein ...ich will nur die zuhörerzahl der zwei server und den insgesamt 8 ports zusammen anzeigen.

z.B. : Aktuelle Zuhörerzahl: (alle zwei server und alle ports)

greez *ide
 
Oben