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é