= 7){
list($hours, $minutes, $seconds) = explode(":", $var_timeString);
return ( ($hours*3600) + ($minutes*60) + $seconds );
}
}
// check if cmd ist set.
if ( (isset($_GET["cmd"]) && ($_GET["cmd"]!="")) ){
// Possible commands:
// Pause, Play, Next, Previous, Rewind
// SetVolume (needs 'volume' parameter, e.g. volume = 25; values: 0-100)
// SetPlayMode (needs 'mode' parameter, e.g. mode = "NORMAL"; values: "REPEAT_ALL", "SHUFFLE", "NORMAL")
// SetMut (needs 'mute' parameter, e.g. mute = 1; values: 0 = normal (no mute), 1 = mute)
// SetRadio (needs 'radio' parameter, e.g. radio = "players.creacast.com/creacast/klassik/playlist.pls"; or radio = "lsd.newmedia.tiscali-business.com/bb/redirect.lsc?content=live&media=ms&stream=ndr/live/ndr2.wma"; )
// ClearQueue
// AddToQueue (needs 'file' parameter, e.g. file = "192.168.1.20/mp3/playliste.m3u"; or file = "ipsserver/Public/test.mp3"; )
// RemoveFromQueue, SetTrack (needs 'track' parameter, e.g. track = 4; values = current playlist tracknumber )
// Info, Info2
// InputPC, InputQueue
// LastFmPersonal, LastFmRecommended
// LastFmTag (needs 'lfmTag' parameter, e.g. lfmTag = "Rock"; values: actual LastFM tags, no similar tags, no search supported yet.)
// LastFmArtist (needs 'lfmArtist' parameter, e.g. lfmArtist = "Aerosmith"; values: actual LastFM artists, no similar artists, no search supported yet.)
$action = $_GET["cmd"];
// initialize variables
$volume = -1;
$mute = "";
$mode = "";
$track = "";
$radio = "";
$file = "";
$lfmTag="";
$lfmArtist="";
$nl = '
';
switch($action)
{
case "Pause":
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Pause"'.$nl.$nl;
$content = ''.
'0'.
'';
$contentLength = strlen($content);
break;
case "Play":
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Play"'.$nl.$nl;
$content = ''.
'0'.
'1'.
'';
$contentLength = strlen($content);
break;
case "Next":
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Next"'.$nl.$nl;
$content = ''.
'0'.
'';
$contentLength = strlen($content);
break;
case "Previous":
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Previous"'.$nl.$nl;
$content = ''.
'0'.
'';
$contentLength = strlen($content);
break;
case "Rewind":
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Seek"'.$nl.$nl;
$content = ''.
'0'.
'REL_TIME'.
'00:00:00'.
'';
$contentLength = strlen($content);
break;
case "SetVolume":
if ( (isset($_GET["volume"]) && ($_GET["volume"]!="") ) ){
// get volume parameter. (needs 'volume' parameter, e.g. volume = 25; values: 0-100)
$volume = $_GET["volume"];
} else {
die("command 'SetVolume' selected, but no 'volume' parameter set.
e.g. volume = 25; values: 0-100");
}
$headerPart1 = 'POST /MediaRenderer/RenderingControl/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetVolume"'.$nl.$nl;
$content = ''.
'0'.
'Master'.
''.$volume.''.
'';
$contentLength = strlen($content)-1;
break;
case "SetMute":
if ( (isset($_GET["mute"]) && ($_GET["mute"]!="") ) ){
// get mute parameter. (needs 'mute' parameter, e.g. mute = 1; values: 0 = normal (no mute), 1 = mute)
$mute = $_GET["mute"];
} else {
die("command 'SetMute' selected, but no 'mute' parameter set.
e.g. mute = 1; values: 0 = normal (no mute), 1 = mute");
}
$headerPart1 = 'POST /MediaRenderer/RenderingControl/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetMute"'.$nl.$nl;
$content = ''.
'0'.
'Master'.
''.$mute.''.
'';
$contentLength = strlen($content);
break;
case "SetPlayMode":
if ( (isset($_GET["mode"]) && ($_GET["mode"]!="") ) ){
// get mode parameter. (needs 'mode' parameter, e.g. mode = "NORMAL"; values: "REPEAT_ALL", "SHUFFLE", "NORMAL")
$mode = $_GET["mode"];
} else {
die("command 'SetPlayMode' selected, but no 'mode' parameter set.
e.g. mode = \"NORMAL\"; values: \"REPEAT_ALL\", \"SHUFFLE\", \"NORMAL\"");
}
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetPlayMode"'.$nl.$nl;
$content = ''.
'0'.
''.$mode.''.
'';
$contentLength = strlen($content);
break;
case "SetRadio":
if ( (isset($_GET["radio"]) && ($_GET["radio"]!="") ) ){
// get radio parameter. (needs 'radio' parameter, e.g. radio = players.creacast.com/creacast/klassik/playlist.pls;)
$radio = "x-rincon-mp3radio://".$_GET["radio"];
} else {
die("command 'SetRadio' selected, but no 'radio' parameter set.
e.g. radio = players.creacast.com/creacast/klassik/playlist.pls;");
}
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"'.$nl.$nl;
$content = ''.
'0'.
''.htmlspecialchars($radio).''.
'<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="R:0/0/0" parentID="R:0/0" restricted="true"><dc:title>Radio</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON65031_</desc></item></DIDL-Lite>'.
'';
$contentLength = strlen($content);
break;
case "ClearQueue":
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#RemoveAllTracksFromQueue"'.$nl.$nl;
$content = ''.
'0'.
'';
$contentLength = strlen($content);
break;
case "AddToQueue":
if ( (isset($_GET["file"]) && ($_GET["file"]!="") ) ){
// get file parameter. (needs 'file' parameter, e.g. file = "192.168.1.20/mp3/playliste.m3u";)
$file = "x-file-cifs://".$_GET["file"];
} else {
die("command 'AddToQueue' selected, but no 'file' parameter set.
e.g. file = \"192.168.1.20/mp3/playliste.m3u\";");
}
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#AddURIToQueue"'.$nl.$nl;
$content = ''.
'0'.
''.$file.''.
''.
'0'.
'1'.
'';
$contentLength = strlen($content);
break;
case "RemoveFromQueue":
if ( (isset($_GET["track"]) && ($_GET["track"]!="") ) ){
// get track parameter. (needs 'track' parameter, e.g. track = 4; values = current playlist tracknumber)
$track = $_GET["track"];
} else {
die("command 'RemoveFromQueue' selected, but no 'track' parameter set.
e.g. track = 4; values = current playlist tracknumber");
}
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#RemoveTrackFromQueue"'.$nl.$nl;
$content = ''.
'0'.
'Q:0/'.$track.''.
'';
$contentLength = strlen($content);
break;
case "SetTrack":
if ( (isset($_GET["track"]) && ($_GET["track"]!="") ) ){
// get track parameter. (needs 'track' parameter, e.g. track = 4; values = current playlist tracknumber)
$track = $_GET["track"];
} else {
die("command 'SetTrack' selected, but no 'track' parameter set.
e.g. track = 4; values = current playlist tracknumber");
}
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Seek"'.$nl.$nl;
$content = ''.
'0'.
'TRACK_NR'.
''.$track.''.
'';
$contentLength = strlen($content);
break;
case "Info2":
case "Info":
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetPositionInfo"'.$nl.$nl;
$content = ''.
'0'.
'';
$contentLength = strlen($content);
break;
case "InputPC":
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"'.$nl.$nl;
$content = ''.
'0'.
'x-rincon-stream:RINCON_000E5834521201400'.
'<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="AI:0" parentID="AI:" restricted="true"><dc:title>Computer</dc:title><upnp:class>object.item.audioItem</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">RINCON_000E5834521201400</desc></item></DIDL-Lite>'.
'';
$contentLength = strlen($content);
break;
case "InputQueue":
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"'.$nl.$nl;
$content = ''.
'0'.
'x-rincon-queue:RINCON_000E5834521201400#0'.
''.
'';
$contentLength = strlen($content);
break;
case "LastFmPersonal":
if ($lfmUser == ""){
die("command 'LastFmPersonal' selected, but no 'lfmUser' parameter set in script file.");
}
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"'.$nl.$nl;
$content = ''.
'0'.
'lastfm://user/'.$lfmUser.'/personal'.
'<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="RP:SA_RINCON11_'.$lfmUser.':0:PERSONALRADIO" parentID="RECENT" restricted="true"><dc:title>Meine Bibliothek</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON11_'.$lfmUser.'</desc></item></DIDL-Lite>'.
'';
$contentLength = strlen($content);
break;
case "LastFmRecommended":
if ($lfmUser == ""){
die("command 'LastFmRecommended' selected, but no 'lfmUser' parameter set in script file.");
}
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"'.$nl.$nl;
$content = ''.
'0'.
'lastfm://user/'.$lfmUser.'/recommended'.
'<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="RP:SA_RINCON11_'.$lfmUser.':6:RECOMMENDED" parentID="RECENT" restricted="true"><dc:title>Meine Empfehlungen</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON11_'.$lfmUser.'</desc></item></DIDL-Lite>'.
'';
$contentLength = strlen($content);
break;
case "LastFmTag":
if ($lfmUser == ""){
die("command 'LastFmTag' selected, but no 'lfmUser' parameter set in script file.");
}
if ( (isset($_GET["lfmTag"]) && ($_GET["lfmTag"]!="") ) ){
// get lfmTag parameter. (needs 'lfmTag' parameter, e.g. lfmTag = "Rock"; values: actual LastFM tags, no similar tags, no search supported yet.)
$lfmTag = $_GET["lfmTag"];
} else {
die("command 'LastFmTag' selected, but no 'lfmTag' parameter set.
e.g. lfmTag = \"Rock\"; values: actual LastFM tags, no similar tags, no search supported yet.");
}
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"'.$nl.$nl;
$content = ''.
'0'.
'lastfm://globaltags/'.$lfmTag.''.
'<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="LFM:TAG:'.$lfmTag.'" parentID="SEARCHTAGS:'.$lfmTag.'" restricted="true"><dc:title>'.$lfmTag.'</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON11_'.$lfmUser.'</desc></item></DIDL-Lite>'.
'';
$contentLength = strlen($content);
break;
case "LastFmArtist":
if ($lfmUser == ""){
die("command 'LastFmArtist' selected, but no 'lfmUser' parameter set in script file.");
}
if ( (isset($_GET["lfmArtist"]) && ($_GET["lfmArtist"]!="") ) ){
// get lfmArtist parameter. (needs 'lfmArtist' parameter, e.g. lfmArtist = "Aerosmith"; values: actual LastFM artists, no similar artists, no search supported yet.)
$lfmArtist = $_GET["lfmArtist"];
} else {
die("command 'LastFmArtist' selected, but no 'lfmArtist' parameter set.
e.g. lfmArtist = \"Aerosmith\"; values: actual LastFM artists, no similar artists, no search supported yet.");
}
$headerPart1 = 'POST /MediaRenderer/AVTransport/Control HTTP/1.1'.$nl;
$headerPart2 = 'SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"'.$nl.$nl;
$content = ''.
'0'.
'lastfm://artist/'.$lfmArtist.'/similarartists'.
'<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><item id="LFM:ARTIST:'.$lfmArtist.'" parentID="SEARCHARTISTS:'.$lfmArtist.'" restricted="true"><dc:title>'.$lfmArtist.'</dc:title><upnp:class>object.item.audioItem.audioBroadcast</upnp:class><desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-0/">SA_RINCON11_'.$lfmUser.'</desc></item></DIDL-Lite>'.
'';
$contentLength = strlen($content);
break;
default:
die("'".$action."' is no valid command.");
break;
}
// envelope strings
$contentEnvelopeBegin = '';
$contentEnvelopeEnd = '';
// add envelope string legth to contentLength
$contentLength += 154;
// build message header part 1
$headerMainPart = 'CONNECTION: close'.$nl.
'HOST: '.$deviceAddress.':'.$devicePort.$nl.
'CONTENT-LENGTH: '.$contentLength.$nl.
'CONTENT-TYPE: text/xml; charset="utf-8"'.$nl;
// build complete UPnP-AV message for Sonos device
$streamMessage = $headerPart1.$headerMainPart.$headerPart2.$contentEnvelopeBegin.$content.$contentEnvelopeEnd;
// debug
//die($headerPart1.$headerMainPart.$headerPart2.htmlspecialchars($contentEnvelopeBegin.$content.$contentEnvelopeEnd));
// fsockopen(hostname, port, errornumber, errorstring, timeout) initiates a socket connection
$fileHandle = fsockopen ($deviceAddress, $devicePort, $errorNumber, $errorString, 10);
if (!$fileHandle)
{
// error output
echo "$errorString ($errorNumber)
\n";
}
else
{
// fwrite(handle, string) writes the contents of string to the file stream pointed to by handle .
fputs($fileHandle, $streamMessage);
$streamAnswer = "";
// get lines
while (!feof($fileHandle))
{
$streamAnswer .= fgets($fileHandle);
}
// close socket connection
fclose($fileHandle);
}
$PositionInfo["Artist"] = "";
$PositionInfo["Title"] = "";
$PositionInfo["Album"] = "";
$PositionInfo["Picture"] = "";
$PositionInfo["RelTime"] = "";
$PositionInfo["TrackDuration"] = "";
$PositionInfo["RelTimeSec"] = "";
$PositionInfo["TrackDurationSec"] = "";
$PositionInfo["TrackURI"] = "";
$PositionInfo["TrackMetaData"] = "";
$PositionInfo["TEST"] = "/";
//Rückgabe
$PositionInfo["RelTime"] = substr($streamAnswer, strpos($streamAnswer, "")+9, 7);
if ($PositionInfo["RelTime"][1] != ":"){
$PositionInfo["RelTime"] = "";
}
$TrackMetaData_start = strpos($streamAnswer, "")+15;
$TrackMetaData_end = strpos($streamAnswer, "");
if(($TrackMetaData_start != 0) && ($TrackMetaData_end != 0)){
$PositionInfo["TrackMetaData"] = (substr($streamAnswer, $TrackMetaData_start, ($TrackMetaData_end - $TrackMetaData_start)));
}
$TrackURI_start = strpos($streamAnswer, "")+10;
$TrackURI_end = strpos($streamAnswer, "");
if(($TrackURI_start != 0) && ($TrackURI_end != 0)){
$PositionInfo["TrackURI"] = substr($streamAnswer, $TrackURI_start, ($TrackURI_end - $TrackURI_start));
}
$PositionInfo["TrackDuration"] = substr($streamAnswer, strpos($streamAnswer, "")+15, 7);
if ($PositionInfo["TrackDuration"][1] != ":"){
$PositionInfo["TrackDuration"] = "";
}
$PositionInfo["RelTimeSec"] = StringToTime($PositionInfo["RelTime"]);
$PositionInfo["TrackDurationSec"] = StringToTime($PositionInfo["TrackDuration"]);
$Artist_start = strpos($streamAnswer, "<dc:creator>")+18;
$Artist_end = strpos($streamAnswer, "</dc:creator>");
if(($Artist_start != 0) && ($Artist_end != 0)){
$PositionInfo["Artist"] = htmlspecialchars_decode(substr($streamAnswer, $Artist_start, ($Artist_end - $Artist_start)));
}
$Title_start = strpos($streamAnswer, "<dc:title>")+16;
$Title_end = strpos($streamAnswer, "</dc:title>");
if(($Title_start != 0) && ($Title_end != 0)){
$PositionInfo["Title"] = htmlspecialchars_decode(substr($streamAnswer, $Title_start, ($Title_end - $Title_start)));
}
$Album_start = strpos($streamAnswer, "<upnp:album>")+18;
$Album_end = strpos($streamAnswer, "</upnp:album>");
if(($Album_start != 0) && ($Album_end != 0)){
$PositionInfo["Album"] = htmlspecialchars_decode(substr($streamAnswer, $Album_start, ($Album_end - $Album_start)));
}
$Picture_start = strpos($streamAnswer, "<upnp:albumArtURI>")+24;
$Picture_end = strpos($streamAnswer, "</upnp:albumArtURI>");
if(($Picture_start != 0) && ($Picture_end != 0)){
$PositionInfo["Picture"] = substr($streamAnswer, $Picture_start, ($Picture_end - $Picture_start));
}
if ($action == "Info") {
print_r(json_encode($PositionInfo));
} else {
echo($headerPart1.$headerMainPart.$headerPart2.htmlspecialchars($contentEnvelopeBegin.$content.$contentEnvelopeEnd));
echo("
");
echo("
");
echo htmlspecialchars($streamAnswer);
}
} else {
die("no command set.");
}
?>