ShoutCast auslesen

Itchy

New member
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
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
 

bikmaek

Member
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 ...
 

bikmaek

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

Itchy

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

bikmaek

Member
wegen moderator gucke ich noch mal ;)

sicher kannst du das an ein template anpassen.

aber das kannst du ja selber versuchen :p

mfg bikky
 

Digi

Member
bikmaek, gute Script. Mich interessiert, wie du da vorgegangen bist. Paket abgefangen oder bei google gesucht, oder doch anders?
 

bikmaek

Member
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]
 

rbur222

New member
Gibt es die möglichkeit bei Shoutcast den AIM auszulesen ?

Wäre nett wenn mir da einer helfen könnte .

Mfg
 

flame

New member
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.
 

TrioxX

New member
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?!?
 

Rec@ll

New member
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.
 

TrioxX

New member
Danke, soweit war ich mit der Überlegung auch schon. jedoch haperts bei mir am gleichen Problem wie bei dir ^^
 

Rec@ll

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

DJPeter

New member
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
 

idefix145

Member
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
 

flame

New member
da gibts doch von jedem server ne 7.html
z.B. www.myshoutserver.com:port/7.html
Dort stehen die zuhörer drinnen..
einfach alle 4 files auslesen, und zusammenzählen.

evtl. findest du auch noch ne andere datei, in der NUR die zuhörer stehen, z.B. 1.html oder 3.html
 
Oben