* http://www.trendwhores.de * * Modifications by Andreas * + Added more options to slimp3() * + Added playlist() /w related options * + Modified display() to get strings with spaces instead of +'s provided by urlencode * + Modified _parse() to handle new options. Quick'n'dirty hack, could probably be prettier! * * Updated by Vollmer (vollmer@ampache.org) * + Added timeout on fsockopen and error information * + Added comments and cleaned up code to fix ampache coding standards * License: GPL * */ class Slimserver { var $host = 'localhost'; var $port = 9090; var $_connection; var $playerindex; var $playercount; function Slimserver($host = NULL, $port = 9090) { if ($host && $port) { $this->host = $host; $this->port = $port; } /* Attempt to establish connection */ if (!$this->_connection = fsockopen($this->host, $this->port,$errno,$errstr,'.5')) { debug_event('slimserver','Error: Unable to open socket,' . $errno . ' - ' . $errstr,1); return false; } $this->playercount = $this->_psend("player count ?"); for($i = 0; $i < $this->playercount; $i++) { $this->playerindex[$i]['name'] = $this->_psend("player name $i ?"); $this->playerindex[$i]['ip'] = $this->_psend("player ip $i ?"); $this->playerindex[$i]['address'] = $this->_psend("player address $i ?"); # Added some more options /andreas $this->playerindex[$i]['mode'] = $this->_psend($this->playerindex[$i]["address"] . " mode ?"); $this->playerindex[$i]['power'] = $this->_psend($this->playerindex[$i]["address"] . " power ?"); $this->playerindex[$i]['volume'] = $this->_psend($this->playerindex[$i]["address"] . " mixer volume ?"); $this->playerindex[$i]['treble'] = $this->_psend($this->playerindex[$i]["address"] . " mixer treble ?"); $this->playerindex[$i]['bass'] = $this->_psend($this->playerindex[$i]["address"] . " mixer bass ?"); $this->playerindex[$i]['tracks'] = $this->_psend($this->playerindex[$i]["address"] . " info total songs ?"); $this->playerindex[$i]['albums'] = $this->_psend($this->playerindex[$i]["address"] . " info total albums ?"); $this->playerindex[$i]['artists'] = $this->_psend($this->playerindex[$i]["address"] . " info total artists ?"); $this->playerindex[$i]['genres'] = $this->_psend($this->playerindex[$i]["address"] . " info total genres ?"); } return true; } // end constructor function nowplaying($player = 0) { $song = array( "artist" => $this->_psend("artist $player ?"), "title" => $this->_psend("title $player ?"), "path" => $this->_psend("path $player ?"), "duration" => $this->_psend("duration $player ?"), "genre" => $this->_psend("genre $player ?"), "album" => $this->_psend("album $player ?") ); return $song; } # Added playlist() for related options /andreas function playlist($player = 0) { #Information related to playlist! $index = $this->_psend("playlist index ?"); $index++; $song = array( "index" => $index, "total" => $this->_psend("playlist tracks ?"), # Spaces added to the end of the two first below, quick'n'dirty fix for parsing error... ;) "nextartist" => $this->_psend("playlist artist " . $index . " "), "nexttitle" => $this->_psend("playlist title " . $index . " "), "shuffle" => $this->_psend("playlist shuffle ?"), "repeat" => $this->_psend("playlist repeat ?") ); return $song; } function display($l1, $l2, $duration = 5, $player = 0) { #$this->_send("display ".urlencode($l1)." ".urlencode($l2)." ".$duration); # above code gave me urlencoded strings on my displat, ie "Hello%20World", below did not... /andreas (php chr(64) simply chr(46) nu) $l1 = str_replace(" ", "%20", $l1); $l2 = str_replace(" ", "%20", $l2); $this->_send("display ".$l1." ".$l2." ".$duration); } function cdisplay() { return urldecode($this->_send("display ? ?")); } function close() { $this->_send("exit"); return true; } # Modified by andreas (php chr(64) simply chr(46) nu) # Don't ask why I did stuff here, don't remember ;) function _parse($string, $cmd = NULL) { if (!$cmd); $cmd = $this->_lastcmd; $quoted = preg_quote(substr($cmd, 0, -1), "\\"); if (preg_match("/^".$quoted."(.*)/i", $string, $matches)) { $dec = urldecode(trim($matches[1])); return $dec; } elseif(preg_match("/^".substr($quoted, 0, -2)."(.*)/i", $string, $matches)) { $dec = urldecode(trim($matches[1])); if (substr($dec, -1, 1) == '?') return substr($dec, 0, -1); else return $dec; # extra parsing for cmd's where MAC address is involved. Me not good at regexps so... ;) } elseif(preg_match("/^".$quoted."(.*)/i", urldecode(trim($string)), $matches)) { $dec = trim($matches[1]); if ($dec == "0") return "play"; else return $dec; } else { return "unable to parse reply: ".$string."
(cmd was: $cmd)"; } } function _send($string) { $this->_lastcmd = $string; if (fputs($this->_connection, $string."\n")) return fgets($this->_connection); else return false; } function _psend($string) { return $this->_parse($this->_send($string)); } } ?>