
Sessantottesimo articolo dedicato alle web radio.
Carissimi internauti, è passato molto tempo (e circa altri sessanta articoli…) da quando scrissi di come inserire una web radio all’interno di una pagina web statica.
Tutto quello che è scritto in quell’articolo, pur essendo ormai abbastanza obsoleto in favore di flash, resta comunque valido, almeno nel principio se non nell’implementazione e nei codici. Possiamo inserire un player all’interno di una pagina web con un semplice active X, o con un applicazione java.
Quello di cui cominceremo a parlare oggi, è invece un argomento nuovo (non inteso come nuova tecnologia, ma come nuovo ambito di discussione). Studieremo delle classi PHP che ci permetteranno di manipolare il file XML che il server shoutcast crea, e di estrarne contenuti e informazioni, o come si suole dire, farne il parsing.
All’interno del sito phpclasses.org, troviamo un vasto parco di classi php, tra le quali, diverse dedicate proprio a shoutcast, stiamo per studiare una di queste.
Il file class.shoutcast.php è stato strutturato dall’autore Henrik Malmberg cn 5 variabili e 20 funzioni, visioniamole insieme.
class ShoutCast {
// Public
var $host;
var $port;
var $passwd;
//Private
var $_xml;
var $_error;
Le cinque variabili sono host, port e password che corrispondono all’indirizzo ip, alla porta e alla password di utilizzo del server shoutcast, mentre _xml e _error sono delle variabili interne che visioneremo tra poco.
Funzione numero 1:
function openstats()
{
$fp = fsockopen($this->host, $this->port, $errno, $errstr, 10);
If (!$fp)
{
$this->_error = “$errstr ($errno)”;
return(0);
}
else
{
fputs($fp, “GET /admin.cgi?
pass=”.$this->passwd.”&mode=viewxml HTTP/1.0\r\n”);
fputs($fp, “User-Agent:
Mozilla\r\n\r\n”);
while (!feof($fp)) {
$this->_xml .= fgets($fp, 512);
}
fclose($fp);
if (stristr($this->_xml, “HTTP/1.0 200 OK”) == true) {
// <-H> Thanks to Blaster for this fix.. trim();
$this->_xml = trim(substr($this->_xml, 42));
} else {
$this->_error = “Bad login”;
return(0);
}
$xmlparser = xml_parser_create();
if (!xml_parse_into_struct($xmlparser, $this->_xml, $this->_values, $this->_indexes)) {
$this->_error = “Unparsable XML”;
return(0);
}
xml_parser_free($xmlparser);
return(1);
}
}
fsockopen inizializza una connessione nel dominio Internet (AF_INET, usando TCP o UDP) o Unix (AF_UNIX). Restituisce un puntatore a file (nel nostro caso $fp) ed ha come parametri l’hostname, la porta, un numero d’errore, una stringa d’errore e un timeout in secondi)
Se fp non è valido (if not $fp, indica il fallimento dell’apertura della socket) allora si inizia una procedura d’errore.
Tale procedura d’errore consiste semplicemente nell’inserire all’interno della variabile _error, la stringa e il numero d’errore generati dalla fsockopen. Nel caso in cui invece la socket si sia aperta correttamente, allora scriviamo tramite
fputs (che molti conosceranno come fwrite, ma è la stessa cosa.. si tratta in soldoni di una funzione che scriverà la stringa all’interno del flusso del file puntato da $fp), il contenuto scritto.
Una volta fatto questo fintantochè il file non finisce, scriviamo all’interno della variabile _xml il contenuto del file puntato da $fp, 512 byte alla volta, alchè chiudiamo il flusso del file puntato da $fp.
Possiamo quindi cominciare a fare dei controlli. Il primo, all’interno di questa funzione, è il controllo di login.
Stristr è una funzione di ricerca di una stringa all’interno di un altra, e restituisce generalmente il file dalla prima occorrenza della stringa cercata fino alla fine. In questo caso, si usa un booleano, per verificare la presenza o meno della stringa cercata.
Nel caso in cui la stringa sia presente, effettuiamo un taglio tramite substr dei primi 42 caratteri della stringa e alchè la depuriamo da caratteri non necessari con trim.
Se la stringa non è presente, restituiamo un messaggio di BAD LOGIN.
A questo punto possiamo creare un parser xml e piazzarlo in una sua bella variabile. Alchè, se non è possibile fare il parsing dell’xml che abbiamo dato in pasto alla funzione (la variabile _xml) restituiamo un errore di xml imparsingabile altrimenti liberiamo il parser e ritorniamo all’ovile.
A questo punto, abbiamo preparato il terreno alle successive operazioni.
function GetCurrentListenersCount() {
return($this->_values[$this->_indexes["CURRENTLISTENERS"][0]]["value"]);
}
Questa funzione restituisce un counter del numero degli ascoltatori attualmente presenti.
Funzione numero 3:
|
function GetPeakListenersCount() {
return($this->_values[$this->_indexes["PEAKLISTENERS"][0]]["value"]);
}
|
Questa funzione restituisce un counter con il picco degli ascolti sinora effettuato.
Funzione numero 4:
function GetMaxListenersCount() {
return($this->_values[$this->_indexes["MAXLISTENERS"][0]]["value"]);
}
Questa funzione restituisce un counter con il massimo numero degli ascoltatori attuali.
Funzione numero 5:
function GetReportedListenersCount() {
return($this->_values[$this->_indexes["REPORTEDLISTENERS"][0]]["value"]);
}
Questa funzione restituisce il numero di ascoltatori riportati dal server shoutcast al momento.
Funzione numero 6:
function GetAverageListenTime() {
return($this->_values[$this->_indexes["AVERAGETIME"][0]]["value"]);
}
Questa funzione restituisce il tempo medio di ascolto del flusso streaming del server shoutcast.
Funzione numero 7:
|
function GetServerGenre() {
return($this->_values[$this->_indexes["SERVERGENRE"][0]]["value"]);
}
Questa funzione restituisce il genere del flusso streaming, che ricordo, è un parametro obbligatorio da settare.
Funzione numero 8:
function GetServerURL() {
return($this->_values[$this->_indexes["SERVERURL"][0]]["value"]);
}
Questa funzione restituisce l’indirizzo del server shoutcast.
Funzione numero 9:
|
function GetServerTitle() {
return($this->_values[$this->_indexes["SERVERTITLE"][0]]["value"]);
}
Questa funzione restituisce il nome della radio.
Funzione numero 10:
function GetCurrentSongTitle() {
return($this->_values[$this->_indexes["SONGTITLE"][0]]["value"]);
}
Questa funzione restituisce il nome del brano correntemente in trasmissione.
Funzioni numero 11/12/13:
function GetIRC() {
return($this->_values[$this->_indexes["IRC"][0]]["value"]);
}
function GetAIM() {
return($this->_values[$this->_indexes["AIM"][0]]["value"]);
}
function GetICQ() {
return($this->_values[$this->_indexes["ICQ"][0]]["value"]);
}
Queste funzioni restituiscono, se ci sono chiaramente, irc, aim e icq impostati per il server.
Funzioni numero 14/15:
function GetWebHitsCount() {
return($this->_values[$this->_indexes["WEBHITS"][0]]["value"]);
}
function GetStreamHitsCount() {
return($this->_values[$this->_indexes["STREAMHITS"][0]]["value"]);
}
Queste funzioni restituiscono un counter delle visite al sito in cui si trova questo codice e il numero di aperture del flusso audio complessive.
Funzione numero 16:
function GetStreamStatus() {
return($this->_values[$this->_indexes["STREAMSTATUS"][0]]["value"]);
}
Questa funzione restituisce lo stato dello stream, ovvero se il server è online o meno.
Funzione numero 17:
function GetBitRate() {
return($this->_values[$this->_indexes["BITRATE"][0]]["value"]);
}
Questa funzione restituisce il bitrate della radio.
Funzione numero 18:
function GetSongHistory() {
for($i=1;$i_indexes['TITLE']);$i++) {
$arrhistory[$i-1] = array(
“playedat”=>$this->_values[$this->_indexes
['PLAYEDAT'][$i]]['value'],
“title”=>$this->_values[$this->_indexes['TITLE']
[$i]]['value']
);
}
return($arrhistory);
}
Questa funzione restituisce un array, contenente autore, titolo e altri dati delle N canzoni precedentemente trasmesse dal server shoutcast. Per fare questo, si utilizza un ciclo for che va da 1 alla lunghezza impostata dell’history e per ciascun indice si estraggono i dati necessari.
Funzione numero 19:
function GetListeners() {
for($i=0;$i_indexes['USERAGENT']);$i++) {
$arrlisteners[$i] = array(
“hostname”=>$this->_values[$this->_indexes
['HOSTNAME'][$i]]['value'],
“useragent”=>$this->_values[$this->_indexes
['USERAGENT'][$i]]['value'],
“underruns”=>$this->_values[$this->_indexes
['UNDERRUNS'][$i]]['value'],
“connecttime”=>$this->_values[$this->_indexes
['CONNECTTIME'][$i]]['value'],
“pointer”=>$this->_values[$this->_indexes['POINTER']
[$i]]['value'],
“uid”=>$this->_values[$this->_indexes['UID'][$i]]
['value'],
);
}
return($arrlisteners);
}
Questa funzione restituisce i dati di connessione di ogni singolo ascoltatore, come avviene nella sezione admin del server shoutcast. Per ogni useragent attualmente in lista, si estrae l’hostname, l’useragent, il numero di underruns (“cadute” nell’ascolto), il tempo di connessione, un puntatore e l’user id.
Funzione numero 20:
function geterror() { return($this->_error); }
Questa funzione restituisce l’errore riscontrato.
Abbiamo visionato le variabili e le funzioni di questa classe, capendo, almeno sommariamente, come funzionano e cosa fanno.
Il prossimo passaggio è quello di realizzare fisicamente una pagina che ci permetta di utilizzare questi dati. Sarà oggetto di un prossimo articolo.
Categories: Web Radio
6 Comments »