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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
<?php
/**
*
* Slimp3-Class
* for querying the slimp3 and the squeezebox players
*
* feel free to modify and use it whereever you want.
* would be nice if you could send me your changes,
*
* Homepage:
* http://trendwhores.de/slimclass.php
*
* Tobias Schlottke <tschlottke chr(64) virtualminds chr(46) de>
* http://www.trendwhores.de
*
* Modifications by Andreas <php chr(64) simply chr(46) nu>
* + 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."<br>(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));
}
}
?>
|