UPNP: content directory eines Media-Servers per SOAP-Request auslesen

Hallo Gemeinde,

bei der Weiterentwicklung meines Ansatzes UPNP unter IPS lauffähig zu bekommen (siehe auch die UPNP-functions in einem vorherigen POST) hänge ich derzeit beim Auslesen der content directory meines Media-Servers (Twonky) per SOAP.
Ziel ist, dass ich durch den bereitgestellten Inhalt browsen und dabei den Inhalt der container (genauer Pfad, AlbumArtURI, Length, etc.) an die Devices weitergeben möchte.

Ein getElementsByTagName(‚container‘) brachte nichts.

Vielleicht kann mir jemand von den Sonos-Leuten weiterhelfen ? Ihr seid da ja schon weit vorraus (mein ausdrücklicher Respekt !!!).

Nun zu den Details: Im Ansatz tätige ich folgenden Aufruf:

<?

//------------------------------------------------------------------------------
//UPNP_ContentDirectory_Browse.ips.php------------------------------------------
//------------------------------------------------------------------------------
//IN:   $ObjectID
//IN:   $BrowseFlag
//IN:   $Filter
//IN:   $StartingIndex
//IN:   $RequestedCount
//IN:   $SortCriteria
//------------------------------------------------------------------------------

//IPAdresse und Port des Servers------------------------------------------------

$address = "127.0.0.1";
$port = "9000";


//max_execution_time auf 10 Minuten erhöhen-------------------------------------

ini_set('max_execution_time', 600);


//Suchvariablen-----------------------------------------------------------------

$ObjectID = "0"; //GetValue();
$BrowseFlag = "BrowseDirectChildren"; //GetValue();
$Filter = "*"; //GetValue();
$StartingIndex = "0"; //GetValue();
$RequestedCount = "100"; //GetValue();
$SortCriteria = "+dc:title"; //GetValue();

//ContentDirectory_Search-------------------------------------------------------

$header='POST /TMSContentDirectory/Control HTTP/1.1
HOST: '.$address.':'.$port.'
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
CONTENT-TYPE: text/xml; charset="utf-8"
connection: close';

$xml='<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <u:Browse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
         <ObjectID>'.$ObjectID.'</ObjectID>
         <BrowseFlag>'.$BrowseFlag.'</BrowseFlag>
         <Filter>'.$Filter.'</Filter>
         <StartingIndex>'.$StartingIndex.'</StartingIndex>
         <RequestedCount>'.$RequestedCount.'</RequestedCount>
         <SortCriteria>'.$SortCriteria.'</SortCriteria>
      </u:Browse>
   </s:Body>
</s:Envelope>';

$content_ContentDirectory_Browse = $header . '
Content-Length: '. strlen($xml) .'

'. $xml;


//content_ContentDirectory_Browse Senden----------------------------------------

$fp = fsockopen ($address, $port, $errno, $errstr, 10);

fputs ($fp, $content_ContentDirectory_Browse);

		$buffer = stream_get_contents($fp, -1);

		echo $buffer;

		$vars = explode("

", $buffer); 			//Header abtrennen
		$header = $vars[0];                    			//Header
		$message = $vars[1];                   			//Message
		
//$message = trim($xml);
		
		$browse = new SimpleXMLElement($message);

		$handle = fopen('ContentDirectory_Browse.xml', "w"); 	//XML schreiben
		$xml=$browse->asXML();
		fwrite($handle, $xml);
		fclose($handle);
		

fclose($fp);


 $dom = new DomDocument;
 $dom->loadXML($xml);
 $node = $dom->getElementsByTagName('Result');
											echo "
";
foreach ($node as $Result) {
    echo $Result->nodeValue, PHP_EOL;
    echo "
";
}
											echo "
";


?>

und bekomme dann auch den Post zurück, den ich dann aber weiter verarbeiten möchte

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: 1873
Date: Wed, 01 May 2013 20:24:11 GMT
Accept-Ranges: bytes
Connection: close
EXT:
Server: Windows NT/5.0, UPnP/1.0, pvConnect UPnP SDK/1.0,  Twonky UPnP SDK/1.1

<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/" xmlns:arib="urn:schemas-arib-or-jp:elements-1-0/" xmlns:dtcp="urn:schemas-dtcp-com:metadata-1-0/" xmlns:pv="http://www.pv.com/pvns/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><container id="0$2" parentID="0" restricted="1" childCount="2" searchable="1"><dc:title>Bilder</dc:title><pv:childCountContainer>2</pv:childCountContainer><pv:modificationTime>70918272</pv:modificationTime><pv:lastUpdated>70918272</pv:lastUpdated><upnp:class>object.container</upnp:class></container><container id="0$1" parentID="0" restricted="1" childCount="2" searchable="1"><dc:title>Musik</dc:title><pv:childCountContainer>2</pv:childCountContainer><pv:modificationTime>70918272</pv:modificationTime><pv:lastUpdated>70918272</pv:lastUpdated><upnp:class>object.container</upnp:class></container><container id="0$3" parentID="0" restricted="1" childCount="2" searchable="1"><dc:title>Videos</dc:title><pv:childCountContainer>2</pv:childCountContainer><pv:modificationTime>70918272</pv:modificationTime><pv:lastUpdated>70918272</pv:lastUpdated><upnp:class>object.container</upnp:class></container></DIDL-Lite>333

Bilder27091827270918272object.containerMusik27091827270918272object.containerVideos27091827270918272object.container

Der in die Datei zur Kontrolle geschriebene XML-Teil sieht richtig aus:

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:BrowseResponse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1"><Result><DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/" xmlns:arib="urn:schemas-arib-or-jp:elements-1-0/" xmlns:dtcp="urn:schemas-dtcp-com:metadata-1-0/" xmlns:pv="http://www.pv.com/pvns/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"><container id="0$2" parentID="0" restricted="1" childCount="2" searchable="1"><dc:title>Bilder</dc:title><pv:childCountContainer>2</pv:childCountContainer><pv:modificationTime>70918272</pv:modificationTime><pv:lastUpdated>70918272</pv:lastUpdated><upnp:class>object.container</upnp:class></container><container id="0$1" parentID="0" restricted="1" childCount="2" searchable="1"><dc:title>Musik</dc:title><pv:childCountContainer>2</pv:childCountContainer><pv:modificationTime>70918272</pv:modificationTime><pv:lastUpdated>70918272</pv:lastUpdated><upnp:class>object.container</upnp:class></container><container id="0$3" parentID="0" restricted="1" childCount="2" searchable="1"><dc:title>Videos</dc:title><pv:childCountContainer>2</pv:childCountContainer><pv:modificationTime>70918272</pv:modificationTime><pv:lastUpdated>70918272</pv:lastUpdated><upnp:class>object.container</upnp:class></container></DIDL-Lite></Result><NumberReturned>3</NumberReturned><TotalMatches>3</TotalMatches><UpdateID>3</UpdateID></u:BrowseResponse></s:Body></s:Envelope>

Wie kann ich nun die container Bilder, Musik, Videos in Variablen umsetzen, bzw. auch weiter in die Tiefe browsen ?

Für ein paar Denkanstösse wäre ich dankbar. Oder hat da jemand schon etwas Fertiges ?

Viele Grüsse

André

PS: ich fände es nach wie vor schön auf meinem Server einen zentralen UPNP Control Point laufen zu haben, den ich per Webfront von verschiedenen Tablets aus ansteuern kann. Das erspart mir auf jedem Gerät einen separaten Control Point laufen zu haben, die sich dann untereinander ins Gehege kommen.

Hallo Gemeinde,

ich habe jetzt in einem script functions und in dem Steuer-script das setzen der Variablen etc. as funktioniert nun auch. Ich hänge jedoch bei der Umsetzung einer Logik vorwärts und rückwärts zu browsen bzw. ein Musikfile (item) zu selektieren. Kann mir eventuell jemand Erfahrenerer helfen ?

Das funktioniert so: mit dem Browse-Befehl kann ich mir die ID´s der Unterordner auslesen bzw. erkenne zwischen container (weitere Unterordner) oder item (Musikfile).

$Result ist die Antwort auf meine Anfrage
$liste ist das Array mit den Titeln bzw. containern

Essentiell dabei ist die ausgegebene ID --> damit browse ich vorwärts und die ParentID --> damit komme ich dann rückwärts. Bei einem item ist das Array wie unten, bei containern fehlen die entsprechende Einträge bis auf Titel. Die ID im Array (zu selektieren mit $scroll) lässt mich die einzelnen Unterpunkte aufrufen.

Die functions:

<?

//------------------------------------------------------------------------------
//Browse024 - function----------------------------------------------------------
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//function ContentDirectory_Browse----------------------------------------------
//------------------------------------------------------------------------------
//IN:   $ObjectID
//IN:   $BrowseFlag
//IN:   $Filter
//IN:   $StartingIndex
//IN:   $RequestedCount
//IN:   $SortCriteria
//------------------------------------------------------------------------------
//OUT:  $Result
//OUT:  $NumberReturned
//OUT:  $TotalMatches
//OUT:  $TotalMatches
//------------------------------------------------------------------------------

function ContentDirectory_Browse ($addressServ, $portServ, $ObjectID, $BrowseFlag, $Filter, $StartingIndex, $RequestedCount, $SortCriteria)
{
$header='POST /TMSContentDirectory/Control HTTP/1.1
HOST: '.$addressServ.':'.$portServ.'
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
CONTENT-TYPE: text/xml; charset="utf-8"
connection: close';

$xml='<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <u:Browse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
         <ObjectID>'.$ObjectID.'</ObjectID>
         <BrowseFlag>'.$BrowseFlag.'</BrowseFlag>
         <Filter>'.$Filter.'</Filter>
         <StartingIndex>'.$StartingIndex.'</StartingIndex>
         <RequestedCount>'.$RequestedCount.'</RequestedCount>
         <SortCriteria>'.$SortCriteria.'</SortCriteria>
      </u:Browse>
   </s:Body>
</s:Envelope>';

$content_ContentDirectory_Browse = $header . '
Content-Length: '. strlen($xml) .'

'. $xml;

$fp = fsockopen ($addressServ, $portServ, $errno, $errstr, 10);

fputs ($fp, $content_ContentDirectory_Browse);

		$buffer = stream_get_contents($fp, -1);

		echo $buffer;

		$vars = explode("

", $buffer); 						//Header abtrennen
		$header = $vars[0];                    					//Header
		$message = $vars[1];                   					//Message

		$handle = fopen('ContentDirectory_Browse.xml', "w"); 	//XML schreiben
		fwrite($handle, $message);
		fclose($handle);

fclose($fp);

//XML cutten und Variablen schreiben--------------------------------------------

		$vars1 = explode("<Result>", $message);
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</Result>", $cutted2);
      $cutted3 = $vars2[1];
		$Result = $vars2[0];

		echo $Result;

	SetValue(42199 /*[Audio\Browse\Return\Result]*/, $Result);

		$vars1 = explode("<NumberReturned>", $message);
      $cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</NumberReturned>", $cutted2);
		$cutted3 = $vars2[1];
		$NumberReturned = $vars2[0];

		echo $NumberReturned;

	SetValue(26946 /*[Audio\Browse\Return\NumberReturned]*/, $NumberReturned);

		$vars1 = explode("<TotalMatches>", $message);
		$cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</TotalMatches>", $cutted2);
		$cutted3 = $vars2[1];
		$TotalMatches = $vars2[0];

		echo $TotalMatches;

	SetValue(52875 /*[Audio\Browse\Return\TotalMatches]*/, $TotalMatches);

		$vars1 = explode("<UpdateID>", $message);
      $cutted1 = $vars1[0];
		$cutted2 = $vars1[1];
		$vars2 = explode("</UpdateID>", $cutted2);
      $cutted3 = $vars2[1];
		$UpdateID = $vars2[0];

		echo $UpdateID;

	SetValue(53319 /*[Audio\Browse\Return\UpdateID]*/, $UpdateID);

Return ($Result);
}

//------------------------------------------------------------------------------
//function BrowseList($Result) --> $Results in Arrays ausgeben------------------
//------------------------------------------------------------------------------
//Sortierung:-------------------------------------------------------------------
//------------------------------------------------------------------------------
//01: container/item
//02: id
//03: refID
//04: parentid
//05: restricted
//06: artist
//07: album
//08: title
//09: resource
//10: duration
//11: size
//12: bitrate
//13: albumArtURI
//14: genre
//15: date
//16: originalTrackNumber
//17: class
//18: extension
//------------------------------------------------------------------------------

function BrowseList($Result)
{
$xmlParser = xml_parser_create();
$Result = substr($Result, stripos($Result, '<'));
$Result = substr($Result, 0, strrpos($Result, '>') + 4);
$Result = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $Result);

$xml = new SimpleXMLElement($Result);
$liste = array();

for($i=0,$size=count($xml);$i<$size;$i++)
	{
	if(isset($xml->container[$i])){
		//Wenn Container vorhanden, dann ist es ein Browse Element
		//Wenn Item vorhanden, dann ist es ein Song
		$aktrow = $xml->container[$i];
   		$attr = $xml->container[$i]->attributes();
      		$liste[$i]['typ'] = "container";

	}else if(isset($xml->item[$i])){
		//Item vorhanden also nur noch Musik
      		$aktrow = $xml->item[$i];
      		$attr = $xml->item[$i]->attributes();
      		$liste[$i]['typ'] = "item";

	}else{
		//Fehler aufgetreten
   	return;
	}

$id = $attr['id'];
$refid = $attr['refID'];
$parentid = $attr['parentID'];
$restricted = $attr['restricted'];
$albumart = $aktrow->xpath("upnp:albumArtURI");
$titel = $aktrow->xpath("dc:title");
$interpret = $aktrow->xpath("dc:creator");
$date = $aktrow->xpath("dc:date");
$album = $aktrow->xpath("upnp:album");
$genre = $aktrow->xpath("upnp:genre");
$originalTrackNumber = $aktrow->xpath("upnp:originalTrackNumber");
$class = $aktrow->xpath("upnp:class");
$extension = $aktrow->xpath("pv:extension");

	if(isset($id) && !empty($id)){
			$liste[$i]['id']=(string)$id;
		}else{
			$liste[$i]['id']="";
		}
	if(isset($refid) && !empty($refid)){
			$liste[$i]['refid']=(string)$refid;
		}else{
			$liste[$i]['refid']="";
		}
	if(isset($parentid) && !empty($parentid)){
			$liste[$i]['parentid']=(string)$parentid;
		}else{
			$liste[$i]['parentid']="";
		}
	if(isset($restricted) && !empty($restricted)){
			$liste[$i]['restricted']=(string)$restricted;
		}else{
			$liste[$i]['restricted']="";
		}
	if(isset($interpret[0])){
			$liste[$i]['artist']=(string)$interpret[0];
		}else{
			$liste[$i]['artist']="";
		}
	if(isset($album[0])){
			$liste[$i]['album']=(string)$album[0];
		}else{
			$liste[$i]['album']="";
		}
$liste[$i]['title']=(string)$titel[0]; //immer vorhanden

	if(isset($aktrow->res)){
	   		$res = (string)$aktrow->res;
	   		$liste[$i]['resource'] = $res;
		}else{
	   		$liste[$i]['resource'] = "";
	 	}
	$resattr = $aktrow->res->attributes();
	//wenn name ‘res’ und attribute ‘duration’ vorhanden
	if(isset($aktrow->res) and isset($resattr['duration'])){
			$liste[$i]['duration']=(string)$resattr['duration'];
		}else{
			$liste[$i]['duration']="";
		}
	//wenn name ‘res’ und attribute ‘size’ vorhanden
	if(isset($aktrow->res) and isset($resattr['size'])){
			$liste[$i]['size']=(string)$resattr['size'];
		}else{
			$liste[$i]['size']="";
		}
	//wenn name ‘res’ und attribute ‘bitrate’ vorhanden
	if(isset($aktrow->res) and isset($resattr['bitrate'])){
			$liste[$i]['bitrate']=(string)$resattr['bitrate'];
		}else{
			$liste[$i]['bitrate']="";
		}
	if(isset($albumart[0])){
			$liste[$i]['albumArtURI']=(string)$albumart[0];
		}else{
			$liste[$i]['albumArtURI'] ="";
		}
	if(isset($genre[0])){
			$liste[$i]['genre']=(string)$genre[0];
		}else{
			$liste[$i]['genre']="";
		}
	if(isset($date[0])){
			$liste[$i]['date']=(string)$date[0];
		}else{
			$liste[$i]['date']="";
		}
	if(isset($originalTrackNumber[0])){
			$liste[$i]['originalTrackNumber']=(string) $originalTrackNumber[0];
		}else{
			$liste[$i]['originalTrackNumber']="";
		}
	if(isset($class[0])){
			$liste[$i]['class']=(string)$class[0];
		}else{
			$liste[$i]['class']="";
		}
	if(isset($extension[0])){
			$liste[$i]['extension']=(string)$extension[0];
		}else{
			$liste[$i]['extension']="";
		}
}
return ($liste);
}

?>

Das Steuerscript:

<?

//------------------------------------------------------------------------------
//Browse024-Testteil------------------------------------------------------------
//--------------------------------------------------------------------------------

//functions einbinden-----------------------------------------------------------

include ("UPNP_Functions_V1.8.ips.php");
include ("15256.ips.php"); //Browse024 - function

//IPAdresse und Port des Servers------------------------------------------------

$addressServ = "192.168.178.22"; //Twonky/VAIO
$portServ = "9000";

//IPAdresse und Port des primären Device (Host)---------------------------------

$address = "192.168.178.151";
$port = "8080";

//max_execution_time auf 10 Minuten erhöhen-------------------------------------

ini_set('max_execution_time', 600);

//Suchvariablen-----------------------------------------------------------------

$ObjectID = "0$1$13$77$78$1639$1640"; //GetValue();
//$BrowseFlag = "BrowseMetadata"; //GetValue();
$BrowseFlag = "BrowseDirectChildren"; //GetValue();
$Filter = "*"; //GetValue();
$StartingIndex = "0"; //GetValue();
$RequestedCount = "0"; //GetValue();
$SortCriteria = "0"; //GetValue();
//------------------------------------------------------------------------------

$Result = ContentDirectory_Browse ($addressServ, $portServ, $ObjectID, $BrowseFlag, $Filter, $StartingIndex, $RequestedCount, $SortCriteria);
echo ($Result);
echo "

";

$liste = BrowseList($Result);
echo ($liste);
echo "

";
echo "Liste:";
print_r ($liste);

echo "

";
$size = count ($liste);
echo "

";
echo ($size);
echo "

";

//Files selectieren-------------------------------------------------------------


$scroll = "12"; //Logik zum scrollen einbauen

$TitelList = $scroll;




//Array $liste auslesen und Variablen setzen------------------------------------


$typ = $liste[$TitelList]['typ']; // gibt typ des 1. Array aus
echo $typ;
setvalue(11601 /*[Audio\Browse\DIDL-lite\Container/Item [typ]]*/, (string)$typ);
echo "
";

$id = $liste[$TitelList]['id']; // gibt id des 1. Array aus
echo $id;
setvalue(38469 /*[Audio\Browse\DIDL-lite\ID [id]]*/, (string)$id);
echo "
";

$refid = $liste[$TitelList]['refID'];
echo $refid;
setvalue(43495 /*[Audio\Browse\DIDL-lite\ID [id]]*/, (string)$refid);
echo "
";

$parentid = $liste[$TitelList]['parentid'];
echo $parentid;
setvalue(41353 /*[Audio\Browse\DIDL-lite\ParentID [parentID]]*/, (string)$parentid);
echo "
";

$restricted = $liste[$TitelList]['restricted'];
echo $restricted;
setvalue(27617 /*[Audio\Browse\DIDL-lite\ParentID [parentID]]*/, (string)$restricted);
echo "
";

$artist = $liste[$TitelList]['artist'];
echo $artist;
setvalue(42599 /*[Audio\Browse\DIDL-lite\Artist [dc:creator]]*/, (string)$artist);
echo "
";

$album = $liste[$TitelList]['album'];
echo $album;
setvalue(48998 /*[Audio\Browse\DIDL-lite\Album [upnp:album]]*/, (string)$album);
echo "
";

$title = $liste[$TitelList]['title'];
echo $title;
setvalue(31924 /*[Audio\Browse\DIDL-lite\Titel [dc:title]]*/, (string)$title);
echo "
";

$res = $liste[$TitelList]['resource'];
echo $res;
setvalue(46947 /*[Audio\Browse\DIDL-lite\URI [resource]]*/, (string)$res);
echo "
";

$duration = $liste[$TitelList]['duration'];
echo $duration;
setvalue(56480 /*[Audio\Browse\DIDL-lite\Duration [duration]]*/, (string)$duration);
echo "
";

$size = $liste[$TitelList]['size'];
echo $size;
setvalue(58375 /*[Audio\Browse\DIDL-lite\Size [size]]*/, (string)$size);
echo "
";

$bitrate = $liste[$TitelList]['bitrate'];
echo $bitrate;
setvalue(27089 /*[Audio\Browse\DIDL-lite\Bitrate [bitrate]]*/, (string)$bitrate);
echo "
";

$albumart = $liste[$TitelList]['albumArtURI'];
echo $albumart;
SetValue(27682 /*[Audio\Browse\DIDL-lite\AlbumArtURI [upnp:albumArtURI]]*/, (string)$albumart);

		//AlbumArt abholen und speichern------------------------------------------
		$imageContent = @Sys_GetURLContent($albumart);
		$fileHandle = fopen(IPS_GetKernelDir()."media/AlbumArt.jpg", "w");
		@fwrite($fileHandle, $imageContent);
		fclose($fileHandle);

echo "
";

$genre = $liste[$TitelList]['genre']; // gibt album des 1. Array aus
echo $genre;
setvalue(48901 /*[Audio\Browse\DIDL-lite\Genre [upnp:genre]]*/, (string)$genre);
echo "
";

$date = $liste[$TitelList]['date']; // gibt album des 1. Array aus
echo $date;
setvalue(35740 /*[Audio\Browse\DIDL-lite\Date [dc:date]]*/, (string)$date);
echo "
";

$originalTrackNumber = $liste[$TitelList]['originalTrackNumber']; // gibt album des 1. Array aus
echo $originalTrackNumber;
setvalue(32295 /*[Audio\Browse\DIDL-lite\TrackNumber [upnp:originalTrackNumber]]*/, (string)$originalTrackNumber);
echo "
";

$class = $liste[$TitelList]['class']; // gibt album des 1. Array aus
echo $class;
setvalue(52846 /*[Audio\Browse\DIDL-lite\Class [upnp:class]]*/, (string)$class);
echo "
";

$extension = $liste[$TitelList]['extension']; // gibt album des 1. Array aus
echo $extension;
setvalue(12802 /*[Audio\Browse\DIDL-lite\Extension [pv:extension]]*/, (string)$extension);
echo "
";



//Play--------------------------------------------------------------------------

//include ("UPNP_Functions_V1.8.ips.php");
$file = GetValue(46947 /*[Audio\Browse\DIDL-lite\URI [resource]]*/);
$MetaData = GetValue(27682 /*[Audio\Browse\DIDL-lite\AlbumArtURI [upnp:albumArtURI]]*/);
SetAVTransportURI($address, $port, $file, $MetaData);
Play_AV($address, $port);

?>

Ein Array für items hat folgende Struktur:

Array
(
[0] => Array
(
[typ] => item
[id] => 0$1$13$77$78$1639$1640R69645
[refid] => 0$1$8I69645
[parentid] => 0$1$13$77$78$1639$1640
[restricted] => 1
[artist] => Chris Rea
[album] => The Best Of
[title] => Auberge
[resource] => http://192.168.178.22:9000/disk/DLNA-PNMP3-OP01-FLAGS01700000/O0$1$8I69645.mp3
[duration] => 0:04:46
[size] => 9165839
[bitrate] => 256
[albumArtURI] => http://192.168.178.22:9000/disk/DLNA-PNJPEG_TN-OP01-CI1-FLAGS00f00000/defaultalbumart/a_u_d_i_o.jpg/O0$1$8I69645.jpg?scale=160x160
[genre] => Pop
[date] => 1994-01-01
[originalTrackNumber] => 5
[class] => object.item.audioItem.musicTrack
[extension] => mp3
)
etc.

in container-Array sieht so aus:

Array
(
[0] => Array
(
[typ] => container
[id] => 0$1$13$77$78$108
[refid] =>
[parentid] => 0$1$13$77$78
[restricted] => 1
[artist] =>
[album] =>
[title] => Annie Lennox
[resource] =>
[duration] =>
[size] =>
[bitrate] =>
[albumArtURI] =>
[genre] =>
[date] =>
[originalTrackNumber] =>
[class] => object.container.storageFolder
[extension] =>
)
etc.

Die vielen Echo´s sind nur zur Gegenkontrolle bei der Entwicklung.

Wenn ich die Werte per Hand kopiere bzw. unter $scroll den gewünschten Titel (z.B. 1) eingebe funktioniert das auch ganz gut.

Wie setze ich das aber in eine Logik für die Schaltflächen und später besser noch HTML (-> dann als iframe einzubinden) um ?

Für Hilfe hierbei wäre dankbar

Viele Grüsse

André