Im weltweiten Netz gibt es ja nun viele Internetradios aus allen möglichen Bereichen. Viele von diesen Nutzen einen IRC Channel zum Chatten, in dem meist ein Bot – gerne ein Eggdrop – sitzt, der diverse Funktionen bietet. Eine dieser Funktionen ist es, den aktuell laufenden Titel auf Anfrage anzuzeigen. Diese Eggdrops verwenden dazu verschiedene Scripte, welche in der Scriptsprache TCL geschrieben sind. Um nun den Titel vom Radioserver – meist ein Shoutcast-Server – auszulesen, wird natürlich auch ein kleines Script benötigt. Ich möchte hier ein einfaches Beispiel bieten, wie eine solche Abfrage aussehen kann.
Das hier aufgeführte Script liefert die Titelinformationen nach Aufruf eines Triggers – !song – in den IRC-Channel zurück. Um mit dem Shoutcast-Server zu kommunizieren, werden jedoch einige Daten gebraucht. Zu diesen zählen unter anderem die Adresse des Servers, der Port und das Passwort. Diese bilden dann schon die Grundkonfiguration des Scriptes.
1 2 3 4 5 6 7 8 9 10 11 | ###### config # radiochan => IRC-Channel des Radios # streamip => IP des Radioservers # streamport => Port des Radiostreams # streampass => Adminpasswort des Radiostreams # songurl => Webadresse des Radios set radiochan "#channel" set streamip "radioserver.de" set streamport "port" set streampass "passwort" set songurl "http://dein-radio.de" |
Um nun den Trigger zu erkennen, benötigt das Script noch ein Binding. Da dieser Trigger im Channel und nicht in einem Query zum Bot erfolgt, sollte dieses Binding “public”, also öffentlich sein.
1 2 3 | ###### Bindungs # bind modus - trigger funktion bind pub - !song pub_song |
Die durch das Binding aufgerufene Funktion – in diesem Fall “pub_song” – liest dann die Daten vom Shoutcast-Server aus und postet das Ergebnis in dem Chat des Radios.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | ###### Funktionen proc shrink {calc number string start bl} { return [expr [string first "$string" $bl $start] $calc $number] } # Ausgabe des aktuell laufenden Songs. # Dies wird durch !song getriggert. proc pub_song {nick uhost hand chan arg} { global no_bots streamip streamport streampass foreach ch $no_bots { if {[string tolower $chan] == $ch} { return 0 } } if {[catch {set sock [socket $streamip $streamport] } sockerror]} { putlog "error: $sockerror" putchan $chan "Es tut mir leid, ich kann den Server nicht erreichen." return 0 } else { puts $sock "GET /admin.cgi?pass=$streampass&mode=viewxml&page=0 HTTP/1.0" puts $sock "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9)" puts $sock "Host: $streamip" puts $sock "Connection: close" puts $sock "" flush $sock while {[eof $sock] != 1} { set bl [gets $sock] if {[string first "standalone" $bl] != -1} { set streamstatus [string range $bl [shrink + 14 "<STREAMSTATUS>" 0 $bl] [shrink - 1 "</STREAMSTATUS>" 0 $bl]] set songtitle [string range $bl [shrink + 11 "<SONGTITLE" 0 $bl] [shrink - 1 "</SONGTITLE>" 0 $bl]] set songurl [string range $bl [shrink + 9 "<SONGURL>" 0 $bl] [shrink - 1 "</SONGURL>" 0 $bl]] if {$songurl != ""} { set songurl " ($songurl)" } if {$streamstatus == 1} { putchan $chan "Im Moment hörst Du: \00304 $songtitle \003 $songurl" } else { putchan $chan "Es tut mir leid, bei der Abfrage ist ein Fehler aufgetreten." } } } close $sock } } |
Viel Spaß damit 



