Hallo Gemeinde,
immerhin 28.000 Klicks zeigen mir Euer Interesse an dem Thema. Vielleicht kann ja jemand helfen. 
Ich habe das Problem soweit eingekreist, weshalb manche Server (wie Windows Media Player) nur begrenzt ausgelesen werden und das Ganze bei bestimmten Konfigurationen (z.B. mit WMP) dann nicht funktionieren kann.
Bei den von mir verwendeten UPNP-Servern (Assett-UPNP, Twonky, Plex) funktioniert es jedoch vollständig.
Das Problem ist das Auslesen der Browse-Response, welche als XML zurückkommt. Hier ein Beispiel der Rückgabe von Assett-UPNP (Header schon abgetrennt):
<?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:BrowseResponse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
<Result><DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/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/"><item id="d8589-co11" parentID="co11" restricted="0"><dc:title>Get Back (ASAP)</dc:title><dc:creator>Alexandra Stan</dc:creator><dc:date>2011-01-01</dc:date><upnp:artist role="AlbumArtist">Alexandra Stan</upnp:artist><upnp:artist role="Performer">Alexandra Stan</upnp:artist><upnp:album>Saxobeats</upnp:album><upnp:genre>Pop</upnp:genre><upnp:albumArtURI dlna:profileID="JPEG_TN">http://192.168.178.64:26125/aa/67622/2495615489/cover.jpg?size=0</upnp:albumArtURI><upnp:originalTrackNumber>5</upnp:originalTrackNumber><res duration="0:03:23.000" size="3324093" bitrate="16364" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.mp3</res><res duration="0:03:23.000" size="35831644" bitrate="176400" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/wav:DLNA.ORG_PN=WAV;DLNA.ORG_OP=01">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.forced.wav</res><res duration="0:03:23.000" size="35831600" bitrate="176400" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/L16:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_CI=1">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.forced.l16</res><res duration="0:03:23.000" size="3324093" bitrate="16364" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.mp3</res><upnp:class>object.item.audioItem.musicTrack</upnp:class></item></DIDL-Lite></Result>
<NumberReturned>1</NumberReturned>
<TotalMatches>1</TotalMatches>
<UpdateID>2296</UpdateID>
</u:BrowseResponse>
</s:Body>
</s:Envelope>
Die selbe Datei als Response von WMP:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<m:BrowseResponse xmlns:m="urn:schemas-upnp-org:service:ContentDirectory:1">
<Result xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string"><DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/"
xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"
xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/"
xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/"
><item id="6_eff1f3a5_7c0784c9-569" refID="4-569" restricted="1" parentID="6_eff1f3a5_7c0784c9"><dc:title>Mr. Saxobeat</dc:title><dc:creator>Alexandra Stan</dc:creator><res size="3122982" duration="0:03:11.608" bitrate="16000" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01700000000000000000000000000000" sampleFrequency="44100" bitsPerSample="16" nrAudioChannels="2" microsoft:codec="{00000055-0000-0010-8000-00AA00389B71}">http://127.0.0.1:10243/WMPNSSv4/3561040673/1_Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.mp3</res><res duration="0:03:11.608" bitrate="176400" protocolInfo="http-get:*:audio/L16;rate=44100;channels=2:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000" sampleFrequency="44100" bitsPerSample="16" nrAudioChannels="2" microsoft:codec="{00000001-0000-0010-8000-00AA00389B71}">http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.mp3?formatID=39</res><res duration="0:03:11.608" bitrate="88200" protocolInfo="http-get:*:audio/L16;rate=44100;channels=1:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000" sampleFrequency="44100" bitsPerSample="16" nrAudioChannels="1" microsoft:codec="{00000001-0000-0010-8000-00AA00389B71}">http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.mp3?formatID=37</res><res duration="0:03:11.608" bitrate="24000" protocolInfo="http-get:*:audio/mp4:DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000" sampleFrequency="48000" nrAudioChannels="2" microsoft:codec="{00001610-0000-0010-8000-00AA00389B71}">http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.m4a?formatID=25</res><res duration="0:03:11.608" bitrate="32000" protocolInfo="http-get:*:audio/vnd.dolby.dd-raw:DLNA.ORG_PN=AC3;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000" sampleFrequency="48000" nrAudioChannels="2" microsoft:codec="{E06D802C-DB46-11CF-B4D1-00805F6CBBEA}">http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.mp3?formatID=28</res><res duration="0:03:11.608" bitrate="24000" protocolInfo="http-get:*:audio/vnd.dlna.adts:DLNA.ORG_PN=AAC_ADTS_320;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000" sampleFrequency="48000" nrAudioChannels="2" microsoft:codec="{00001610-0000-0010-8000-00AA00389B71}">http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.adts?formatID=30</res><res duration="0:03:11.608" bitrate="8000" protocolInfo="http-get:*:audio/x-ms-wma:DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=10;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000" sampleFrequency="44100" nrAudioChannels="2" microsoft:codec="{00000161-0000-0010-8000-00AA00389B71}">http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.wma?formatID=118</res><upnp:class>object.item.audioItem.musicTrack</upnp:class><upnp:genre>Dance</upnp:genre><dc:publisher>RMNradio</dc:publisher><upnp:artist role="AlbumArtist">Alexandra Stan</upnp:artist><upnp:artist role="Performer">Alexandra Stan</upnp:artist><upnp:author role="Composer">[Unbekannter Komponist]</upnp:author><upnp:album>Saxobeats</upnp:album><upnp:originalTrackNumber>0</upnp:originalTrackNumber><dc:date>2011-01-02</dc:date><upnp:actor role="Alexandra Stan">Alexandra Stan</upnp:actor><dc:description>www.radio-fx.de</dc:description><upnp:albumArtURI dlna:profileID="JPEG_SM">http://127.0.0.1:10243/WMPNSSv4/3561040673/0_Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.jpg?albumArt=true</upnp:albumArtURI><upnp:albumArtURI dlna:profileID="JPEG_TN">http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.jpg?albumArt=true,formatID=32,width=160,height=160</upnp:albumArtURI><desc id="artist" nameSpace="urn:schemas-microsoft-com:WMPNSS-1-0/" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/"><microsoft:artistAlbumArtist>Alexandra Stan</microsoft:artistAlbumArtist><microsoft:artistPerformer>Alexandra Stan</microsoft:artistPerformer></desc><desc id="author" nameSpace="urn:schemas-microsoft-com:WMPNSS-1-0/" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/"><microsoft:authorComposer>[Unbekannter Komponist]</microsoft:authorComposer></desc><desc id="Year" nameSpace="urn:schemas-microsoft-com:WMPNSS-1-0/" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/"><microsoft:year>2011</microsoft:year></desc><desc id="folderPath" nameSpace="urn:schemas-microsoft-com:WMPNSS-1-0/" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/"><microsoft:folderPath>Freigegebene Musik\MP3´s - 05 fertig</microsoft:folderPath></desc><desc id="fileInfo" nameSpace="urn:schemas-microsoft-com:WMPNSS-1-0/" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/"><microsoft:fileIdentifier>AMGa_id=R 2287667;AMGp_id=P 2354320;AMGt_id=T 24415507</microsoft:fileIdentifier></desc></item>
</DIDL-Lite></Result>
<NumberReturned xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui4">1</NumberReturned>
<TotalMatches xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui4">1</TotalMatches>
<UpdateID xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui4">9</UpdateID>
</m:BrowseResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Ihr seht sicher sofort den Unterschied - Namespaces :mad:
Deshalb auch die etwas mühseligen Zwischenschritte beim Explode-Weg: Das Abtrennen von Result (die eigentliche DIDL-Lite, welche alle Titelinformationen, Quelle, Albumart, etc. enthält), NumberReturned, TotalMatches, UpdateID erfolgt über einen Explode-Weg, welcher mir die die gesamte Nachricht und auch die einzelnen Informationen in ein Array (array($message, $Result, $NumberReturned, $TotalMatches, $UpdateID) ) übergibt:
//XML cutten----------------------------------------------------------------------
$vars1 = explode("<Result", $message);
$cutted1 = $vars1[0];
$cutted2 = $vars1[1];
if (substr($cutted2, 0) == ">")
{
$cutted4 = substr($cutted2, 1);
}
else
{
$vars2 = explode(">", $cutted2);
$cutted3 = $vars2[0];
$cutted4 = $vars2[1];
}
$vars3 = explode("</", $cutted4);
$Result = $vars3[0];
$cutted5 = $vars3[1];
echo ("
cutted1:"); echo ($cutted1); echo ("
cutted2:"); echo ($cutted2); echo ("
cutted3:"); echo ($cutted3); echo ("
cutted4:"); echo ($cutted4); echo ("
Result:"); echo ($Result); echo ("
cutted5:"); echo ($cutted5);
//NumberReturned ermitteln---------------------------------------------------
$vars1 = explode("<NumberReturned", $message);
$cutted1 = $vars1[0];
$cutted2 = $vars1[1];
if (substr($cutted2, 0) == ">")
{
$cutted4=substr($cutted2, 1);
}
else
{
$vars2 = explode(">", $cutted2);
$cutted3 = $vars2[0];
$cutted4 = $vars2[1];
}
$vars2 = explode(">", $cutted2);
$cutted3 = $vars2[0];
$cutted4 = $vars2[1];
$vars3 = explode("</", $cutted4);
$NumberReturned = $vars3[0];
$cutted5 = $vars3[1];
//echo ("
cutted1:"); echo ($cutted1); echo ("
cutted2:"); echo ($cutted2); echo ("
cutted3:"); echo ($cutted3); echo ("
cutted4:"); echo ($cutted4); echo ("
NumberReturned:"); echo ($NumberReturned); echo ("
cutted5:"); echo ($cutted5);
$vars1 = explode("<TotalMatches", $message);
$cutted1 = $vars1[0];
$cutted2 = $vars1[1];
if (substr($cutted2, 0) == ">")
{
$cutted4=substr($cutted2, 1);
}
else
{
$vars2 = explode(">", $cutted2);
$cutted3 = $vars2[0];
$cutted4 = $vars2[1];
}
$vars2 = explode(">", $cutted2);
$cutted3 = $vars2[0];
$cutted4 = $vars2[1];
$vars3 = explode("</", $cutted4);
$TotalMatches = $vars3[0];
$cutted5 = $vars3[1];
//echo ("
cutted1:"); echo ($cutted1); echo ("
cutted2:"); cho ($cutted2); echo ("
cutted3:"); echo ($cutted3); echo ("
cutted4:"); echo ($cutted4); echo ("
TotalMatches:"); echo ($TotalMatches); echo ("
cutted5:"); echo ($cutted5);
$vars1 = explode("<UpdateID", $message);
$cutted1 = $vars1[0];
$cutted2 = $vars1[1];
if (substr($cutted2, 0) == ">")
{
$cutted4=substr($cutted2, 1);
}
else
{
$vars2 = explode(">", $cutted2);
$cutted3 = $vars2[0];
$cutted4 = $vars2[1];
}
$vars2 = explode(">", $cutted2);
$cutted3 = $vars2[0];
$cutted4 = $vars2[1];
$vars3 = explode("</", $cutted4);
$UpdateID = $vars3[0];
$cutted5 = $vars3[1];
//echo ("
cutted1:"); echo ($cutted1); echo ("
cutted2:"); echo ($cutted2); echo ("
cutted3:"); echo ($cutted3); echo ("
cutted4:"); echo ($cutted4); echo ("
UpdateID:"); echo ($UpdateID); echo ("
cutted5:"); echo ($cutted5);
return array($message, $Result, $NumberReturned, $TotalMatches, $UpdateID);
}
Das funktioniert zumindest recht sicher und relativ einfach :rolleyes:
Das Problem steckt im weiteren Auslesen des Result-Teiles. Hier stecken wie gesagt die Informationen zum Titel drin, die Quelle und auch das Albumart etc… Manche Player (z.B. mein LG-TV) bestehen auch explizit auf das mitsenden dieser DIDL (in den Scripts als $metadata), wohingegen andere (alle Sony Devices) genügsam nur die Quelle ($resource) benötigen.
Tricky ist, das es kein Standard-XML ist, also erst konvertiert werden muss. Dummerweise verwenden die Streaming-Server auch unterschiediche Formate und vor allem unterschiedliche Namespaces. Die Sache mit den Namespaces habe ich auch nie wirklich verstanden. 
Im Detail komme ich genau da nicht weiter um es universeller zu machen, obwohl ich denke, das man das über die Namespaces (Theorie: automatisch registrieren und weiterverwenden) lösen kann. Dort könnte ich Eure Hilfe benötigen.
Die DIDL-Lite hat dabei folgendes Format:
<DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/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/"><item id="d8589-co11" parentID="co11" upnp:restricted="0"><dc:title>Get Back (ASAP)</dc:title><dc:creator>Alexandra Stan</dc:creator><dc:date>2011-01-01</dc:date><upnp:artist role="AlbumArtist">Alexandra Stan</upnp:artist><upnp:artist role="Performer">Alexandra Stan</upnp:artist><upnp:album>Saxobeats</upnp:album><upnp:genre>Pop</upnp:genre><upnp:albumArtURI dlna:profileID="JPEG_TN">http://192.168.178.64:26125/aa/67622/2495615489/cover.jpg?size=0</upnp:albumArtURI><upnp:originalTrackNumber>5</upnp:originalTrackNumber><upnp:res duration="0:03:23.000" size="3324093" bitrate="16364" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.mp3</upnp:res><upnp:res duration="0:03:23.000" size="35831644" bitrate="176400" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/wav:DLNA.ORG_PN=WAV;DLNA.ORG_OP=01">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.forced.wav</upnp:res><upnp:res duration="0:03:23.000" size="35831600" bitrate="176400" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/L16:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_CI=1">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.forced.l16</upnp:res><upnp:res duration="0:03:23.000" size="3324093" bitrate="16364" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.mp3</upnp:res><upnp:class>object.item.audioItem.musicTrack</upnp:class></item></DIDL-Lite>
Diese lese ich bis jetzt so aus:
function BrowseList($Result)
{
print_r ($Result);
$xmlParser = xml_parser_create();
$Result = substr($Result, stripos($Result, '<'));
$Result = substr($Result, 0, strrpos($Result, '>') + 4);
$Result = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25", "res"), array("<", ">", "\"", "&", ":", "/", "%", "upnp:res"), $Result);
$xml = simplexml_load_string($Result);
print_r ($xml);
$liste = array();
for($i=0,$size=count($xml);$i<$size;$i++)
//Ereignisbaum Verzeichnis(container)/Musik(item)----------------------------
//Wenn Container vorhanden, dann ist es ein Browse Element-------------------
//Wenn Item vorhanden, dann ist es ein Song----------------------------------
{
if(isset($xml->container[$i]))
{
//Container vorhanden also Verzeichnis------------------------------------
$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";
//MetaData für jeden Titel zusammenstellen--------------------------------
$metadata_header = '<DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/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/">';
$raw_metadata_string = $xml->item[$i]->asxml();
$metadata_string = str_replace(array("<", ">"), array("<", ">"), $raw_metadata_string);
$metadata_close = '</DIDL-Lite>';
$metadata = ("$metadata_header"."$metadata_string"."$metadata_close");
$liste[$i]['metadata'] = $metadata;
}
else
{
//Fehler aufgetreten
return;
}
//Inhalte auswerten-------------------------------------------------------------
if(isset($attr['id']) && !empty($attr['id']))
{
$id = $attr['id'];
$liste[$i]['id']=(string)$id;
}
else
{
$liste[$i]['id']="leer";
}
if(isset($attr['refID']) && !empty($attr['refID']))
{
$refID = $attr['refID'];
$liste[$i]['refid']=(string)$refID;
}
else
{
$liste[$i]['refid']="leer";
}
if(isset($attr['parentID']) && !empty($attr['parentID']))
{
$parentID = $attr['parentID'];
$liste[$i]['parentid']=(string)$parentID;
}
else
{
$liste[$i]['parentid']="leer";
}
if(isset($attr['restricted']) && !empty($attr['restricted']))
{
$restricted = $attr['restricted'];
$liste[$i]['restricted']=(string)$restricted;
}
else
{
$liste[$i]['restricted']="leer";
}
if($aktrow->xpath("dc:creator"))
{
$interpret = $aktrow->xpath("dc:creator");
$liste[$i]['artist']=utf8_decode((string)$interpret[0]);
}
else
{
$liste[$i]['artist']="leer";
}
if($aktrow->xpath("upnp:album"))
{
$album = $aktrow->xpath("upnp:album");
$liste[$i]['album']=utf8_decode((string)$album[0]);
}
else
{
$liste[$i]['album']="leer";
}
if($aktrow->xpath("dc:title"))//eigentlich immer vorhanden
{
$titel = $aktrow->xpath("dc:title");
$liste[$i]['title']=utf8_decode((string)$titel[0]);
}
else
{
$liste[$i]['title']="leer";
}
if($aktrow->xpath("upnp:res") && is_array($aktrow->xpath("upnp:res")))
{
//echo ("Array !");
//print_r($aktrow->xpath("upnp:res"));
$res = $aktrow->xpath("upnp:res");
$liste[$i]['resource'] = (string)$res[0];
$resattr = $res[0];
}
elseif($aktrow->xpath("upnp:res") && is_string($aktrow->xpath("upnp:res")))
{
//echo ("String !");
//print_r($aktrow->xpath("upnp:res"));
$res = $aktrow->xpath("upnp:res");
$liste[$i]['resource'] = (string)$aktrow->xpath("upnp:res");
$resattr = $res;
}
else
{
$liste[$i]['resource'] = "leer";
}
//Attribute auslesen------------------------------------------------------------
if(isset($resattr['duration']))
{
$liste[$i]['duration']=(string)$resattr['duration'];
}
else
{
$liste[$i]['duration']="leer";
}
if(isset($resattr['size']))
{
$liste[$i]['size']=(string)$resattr['size'];
}
else
{
$liste[$i]['size']="leer";
}
if(isset($resattr['bitrate']))
{
$liste[$i]['bitrate']=(string)$resattr['bitrate'];
}
else
{
$liste[$i]['bitrate']="leer";
}
if($aktrow->xpath("upnp:albumArtURI"))
{
$albumart = $aktrow->xpath("upnp:albumArtURI");
$liste[$i]['albumArtURI']=(string)$albumart[0];
}
else
{
$liste[$i]['albumArtURI'] ="leer";
}
if($aktrow->xpath("upnp:genre"))
{
$genre = $aktrow->xpath("upnp:genre");
$liste[$i]['genre']=utf8_decode((string)$genre[0]);
}
else
{
$liste[$i]['genre']="leer";
}
if($aktrow->xpath("dc:date"))
{
$date = $aktrow->xpath("dc:date");
$liste[$i]['date']=(string)$date[0];
}
else
{
$liste[$i]['date']="leer";
}
if($aktrow->xpath("upnp:originalTrackNumber"))
{
$originalTrackNumber = $aktrow->xpath("upnp:originalTrackNumber");
$liste[$i]['originalTrackNumber']=(string) $originalTrackNumber[0];
}
else
{
$liste[$i]['originalTrackNumber']="leer";
}
if($aktrow->xpath("upnp:class"))
{
$class = $aktrow->xpath("upnp:class");
$liste[$i]['class']=(string)$class[0];
}
else
{
$liste[$i]['class']="leer";
}
}
return ($liste);
}
Alle relevanten Inhalte sollen in ein Array mit folgenden Format (wird weiter verwendet als $liste).:
Array
(
[0] => Array
(
[typ] => item
[metadata] => <DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/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/"><item id="d8589-co11" parentID="co11" upnp:restricted="0"><dc:title>Get Back (ASAP)</dc:title><dc:creator>Alexandra Stan</dc:creator><dc:date>2011-01-01</dc:date><upnp:artist role="AlbumArtist">Alexandra Stan</upnp:artist><upnp:artist role="Performer">Alexandra Stan</upnp:artist><upnp:album>Saxobeats</upnp:album><upnp:genre>Pop</upnp:genre><upnp:albumArtURI dlna:profileID="JPEG_TN">http://192.168.178.64:26125/aa/67622/2495615489/cover.jpg?size=0</upnp:albumArtURI><upnp:originalTrackNumber>5</upnp:originalTrackNumber><upnp:res duration="0:03:23.000" size="3324093" bitrate="16364" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.mp3</upnp:res><upnp:res duration="0:03:23.000" size="35831644" bitrate="176400" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/wav:DLNA.ORG_PN=WAV;DLNA.ORG_OP=01">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.forced.wav</upnp:res><upnp:res duration="0:03:23.000" size="35831600" bitrate="176400" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/L16:DLNA.ORG_PN=LPCM;DLNA.ORG_OP=01;DLNA.ORG_CI=1">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.forced.l16</upnp:res><upnp:res duration="0:03:23.000" size="3324093" bitrate="16364" bitsPerSample="16" sampleFrequency="44100" nrAudioChannels="2" protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01">http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.mp3</upnp:res><upnp:class>object.item.audioItem.musicTrack</upnp:class></item></DIDL-Lite>
[id] => d8589-co11
[refid] => leer
[parentid] => co11
[restricted] => leer
[artist] => Alexandra Stan
[album] => Saxobeats
[title] => Get Back (ASAP)
[resource] => http://192.168.178.64:26125/content/c2/b16/f44100/d8589-co11.mp3
[duration] => 0:03:23.000
[size] => 3324093
[bitrate] => 16364
[albumArtURI] => http://192.168.178.64:26125/aa/67622/2495615489/cover.jpg?size=0
[genre] => Pop
[date] => 2011-01-01
[originalTrackNumber] => 5
[class] => object.item.audioItem.musicTrack
)
)
Ich hatte mal einen Weg über das Registrieren der Namespaces versucht, das funktionierte aber nicht so gut, deshalb hatte ich es auch verlassen. Vielleicht ist es aber ein Ansatz für Euch, das Ihr wisst, was ich in etwa meine:
$DIDL = GetValue(41870 /*[Multimedia\Variablen\GetPositionInfo\TrackMetaData]*/);
$DIDL = str_replace(array("<", ">"), array("<", ">"), $DIDL);
$DIDL = '<?xml version="1.0" encoding="UTF-8"?>'.$DIDL;
$DIDL = preg_replace('/pv:/','',$DIDL);
echo ($DIDL);
SetValue(22036 /*[Multimedia\Browse\DIDL-Lite\MetaData [DIDL]]*/, $DIDL);
$xml = simplexml_load_string($DIDL);
foreach ( $xml->getDocNamespaces() as $name => $space )
{
$xml->registerXpathNamespace($name == '' ? 'c' : $name, $space);
$xml->registerXpathNamespace($name == '' ? 'dc' : $name, $space);
$xml->registerXpathNamespace($name == '' ? 'upnp' : $name, $space);
$xml->registerXpathNamespace($name == '' ? 'pv' : $name, $space);
}
//$xml->registerXPathNamespace('s', 'http://schemas.xmlsoap.org/soap/envelope/' );
//$xml->registerXPathNamespace('pv', 'urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/');
//Testanzeige----------------------------------------------------------------
echo "
XML:
";
echo ($xml->asxml());
//Gegenkontrolle, ob es ein item ist--------------------------------------------
if(isset($xml->item))
{
SetValue(UPNP_DIDL_Lite_TYP, "ITEM");
$item = $xml->item;
$attr = $xml->item->attributes();
print_r ($item);
print_r ($attr);
if(isset($attr['id']) && !empty($attr['id']))
{
$ID = $attr['id'];
SetValue(UPNP_DIDL_Lite_ID, (string)$ID);
}else{
SetValue(UPNP_DIDL_Lite_ID, "leer");
}
if(isset($attr['refID']) && !empty($attr['refID']))
{
$RefID = $attr['refID'];
SetValue(UPNP_DIDL_Lite_RefID, (string)$RefID);
}else{
SetValue(UPNP_DIDL_Lite_RefID, "leer");
}
if(isset($attr['parentID']) && !empty($attr['parentID']))
{
$ParentID = $attr['parentID'];
SetValue(UPNP_DIDL_Lite_ParentID, (string)$ParentID);
}else{
SetValue(UPNP_DIDL_Lite_ParentID, "leer");
}
if(isset($attr['restricted']) && !empty($attr['restricted']))
{
$Restricted = $attr['restricted'];
SetValue(UPNP_DIDL_Lite_Restricted, (string)$Restricted);
}else{
SetValue(UPNP_DIDL_Lite_Restricted, "leer");
}
if($item->xpath("dc:creator"))
{
$Artist = $item->xpath("dc:creator");
SetValue(UPNP_DIDL_Lite_Artist, (string)$Artist[0]);
}else{
SetValue(UPNP_DIDL_Lite_Artist, "leer");
}
if($item->xpath("upnp:album"))
{
$Album = $item->xpath("upnp:album");
SetValue(UPNP_DIDL_Lite_Album, (string)$Album[0]);
}else{
SetValue(UPNP_DIDL_Lite_Album, "leer");
}
if($item->xpath("dc:title"))
{
$Titel = $item->xpath("dc:title");
SetValue(UPNP_DIDL_Lite_Titel, (string)$Titel[0]);
}else{
SetValue(UPNP_DIDL_Lite_Titel, "leer");
}
if(isset($item->res))
{
$URI = (string)$item->res;
SetValue(UPNP_DIDL_Lite_URI, (string)$URI);
}else{
SetValue(UPNP_DIDL_Lite_URI, "leer");
}
//wenn name ‘res’ und attribute ‘duration’ vorhanden
if(isset($item->res->attributes) and isset($resattr['duration']))
{
$resattr = $item->res->attributes();
SetValue(UPNP_DIDL_Lite_Duration, (string)$resattr['duration']);
}else{
SetValue(UPNP_DIDL_Lite_Duration, "leer");
}
//wenn name ‘res’ und attribute ‘size’ vorhanden
if(isset($item->res->attributes) and isset($resattr['size']))
{
$resattr = $item->res->attributes();
SetValue(UPNP_DIDL_Lite_Size, (string)$resattr['size']);
}else{
SetValue(UPNP_DIDL_Lite_Size, "leer");
}
//wenn name ‘res’ und attribute ‘bitrate’ vorhanden
if(isset($item->res->attributes) and isset($resattr['bitrate']))
{
$resattr = $item->res->attributes();
SetValue(UPNP_DIDL_Lite_Bitrate, (string)$resattr['bitrate']);
}else{
SetValue(UPNP_DIDL_Lite_Bitrate, "leer");
}
if($item->xpath("upnp:albumArtURI"))
{
$AlbumArtURI = $item->xpath("upnp:albumArtURI");
SetValue(UPNP_DIDL_Lite_AlbumArtURI, (string)$AlbumArtURI[0]);
}else{
SetValue(UPNP_DIDL_Lite_AlbumArtURI, "leer");
}
if($item->xpath("upnp:genre"))
{
$Genre = $item->xpath("upnp:genre");
SetValue(UPNP_DIDL_Lite_Genre, (string)$Genre[0]);
}else{
SetValue(UPNP_DIDL_Lite_Genre, "leer");
}
if($item->xpath("dc:date"))
{
$Date = $item->xpath("dc:date");
SetValue(UPNP_DIDL_Lite_Date, (string)$Date[0]);
}else{
SetValue(UPNP_DIDL_Lite_Date, "leer");
}
if($item->xpath("upnp:originalTrackNumber"))
{
$TrackNumber = $item->xpath("upnp:originalTrackNumber");
SetValue(UPNP_DIDL_Lite_OriginalTrackNumber, (string)$TrackNumber[0]);
}else{
SetValue(UPNP_DIDL_Lite_OriginalTrackNumber, "leer");
}
if($item->xpath("upnp:class"))
{
$Class = $item->xpath("upnp:class");
SetValue(UPNP_DIDL_Lite_Class, (string)$Class[0]);
}else{
SetValue(UPNP_DIDL_Lite_Class, "leer");
}
}
Wenn also jemand zum Auslesen der DIDL-Lite bzw. Browse-Response einen guten Gedanken und ein paar Codezeilen hat wäre das super 
Ach so, mein aktueller Stand sieht jetzt so aus:
Einiges ist verändert und macht zumindest bei mir (meist) was es soll.
Viele Grüße aus Sachsen
André
Edit 27.05.14: Rückgabe-XML des Windows Media Player korrigiert (Cut & Paste - Fehler) Sorry