UPNP/DLNA for IPS: new version

Hallo Frank,

seit der Version habe ich einiges geändert. Es ist im Fluss. Sobald ich Zeit habe stelle ich eine neue Version online. Eigentlich kann ich nur ermutigen mal die Upnp_Functions.ips.php sich mal pur anzusehen. Die Entwicklung eines Controll Point drumherum war für meinen Hausgebrauch bestimmt müsste aber auch bei einigen anderen Hardwarekonstellationen funktionieren. Lass Dich überraschen…

Und was meinst Du mit Verzeichnisse einsehen. Ein Medienserver stellt doch eigentlich selbst nach Artist, Album etc. zusammen… Folderbrowsing mit Musik und Verzeichnissen gemischt habe ich noch nicht hinbekommen.

Gruß André

Hallo,

Ich meine damit, dass sich wenn ich zum Beispiel auf Interpreten clicke, steht zwar oben neben Root auch Interpreten aber unten erscheinen nicht die Interpreten zur Auswahl. Da passiert gar nichts.

Grüße
Frank

Gesendet von meinem ME173X mit Tapatalk

Hallo Frank,

welchen Server verwendest Du? Vielleicht kann ich das reproduzieren bevor ich eine neue Version online stelle.

Viele Grüße

André

Hallo,

In hab es mit dem von der Dritthöchsten und Windows Media Player probiert. Es hat bei keinem funktioniert.
Wenn ich den Server Wechsel wird das Root korrekt gelesen. Es geht aber halt nicht weiter.

Gruß Frank

Gesendet von meinem ME173X mit Tapatalk

… mit dem von der Dritthöchsten ? Hilf mir mal - ich stehe auf dem Schlauch … :confused:

VG André

Ich meinte doch die fritzbox. Die automatische wortvervollständigung von Android hat dritthöchsten daraus gemacht.

Sorry

Gesendet von meinem ME173X mit Tapatalk

Hallo Gemeinde,

immerhin 28.000 Klicks zeigen mir Euer Interesse an dem Thema. Vielleicht kann ja jemand helfen. :wink:

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/">&lt;microsoft:artistAlbumArtist&gt;Alexandra Stan&lt;/microsoft:artistAlbumArtist&gt;&lt;microsoft:artistPerformer&gt;Alexandra Stan&lt;/microsoft:artistPerformer&gt;</desc><desc id="author" nameSpace="urn:schemas-microsoft-com:WMPNSS-1-0/" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/">&lt;microsoft:authorComposer&gt;[Unbekannter Komponist]&lt;/microsoft:authorComposer&gt;</desc><desc id="Year" nameSpace="urn:schemas-microsoft-com:WMPNSS-1-0/" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/">&lt;microsoft:year&gt;2011&lt;/microsoft:year&gt;</desc><desc id="folderPath" nameSpace="urn:schemas-microsoft-com:WMPNSS-1-0/" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/">&lt;microsoft:folderPath&gt;Freigegebene Musik\MP3´s - 05 fertig&lt;/microsoft:folderPath&gt;</desc><desc id="fileInfo" nameSpace="urn:schemas-microsoft-com:WMPNSS-1-0/" xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0/">&lt;microsoft:fileIdentifier&gt;AMGa_id=R  2287667;AMGp_id=P  2354320;AMGt_id=T 24415507&lt;/microsoft:fileIdentifier&gt;</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. :confused:

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 :smiley:

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

Hallo Andre,
da hat sich ja einiges getan. Würdest Du mir / uns einen aktuellen Abzug Deines Projektes zur Verfügung stellen.

Vielen Dank und grüße
boris

Gesendet von meinem GT-I9505G mit Tapatalk

Ok. Gebt mir etwas Zeit, um das zu portieren. Momentan bin ich beruflich sehr eingespannt und beschäftige mich mit dieser Sache um mich mal ganz abzulenken :slight_smile:

Viele Grüße

André

Moin,
ich hoffe damit kann man die Informationen besser auslesen,
wäre eine Idee von mir, weiß nicht ob dir das weiterhilft.

Ansonsten Respekt für das Projekt.

MFG MNB


<?

function readXML($liste)
{
   $liste = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25", "res"), array("<", ">", "\"", "&", ":", "/", "%", "upnp:res"), $liste);

	$p = xml_parser_create();
	xml_parse_into_struct($p, $liste, $vals, $index);
	xml_parser_free($p);
	
	$wert =false;
	
	foreach ($index as $key=>$id) {
	
	        if ($key) {
	            for ($i=0; $i < count($id); $i++) {
        				$array[$key][] = $vals[$id[$i]];
    				}
    				
	        } else {
	            continue;
	        }
       }
       return($array);
}

print_r( readXML($xml) );

?>

Hallo mnb,

freue mich über Deine Antwort, da es für die Meisten wohl zu aufwändig ist sich in die Scripte hineinzudenken und lieber auf etwas fertiges warten :wink:

Habe gerade deine Function getestet und es sieht vielversprechend aus !

Array
(
    [DIDL-LITE] => Array
        (
            [0] => Array
                (
                    [tag] => DIDL-LITE
                    [type] => open
                    [level] => 1
                    [attributes] => Array
                        (
                            [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/
                        )

                )

            [1] => Array
                (
                    [tag] => DIDL-LITE
                    [type] => close
                    [level] => 1
                )

        )

    [ITEM] => Array
        (
            [0] => Array
                (
                    [tag] => ITEM
                    [type] => open
                    [level] => 2
                    [attributes] => Array
                        (
                            [ID] => 0$1$12$4301R3185930
                            [REFID] => 0$1$8I3185930
                            [PARENTID] => 0$1$12$4301
                            [UPNP:UPNP:RESTRICTED] => 1
                        )

                )

            [1] => Array
                (
                    [tag] => ITEM
                    [type] => close
                    [level] => 2
                )

        )

    [DC:TITLE] => Array
        (
            [0] => Array
                (
                    [tag] => DC:TITLE
                    [type] => complete
                    [level] => 3
                    [value] => 9pm (Till I Come)
                )

        )

    [UPNP:GENRE] => Array
        (
            [0] => Array
                (
                    [tag] => UPNP:GENRE
                    [type] => complete
                    [level] => 3
                    [value] => Dance
                )

        )

    [UPNP:ALBUM] => Array
        (
            [0] => Array
                (
                    [tag] => UPNP:ALBUM
                    [type] => complete
                    [level] => 3
                    [value] => 9pm (Till I Come)
                )

        )

    [DC:CREATOR] => Array
        (
            [0] => Array
                (
                    [tag] => DC:CREATOR
                    [type] => complete
                    [level] => 3
                    [value] => Disco Cell vs. Atb
                )

        )

    [UPNP:ALBUMARTURI] => Array
        (
            [0] => Array
                (
                    [tag] => UPNP:ALBUMARTURI
                    [type] => complete
                    [level] => 3
                    [attributes] => Array
                        (
                            [DLNA:PROFILEID] => JPEG_TN
                        )

                    [value] => http://192.168.178.10:9000/disk/DLNA-PNJPEG_TN-OP01-CI1-FLAGS00d00000/defaultalbumart/a_u_d_i_o.jpg/O0$1$8I3185930.jpg?scale=160x160
                )

        )

    [UPNP:ARTIST] => Array
        (
            [0] => Array
                (
                    [tag] => UPNP:ARTIST
                    [type] => complete
                    [level] => 3
                    [value] => Disco Cell vs. Atb
                )

        )

    [PV:EXTENSION] => Array
        (
            [0] => Array
                (
                    [tag] => PV:EXTENSION
                    [type] => complete
                    [level] => 3
                    [value] => mp3
                )

        )

    [UPNP:ALBUMARTIST] => Array
        (
            [0] => Array
                (
                    [tag] => UPNP:ALBUMARTIST
                    [type] => complete
                    [level] => 3
                    [value] => Disco Cell vs. Atb
                )

        )

    [PV:RATING] => Array
        (
            [0] => Array
                (
                    [tag] => PV:RATING
                    [type] => complete
                    [level] => 3
                    [value] => 4
                )

        )

    [PV:MODIFICATIONTIME] => Array
        (
            [0] => Array
                (
                    [tag] => PV:MODIFICATIONTIME
                    [type] => complete
                    [level] => 3
                    [value] => 1327255852
                )

        )

    [PV:ADDEDTIME] => Array
        (
            [0] => Array
                (
                    [tag] => PV:ADDEDTIME
                    [type] => complete
                    [level] => 3
                    [value] => 1404047139
                )

        )

    [PV:LASTUPDATED] => Array
        (
            [0] => Array
                (
                    [tag] => PV:LASTUPDATED
                    [type] => complete
                    [level] => 3
                    [value] => 1327255852
                )

        )

    [PV:ALBUM_CROSSLINK] => Array
        (
            [0] => Array
                (
                    [tag] => PV:ALBUM_CROSSLINK
                    [type] => complete
                    [level] => 3
                    [value] => 0$1$12$4301
                )

        )

    [PV:ARTIST_CROSSLINK] => Array
        (
            [0] => Array
                (
                    [tag] => PV:ARTIST_CROSSLINK
                    [type] => complete
                    [level] => 3
                    [value] => 0$1$11$4291
                )

        )

    [PV:GENRE_CROSSLINK] => Array
        (
            [0] => Array
                (
                    [tag] => PV:GENRE_CROSSLINK
                    [type] => complete
                    [level] => 3
                    [value] => 0$1$10$1112
                )

        )

    [PV:BOOKMARK] => Array
        (
            [0] => Array
                (
                    [tag] => PV:BOOKMARK
                    [type] => complete
                    [level] => 3
                    [value] => uuid:55076f6e-6b79-4d65-64eb-00089bdc05d9,-L3NoYXJlL011bHRpbWVkaWEvQXVkaW8vTVAzL01QM8K0cyAtIDA1IGZlcnRpZy9EaXNjbyBDZWxsIHZzLiBBdGIgLSA5cG0gKFRpbGwgSSBDb21lKS5tcDM=
                )

        )

    [UPNP:UPNP:RES] => Array
        (
            [0] => Array
                (
                    [tag] => UPNP:UPNP:RES
                    [type] => complete
                    [level] => 3
                    [attributes] => Array
                        (
                            [DURATION] => 0:02:46
                            [SIZE] => 2661161
                            [BITRATE] => 128
                            [PROTOCOLINFO] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01700000000000000000000000000000
                        )

                    [value] => http://192.168.178.10:9000/disk/DLNA-PNMP3-OP01-FLAGS01700000/O0$1$8I3185930.mp3
                )

        )

    [UPNP:CLASS] => Array
        (
            [0] => Array
                (
                    [tag] => UPNP:CLASS
                    [type] => complete
                    [level] => 3
                    [value] => object.item.audioItem.musicTrack
                )

        )

)

Ich muss mal in den nächsten Tagen testen, wie universell man das halten kann und vorallem wie ich ein DIDL-Lite zur Übergabe an den Renderer wieder Restrukturieren kann. Hast Du noch einen Ansatz wie ich direkter an das [tag] → [value] komme ? Soll z.B. heißen:

[UPNP:RES] => Array
                (
                    [tag] => UPNP:RES
                    [type] => complete
                    [level] => 3
                    [attributes] => Array
                        (
                            [DURATION] => 0:02:46
                            [SIZE] => 2661161
                            [BITRATE] => 128
                            [PROTOCOLINFO] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01700000000000000000000000000000
                        )
                    [value] => http://192.168.178.10:9000/disk/DLNA-PNMP3-OP01-FLAGS01700000/O0$1$8I3185930.mp3
                )

Viele Grüße

André

Ich hatte den Thread hier auch vor kurzem gefunden, war aber ehrlich gesagt abgeschreckt von den vielen vielen Scriptteilen, die anscheinend Korrekturen oder Erweiterungen darstellen, das alles nachzuvollziehen war mir dann zu viel. Eine Zusammenfassung des letzten Standes wäre schon eine ganz tolle Sache.

@Hagbard235

Würde ich umgekehrt sicher auch erstmal denken…

Werde mich mal bemühen in nächster Zeit noch Auffälliges zu korrigieren und mal als Test für Euch online stellen.

Viele Grüße

André

Moin,

ich habe noch ein besseres Script zu meiner Idee gefunden und etwas angepasst.
In diesem Script wird das Array richtig sortiert.

MFG MNB


<?

function xml2array($xml, $get_attributes = 1, $priority = 'tag')
{
    $contents = "";
    if (!function_exists('xml_parser_create'))
    {
        return array ();
    }
    $xml = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $xml);
    $parser = xml_parser_create('');
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, trim($xml), $xml_values);
    xml_parser_free($parser);
    if (!$xml_values)
        return; //Hmm...
    $xml_array = array ();
    $parents = array ();
    $opened_tags = array ();
    $arr = array ();
    $current = & $xml_array;
    $repeated_tag_index = array ();
    foreach ($xml_values as $data)
    {
        unset ($attributes, $value);
        extract($data);
        $result = array ();
        $attributes_data = array ();
        if (isset ($value))
        {
            if ($priority == 'tag')
                $result = $value;
            else
                $result['value'] = $value;
        }
        if (isset ($attributes) and $get_attributes)
        {
            foreach ($attributes as $attr => $val)
            {
                if ($priority == 'tag')
                    $attributes_data[$attr] = $val;
                else
                    $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
            }
        }
        if ($type == "open")
        {
            $parent[$level -1] = & $current;
            if (!is_array($current) or (!in_array($tag, array_keys($current))))
            {
                $current[$tag] = $result;
                if ($attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                $current = & $current[$tag];
            }
            else
            {
                if (isset ($current[$tag][0]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    );
                    $repeated_tag_index[$tag . '_' . $level] = 2;
                    if (isset ($current[$tag . '_attr']))
                    {
                        $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                        unset ($current[$tag . '_attr']);
                    }
                }
                $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
                $current = & $current[$tag][$last_item_index];
            }
        }
        elseif ($type == "complete")
        {
            if (!isset ($current[$tag]))
            {
                $current[$tag] = $result;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                if ($priority == 'tag' and $attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
            }
            else
            {
                if (isset ($current[$tag][0]) and is_array($current[$tag]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    if ($priority == 'tag' and $get_attributes and $attributes_data)
                    {
                        $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                    }
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    );
                    $repeated_tag_index[$tag . '_' . $level] = 1;
                    if ($priority == 'tag' and $get_attributes)
                    {
                        if (isset ($current[$tag . '_attr']))
                        {
                            $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                            unset ($current[$tag . '_attr']);
                        }
                        if ($attributes_data)
                        {
                            $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
                }
            }
        }
        elseif ($type == 'close')
        {
            $current = & $parent[$level -1];
        }
    }
    return ($xml_array);
}

print_r(xml2array($xml));

?>

die erzeugte Ausgabe dazu:

Array
(
    [SOAP-ENV:Envelope] => Array
        (
            [SOAP-ENV:Body] => Array
                (
                    [m:BrowseResponse] => Array
                        (
                            [Result] => Array
                                (
                                    [DIDL-Lite] => Array
                                        (
                                            [item] => Array
                                                (
                                                    [dc:title] => Mr. Saxobeat
                                                    [dc:creator] => Alexandra Stan
                                                    [res] => Array
                                                        (
                                                            [0] => http://127.0.0.1:10243/WMPNSSv4/3561040673/1_Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.mp3
                                                            [1] => http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.mp3?formatID=39
                                                            [0_attr] => Array
                                                                (
                                                                    [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}
                                                                )

                                                            [1_attr] => Array
                                                                (
                                                                    [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}
                                                                )

                                                            [2] => http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.mp3?formatID=37
                                                            [2_attr] => Array
                                                                (
                                                                    [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}
                                                                )

                                                            [3] => http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.m4a?formatID=25
                                                            [3_attr] => Array
                                                                (
                                                                    [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}
                                                                )

                                                            [4] => http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.mp3?formatID=28
                                                            [4_attr] => Array
                                                                (
                                                                    [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}
                                                                )

                                                            [5] => http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.adts?formatID=30
                                                            [5_attr] => Array
                                                                (
                                                                    [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}
                                                                )

                                                            [6] => http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.wma?formatID=118
                                                            [6_attr] => Array
                                                                (
                                                                    [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}
                                                                )

                                                        )

                                                    [upnp:class] => object.item.audioItem.musicTrack
                                                    [upnp:genre] => Dance
                                                    [dc:publisher] => RMNradio
                                                    [upnp:artist] => Array
                                                        (
                                                            [0] => Alexandra Stan
                                                            [1] => Alexandra Stan
                                                            [0_attr] => Array
                                                                (
                                                                    [role] => AlbumArtist
                                                                )

                                                            [1_attr] => Array
                                                                (
                                                                    [role] => Performer
                                                                )

                                                        )

                                                    [upnp:author] => [Unbekannter Komponist]
                                                    [upnp:author_attr] => Array
                                                        (
                                                            [role] => Composer
                                                        )

                                                    [upnp:album] => Saxobeats
                                                    [upnp:originalTrackNumber] => 0
                                                    [dc:date] => 2011-01-02
                                                    [upnp:actor] => Alexandra Stan
                                                    [upnp:actor_attr] => Array
                                                        (
                                                            [role] => Alexandra Stan
                                                        )

                                                    [dc:description] => www.radio-fx.de
                                                    [upnp:albumArtURI] => Array
                                                        (
                                                            [0] => http://127.0.0.1:10243/WMPNSSv4/3561040673/0_Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.jpg?albumArt=true
                                                            [1] => http://127.0.0.1:10243/WMPNSSv4/3561040673/Nl9lZmYxZjNhNV83YzA3ODRjOS01Njk.jpg?albumArt=true,formatID=32,width=160,height=160
                                                            [0_attr] => Array
                                                                (
                                                                    [dlna:profileID] => JPEG_SM
                                                                )

                                                            [1_attr] => Array
                                                                (
                                                                    [dlna:profileID] => JPEG_TN
                                                                )

                                                        )

                                                    [desc] => Array
                                                        (
                                                            [0] => Alexandra StanAlexandra Stan
                                                            [1] => [Unbekannter Komponist]
                                                            [0_attr] => Array
                                                                (
                                                                    [id] => artist
                                                                    [nameSpace] => urn:schemas-microsoft-com:WMPNSS-1-0/
                                                                    [xmlns:microsoft] => urn:schemas-microsoft-com:WMPNSS-1-0/
                                                                )

                                                            [1_attr] => Array
                                                                (
                                                                    [id] => author
                                                                    [nameSpace] => urn:schemas-microsoft-com:WMPNSS-1-0/
                                                                    [xmlns:microsoft] => urn:schemas-microsoft-com:WMPNSS-1-0/
                                                                )

                                                            [2] => 2011
                                                            [2_attr] => Array
                                                                (
                                                                    [id] => Year
                                                                    [nameSpace] => urn:schemas-microsoft-com:WMPNSS-1-0/
                                                                    [xmlns:microsoft] => urn:schemas-microsoft-com:WMPNSS-1-0/
                                                                )

                                                            [3] => Freigegebene Musik\MP3
                                                        )

                                                )

                                            [item_attr] => Array
                                                (
                                                    [id] => 6_eff1f3a5_7c0784c9-569
                                                    [refID] => 4-569
                                                    [restricted] => 1
                                                    [parentID] => 6_eff1f3a5_7c0784c9
                                                )

                                        )

                                    [DIDL-Lite_attr] => Array
                                        (
                                            [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/
                                        )

                                )

                            [Result_attr] => Array
                                (
                                    [xmlns:dt] => urn:schemas-microsoft-com:datatypes
                                    [dt:dt] => string
                                )

                        )

                    [m:BrowseResponse_attr] => Array
                        (
                            [xmlns:m] => urn:schemas-upnp-org:service:ContentDirectory:1
                        )

                )

        )

    [SOAP-ENV:Envelope_attr] => Array
        (
            [xmlns:SOAP-ENV] => http://schemas.xmlsoap.org/soap/envelope/
            [SOAP-ENV:encodingStyle] => http://schemas.xmlsoap.org/soap/encoding/
        )

)

Hallo MNB,

nicht unübel ! Schon ein prima Ansatz. Und ich verrenne mich in Namespaces und solchen Balast …

Ich versuche gerade für das von manchen Servern bereitgestellte Folder & Filename - Browsing als universellen Ansatz zu testen. Problem dabei war immer, dass gemischte Ordner aus Folder (container) und Titel (item) mit meinem derzeitigen Auslesen nicht machbar sind. Deine 2. Funktion scheint das Potential dazu zu haben ! Vielleicht kannst Du mir da noch etwas weiter helfen.

Ich habe mal einen Testordner mit 2 Foldern/4 Titeln zusammengestellt:

Folder: ATB Sunset Beach DJ Session
Folder: Future Memories
Titel: 01 - Could You Believe (Airplay Mix).mp3
Titel: 01 - L.A. Nights.mp3
Titel: 02 - Right Back (Original Mix).mp3
Titel: 02 - What About Us.mp3

Die DIDL-Lite ist explizit schon aus der Message herausgetrennt (hier sonst Problem: mal [m:BrowseResponse"] mal [u:BrowseResponse] etc.). Die DIDL habe ich bei 6 verschiedenen DLNA-Servern verglichen - die scheinen außer den Namespaces zumindest für die interessierenden Angaben gleich zu sein. Deshalb suchte ich auch erst einen Ansatz die unterschiedlichen Namespaces handeln zu können.

<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/"><container id="co960" parentID="co857" restricted="0" searchable="1"><dc:title>ATB Sunset Beach DJ Session</dc:title><dc:creator>Unknown</dc:creator><upnp:artist></upnp:artist><upnp:genre>Unknown</upnp:genre><upnp:class>object.container.storageFolder</upnp:class></container><container id="co961" parentID="co857" restricted="0" searchable="1"><dc:title>Future Memories</dc:title><dc:creator>Unknown</dc:creator><upnp:artist></upnp:artist><upnp:genre>Unknown</upnp:genre><upnp:class>object.container.storageFolder</upnp:class></container><item id="d8844-co857" parentID="co857" restricted="0"><dc:title>01 - Could You Believe (Airplay Mix)</dc:title><dc:creator>ATB</dc:creator><dc:date>2010-01-01</dc:date><upnp:artist role="AlbumArtist">ATB</upnp:artist><upnp:artist role="Composer">Jennifer Karr</upnp:artist><upnp:artist role="Performer">ATB</upnp:artist><upnp:album>ATB Sunset Beach DJ Session</upnp:album><upnp:genre>Dance &amp; DJ</upnp:genre><upnp:albumArtURI dlna:profileID="JPEG_TN">http://192.168.178.64:26125/aa/221781/740880359/cover.jpg?size=0</upnp:albumArtURI><upnp:originalTrackNumber>1</upnp:originalTrackNumber><upnp:originalDiscNumber>1</upnp:originalDiscNumber><upnp:originalDiscCount>1</upnp:originalDiscCount><res duration="0:03:29.000" size="7360435" bitrate="35101" 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/d8844-co857.mp3</res><res duration="0:03:29.000" size="36989888" 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/d8844-co857.forced.wav</res><res duration="0:03:29.000" size="36989844" 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/d8844-co857.forced.l16</res><res duration="0:03:29.000" size="7360435" bitrate="35101" 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/d8844-co857.mp3</res><upnp:class>object.item.audioItem.musicTrack</upnp:class></item><item id="d8846-co857" parentID="co857" restricted="0"><dc:title>01 - L.A. Nights</dc:title><dc:creator>ATB</dc:creator><dc:date>2009-01-01</dc:date><upnp:artist role="AlbumArtist">ATB</upnp:artist><upnp:artist role="Composer">André Tanneberger</upnp:artist><upnp:artist role="Performer">ATB</upnp:artist><upnp:album>Future Memories</upnp:album><upnp:genre>Dance &amp; DJ</upnp:genre><upnp:albumArtURI dlna:profileID="JPEG_TN">http://192.168.178.64:26125/aa/51525/2480797350/cover.jpg?size=0</upnp:albumArtURI><upnp:originalTrackNumber>1</upnp:originalTrackNumber><upnp:originalDiscNumber>1</upnp:originalDiscNumber><upnp:originalDiscCount>1</upnp:originalDiscCount><res duration="0:04:32.000" size="9074176" bitrate="33275" 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/d8846-co857.mp3</res><res duration="0:04:32.000" size="48103792" 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/d8846-co857.forced.wav</res><res duration="0:04:32.000" size="48103748" 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/d8846-co857.forced.l16</res><res duration="0:04:32.000" size="9074176" bitrate="33275" 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/d8846-co857.mp3</res><upnp:class>object.item.audioItem.musicTrack</upnp:class></item><item id="d8845-co857" parentID="co857" restricted="0"><dc:title>02 - Right Back (Original Mix)</dc:title><dc:creator>ATB</dc:creator><dc:date>2010-01-01</dc:date><upnp:artist role="AlbumArtist">ATB</upnp:artist><upnp:artist role="Composer">Yuri Kane</upnp:artist><upnp:artist role="Performer">Yuri Kane</upnp:artist><upnp:album>ATB Sunset Beach DJ Session</upnp:album><upnp:genre>Dance &amp; DJ</upnp:genre><upnp:albumArtURI dlna:profileID="JPEG_TN">http://192.168.178.64:26125/aa/221781/740880359/cover.jpg?size=0</upnp:albumArtURI><upnp:originalTrackNumber>2</upnp:originalTrackNumber><upnp:originalDiscNumber>1</upnp:originalDiscNumber><upnp:originalDiscCount>1</upnp:originalDiscCount><res duration="0:05:56.000" size="11797385" bitrate="33070" 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/d8845-co857.mp3</res><res duration="0:05:56.000" size="62927920" 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/d8845-co857.forced.wav</res><res duration="0:05:56.000" size="62927876" 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/d8845-co857.forced.l16</res><res duration="0:05:56.000" size="11797385" bitrate="33070" 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/d8845-co857.mp3</res><upnp:class>object.item.audioItem.musicTrack</upnp:class></item><item id="d8847-co857" parentID="co857" restricted="0"><dc:title>02 - What About Us</dc:title><dc:creator>ATB</dc:creator><dc:date>2009-01-01</dc:date><upnp:artist role="AlbumArtist">ATB</upnp:artist><upnp:artist role="Composer">Rudi Dittmann</upnp:artist><upnp:artist role="Performer">ATB</upnp:artist><upnp:album>Future Memories</upnp:album><upnp:genre>Dance &amp; DJ</upnp:genre><upnp:albumArtURI dlna:profileID="JPEG_TN">http://192.168.178.64:26125/aa/51525/2480797350/cover.jpg?size=0</upnp:albumArtURI><upnp:originalTrackNumber>2</upnp:originalTrackNumber><upnp:originalDiscNumber>1</upnp:originalDiscNumber><upnp:originalDiscCount>1</upnp:originalDiscCount><res duration="0:05:35.000" size="11756320" bitrate="35074" 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/d8847-co857.mp3</res><res duration="0:05:35.000" size="59126676" 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/d8847-co857.forced.wav</res><res duration="0:05:35.000" size="59126632" 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/d8847-co857.forced.l16</res><res duration="0:05:35.000" size="11756320" bitrate="35074" 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/d8847-co857.mp3</res><upnp:class>object.item.audioItem.musicTrack</upnp:class></item></DIDL-Lite>

Und das gelieferte Array:

Array
(
    [DIDL-Lite] => Array
        (
            [container] => Array
                (
                    [0] => Array
                        (
                            [dc:title] => ATB Sunset Beach DJ Session
                            [dc:creator] => Unknown
                            [upnp:artist] => Array
                                (
                                )

                            [upnp:genre] => Unknown
                            [upnp:class] => object.container.storageFolder
                        )

                    [1] => Array
                        (
                            [dc:title] => Future Memories
                            [dc:creator] => Unknown
                            [upnp:artist] => Array
                                (
                                )

                            [upnp:genre] => Unknown
                            [upnp:class] => object.container.storageFolder
                        )

                    [0_attr] => Array
                        (
                            [id] => co960
                            [parentID] => co857
                            [restricted] => 0
                            [searchable] => 1
                        )

                )

            [item] => Array
                (
                    [0] => Array
                        (
                            [dc:title] => 01 - Could You Believe (Airplay Mix)
                            [dc:creator] => ATB
                            [dc:date] => 2010-01-01
                            [upnp:artist] => Array
                                (
                                    [0] => ATB
                                    [1] => Jennifer Karr
                                    [0_attr] => Array
                                        (
                                            [role] => AlbumArtist
                                        )

                                    [1_attr] => Array
                                        (
                                            [role] => Composer
                                        )

                                    [2] => ATB
                                    [2_attr] => Array
                                        (
                                            [role] => Performer
                                        )

                                )

                            [upnp:album] => ATB Sunset Beach DJ Session
                            [upnp:genre] => Dance & DJ
                            [upnp:albumArtURI] => http://192.168.178.64:26125/aa/221781/740880359/cover.jpg?size=0
                            [upnp:albumArtURI_attr] => Array
                                (
                                    [dlna:profileID] => JPEG_TN
                                )

                            [upnp:originalTrackNumber] => 1
                            [upnp:originalDiscNumber] => 1
                            [upnp:originalDiscCount] => 1
                            [res] => Array
                                (
                                    [0] => http://192.168.178.64:26125/content/c2/b16/f44100/d8844-co857.mp3
                                    [1] => http://192.168.178.64:26125/content/c2/b16/f44100/d8844-co857.forced.wav
                                    [0_attr] => Array
                                        (
                                            [duration] => 0:03:29.000
                                            [size] => 7360435
                                            [bitrate] => 35101
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01
                                        )

                                    [1_attr] => Array
                                        (
                                            [duration] => 0:03:29.000
                                            [size] => 36989888
                                            [bitrate] => 176400
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/wav:DLNA.ORG_PN=WAV;DLNA.ORG_OP=01
                                        )

                                    [2] => http://192.168.178.64:26125/content/c2/b16/f44100/d8844-co857.forced.l16
                                    [2_attr] => Array
                                        (
                                            [duration] => 0:03:29.000
                                            [size] => 36989844
                                            [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
                                        )

                                    [3] => http://192.168.178.64:26125/content/c2/b16/f44100/d8844-co857.mp3
                                    [3_attr] => Array
                                        (
                                            [duration] => 0:03:29.000
                                            [size] => 7360435
                                            [bitrate] => 35101
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01
                                        )

                                )

                            [upnp:class] => object.item.audioItem.musicTrack
                        )

                    [1] => Array
                        (
                            [dc:title] => 01 - L.A. Nights
                            [dc:creator] => ATB
                            [dc:date] => 2009-01-01
                            [upnp:artist] => Array
                                (
                                    [0] => ATB
                                    [1] => André Tanneberger
                                    [0_attr] => Array
                                        (
                                            [role] => AlbumArtist
                                        )

                                    [1_attr] => Array
                                        (
                                            [role] => Composer
                                        )

                                    [2] => ATB
                                    [2_attr] => Array
                                        (
                                            [role] => Performer
                                        )

                                )

                            [upnp:album] => Future Memories
                            [upnp:genre] => Dance & DJ
                            [upnp:albumArtURI] => http://192.168.178.64:26125/aa/51525/2480797350/cover.jpg?size=0
                            [upnp:albumArtURI_attr] => Array
                                (
                                    [dlna:profileID] => JPEG_TN
                                )

                            [upnp:originalTrackNumber] => 1
                            [upnp:originalDiscNumber] => 1
                            [upnp:originalDiscCount] => 1
                            [res] => Array
                                (
                                    [0] => http://192.168.178.64:26125/content/c2/b16/f44100/d8846-co857.mp3
                                    [1] => http://192.168.178.64:26125/content/c2/b16/f44100/d8846-co857.forced.wav
                                    [0_attr] => Array
                                        (
                                            [duration] => 0:04:32.000
                                            [size] => 9074176
                                            [bitrate] => 33275
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01
                                        )

                                    [1_attr] => Array
                                        (
                                            [duration] => 0:04:32.000
                                            [size] => 48103792
                                            [bitrate] => 176400
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/wav:DLNA.ORG_PN=WAV;DLNA.ORG_OP=01
                                        )

                                    [2] => http://192.168.178.64:26125/content/c2/b16/f44100/d8846-co857.forced.l16
                                    [2_attr] => Array
                                        (
                                            [duration] => 0:04:32.000
                                            [size] => 48103748
                                            [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
                                        )

                                    [3] => http://192.168.178.64:26125/content/c2/b16/f44100/d8846-co857.mp3
                                    [3_attr] => Array
                                        (
                                            [duration] => 0:04:32.000
                                            [size] => 9074176
                                            [bitrate] => 33275
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01
                                        )

                                )

                            [upnp:class] => object.item.audioItem.musicTrack
                        )

                    [0_attr] => Array
                        (
                            [id] => d8844-co857
                            [parentID] => co857
                            [restricted] => 0
                        )

                    [2] => Array
                        (
                            [dc:title] => 02 - Right Back (Original Mix)
                            [dc:creator] => ATB
                            [dc:date] => 2010-01-01
                            [upnp:artist] => Array
                                (
                                    [0] => ATB
                                    [1] => Yuri Kane
                                    [0_attr] => Array
                                        (
                                            [role] => AlbumArtist
                                        )

                                    [1_attr] => Array
                                        (
                                            [role] => Composer
                                        )

                                    [2] => Yuri Kane
                                    [2_attr] => Array
                                        (
                                            [role] => Performer
                                        )

                                )

                            [upnp:album] => ATB Sunset Beach DJ Session
                            [upnp:genre] => Dance & DJ
                            [upnp:albumArtURI] => http://192.168.178.64:26125/aa/221781/740880359/cover.jpg?size=0
                            [upnp:albumArtURI_attr] => Array
                                (
                                    [dlna:profileID] => JPEG_TN
                                )

                            [upnp:originalTrackNumber] => 2
                            [upnp:originalDiscNumber] => 1
                            [upnp:originalDiscCount] => 1
                            [res] => Array
                                (
                                    [0] => http://192.168.178.64:26125/content/c2/b16/f44100/d8845-co857.mp3
                                    [1] => http://192.168.178.64:26125/content/c2/b16/f44100/d8845-co857.forced.wav
                                    [0_attr] => Array
                                        (
                                            [duration] => 0:05:56.000
                                            [size] => 11797385
                                            [bitrate] => 33070
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01
                                        )

                                    [1_attr] => Array
                                        (
                                            [duration] => 0:05:56.000
                                            [size] => 62927920
                                            [bitrate] => 176400
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/wav:DLNA.ORG_PN=WAV;DLNA.ORG_OP=01
                                        )

                                    [2] => http://192.168.178.64:26125/content/c2/b16/f44100/d8845-co857.forced.l16
                                    [2_attr] => Array
                                        (
                                            [duration] => 0:05:56.000
                                            [size] => 62927876
                                            [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
                                        )

                                    [3] => http://192.168.178.64:26125/content/c2/b16/f44100/d8845-co857.mp3
                                    [3_attr] => Array
                                        (
                                            [duration] => 0:05:56.000
                                            [size] => 11797385
                                            [bitrate] => 33070
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01
                                        )

                                )

                            [upnp:class] => object.item.audioItem.musicTrack
                        )

                    [3] => Array
                        (
                            [dc:title] => 02 - What About Us
                            [dc:creator] => ATB
                            [dc:date] => 2009-01-01
                            [upnp:artist] => Array
                                (
                                    [0] => ATB
                                    [1] => Rudi Dittmann
                                    [0_attr] => Array
                                        (
                                            [role] => AlbumArtist
                                        )

                                    [1_attr] => Array
                                        (
                                            [role] => Composer
                                        )

                                    [2] => ATB
                                    [2_attr] => Array
                                        (
                                            [role] => Performer
                                        )

                                )

                            [upnp:album] => Future Memories
                            [upnp:genre] => Dance & DJ
                            [upnp:albumArtURI] => http://192.168.178.64:26125/aa/51525/2480797350/cover.jpg?size=0
                            [upnp:albumArtURI_attr] => Array
                                (
                                    [dlna:profileID] => JPEG_TN
                                )

                            [upnp:originalTrackNumber] => 2
                            [upnp:originalDiscNumber] => 1
                            [upnp:originalDiscCount] => 1
                            [res] => Array
                                (
                                    [0] => http://192.168.178.64:26125/content/c2/b16/f44100/d8847-co857.mp3
                                    [1] => http://192.168.178.64:26125/content/c2/b16/f44100/d8847-co857.forced.wav
                                    [0_attr] => Array
                                        (
                                            [duration] => 0:05:35.000
                                            [size] => 11756320
                                            [bitrate] => 35074
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01
                                        )

                                    [1_attr] => Array
                                        (
                                            [duration] => 0:05:35.000
                                            [size] => 59126676
                                            [bitrate] => 176400
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/wav:DLNA.ORG_PN=WAV;DLNA.ORG_OP=01
                                        )

                                    [2] => http://192.168.178.64:26125/content/c2/b16/f44100/d8847-co857.forced.l16
                                    [2_attr] => Array
                                        (
                                            [duration] => 0:05:35.000
                                            [size] => 59126632
                                            [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
                                        )

                                    [3] => http://192.168.178.64:26125/content/c2/b16/f44100/d8847-co857.mp3
                                    [3_attr] => Array
                                        (
                                            [duration] => 0:05:35.000
                                            [size] => 11756320
                                            [bitrate] => 35074
                                            [bitsPerSample] => 16
                                            [sampleFrequency] => 44100
                                            [nrAudioChannels] => 2
                                            [protocolInfo] => http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01
                                        )

                                )

                            [upnp:class] => object.item.audioItem.musicTrack
                        )

                )

        )

    [DIDL-Lite_attr] => Array
        (
            [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/
        )

)

Das Problem: die Attribute zu container oder item bekomme ich nicht zu jedem. Nur jeweils das Erste. z.B.

                    [0_attr] => Array
                        (
                            [id] => co960
                            [parentID] => co857
                            [restricted] => 0
                            [searchable] => 1
                        )

Die sind recht wichtig, da hier ID und ParentID (darauf beruht das browsen) stehen.

Irgendwie muss ich das dann in die Array-Struktur, wie ich sie verwende portieren (sonst muss ich einiges wieder umschreiben).

Folgender Ansatz (funktioniert noch nicht so richtig):

$MetaData = $xml;

$DIDL = (xml2array($MetaData));

$liste = array();
$count = array_count_values($DIDL);

for ($i=0; $i < $count; $i++)
	{
	if(isset($DIDL['container']))
		{
		$liste[$i]['typ']                   			= 'container';
		$liste[$i]['metadata']					= $MetaData;

		$liste[$i]['id'] 						= $DIDL['container']["$i_attr"]['id'];
		$liste[$i]['refid'] 					= $DIDL['container']["$i_attr"]['refID'];
		$liste[$i]['parentid'] 					= $DIDL['container']["$i_attr"]['parentID'];
		$liste[$i]['restricted'] 				= $DIDL['container']["$i_attr"]['restricted'];

		$liste[$i]['artist'] 					= $DIDL['container'][$i]['upnp:artist'];
		$liste[$i]['album'] 					= $DIDL['container'][$i]['upnp:album'];
		$liste[$i]['title'] 						= $DIDL['container'][$i]['dc:title'];
		}

	if(isset($DIDL['item']))
		{
		$liste[$i]['typ']                   = 'item';
		$liste[$i]['metadata']					= $MetaData;

		$liste[$i]['id'] 						= $DIDL['item']["$i_attr"]['id'];
		$liste[$i]['refid'] 					= $DIDL['item']["$i_attr"]['refID'];
		$liste[$i]['parentid'] 					= $DIDL['item']["$i_attr"]['parentID'];
		$liste[$i]['restricted'] 				= $DIDL['item']["$i_attr"]['restricted'];

		$liste[$i]['artist'] 					= $DIDL['item'][$i]['upnp:artist'];
		$liste[$i]['album'] 					= $DIDL['item'][$i]['upnp:album'];
		$liste[$i]['title'] 						= $DIDL['item'][$i]['dc:title'];

		$liste[$i]['resource'] 					= $DIDL['item'][$i]['res'];
		$liste[$i]['duration'] 					= $DIDL['item'][$i]['res_attr']['duration'];
		$liste[$i]['size'] 						= $DIDL['item'][$i]['res_attr']['size'];
		$liste[$i]['bitrate'] 					= $DIDL['item'][$i]['res_attr']['bitrate'];

		$liste[$i]['albumArtURI'] 				= $DIDL['item'][$i]['upnp:albumArtURI'];
		$liste[$i]['genre'] 					= $DIDL['item'][$i]['upnp:genre'];
		$liste[$i]['date'] 					= $DIDL['item'][$i]['dc:date'];
		$liste[$i]['originalTrackNumber'] 		= $DIDL['item'][$i]['upnp:originalTrackNumber'];
		$liste[$i]['class'] 					= $DIDL['item'][$i]['upnp:class'];
		}
	}

print_r ($liste);

Ach und: ich habe heute festgestellt, dass die Scripts bzw. Steuerung über Webfront unter Chrome nicht funktionieren !

Viele Grüße

André

Moin DigiHouse,

ich hoffe ich habe alle Bugs gefunden.:wink:

MFG MNB


<?

function xml2array($contents, $get_attributes=1, $priority = 'tag') {
    if(!$contents) return array();

    if(!function_exists('xml_parser_create')) {
        //print "'xml_parser_create()' function not found!";
        return array();
    }

    $contents = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $contents);
    //Get the XML parser of PHP - PHP must have this module for the parser to work
    $parser = xml_parser_create('');
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, trim($contents), $xml_values);
    xml_parser_free($parser);

    if(!$xml_values) return;//Hmm...

    //Initializations
    $xml_array = array();
    $parents = array();
    $opened_tags = array();
    $arr = array();

    $current = &$xml_array; //Refference

    //Go through the tags.
    $repeated_tag_index = array();//Multiple tags with same name will be turned into an array
    foreach($xml_values as $data) {
        unset($attributes,$value);//Remove existing values, or there will be trouble

        //This command will extract these variables into the foreach scope
        // tag(string), type(string), level(int), attributes(array).
        extract($data);//We could use the array by itself, but this cooler.

        $result = array();
        $attributes_data = array();

        if(isset($value)) {
            if($priority == 'tag') $result = $value;
            else $result['value'] = $value; //Put the value in a assoc array if we are in the 'Attribute' mode
        }

        //Set the attributes too.
        if(isset($attributes) and $get_attributes) {
            foreach($attributes as $attr => $val) {
                if($priority == 'tag') $attributes_data[$attr] = $val;
                else $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
            }
        }

        //See tag status and do the needed.
        if($type == "open") {//The starting of the tag '<tag>'
            $parent[$level-1] = &$current;
            if(!is_array($current) or (!in_array($tag, array_keys($current)))) { //Insert New tag
                $current[$tag] = $result;
                if($attributes_data) $current[$tag. '_attr'] = $attributes_data;
                $repeated_tag_index[$tag.'_'.$level] = 1;

                $current = &$current[$tag];

            } else { //There was another element with the same tag name

                if(isset($current[$tag][0])) {//If there is a 0th element it is already an array
                    $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;
                } else {//This section will make the value an array if multiple tags with the same name appear together
                    $current[$tag] = array($current[$tag],$result);//This will combine the existing item and the new item together to make an array

                    if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well
                        $current[$tag]['0_attr'] = $current[$tag.'_attr'];
                        unset($current[$tag.'_attr']);
                    }
                }
                if($attributes_data) $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
                $repeated_tag_index[$tag.'_'.$level]++;
                $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1;
                $current = &$current[$tag][$last_item_index];
            }

        } elseif($type == "complete") { //Tags that ends in 1 line '<tag/>'

            // turn empty array to empty string
            if (is_array($result) && empty($result)) {
                $result = '';
            }

            //See if the key is already taken.
            if(!isset($current[$tag])) { //New Key
                $current[$tag] = $result;
                $repeated_tag_index[$tag.'_'.$level] = 1;
                if($priority == 'tag' and $attributes_data) $current[$tag. '_attr'] = $attributes_data;

            } else { //If taken, put all things inside a list(array)

                if(isset($current[$tag][0]) and is_array($current[$tag])) {//If it is already an array...

                    // ...push the new element into that array.
                    $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;

                    if($priority == 'tag' and $get_attributes and $attributes_data) {
                        $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
                    }
                    $repeated_tag_index[$tag.'_'.$level]++;

                } else { //If it is not an array...
                    $current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value
                    $repeated_tag_index[$tag.'_'.$level] = 1;
                    if($priority == 'tag' and $get_attributes) {
                        if(isset($current[$tag.'_attr'])) { //The attribute of the last(0th) tag must be moved as well

                            $current[$tag]['0_attr'] = $current[$tag.'_attr'];
                            unset($current[$tag.'_attr']);
                        }

                        if($attributes_data) {
                            $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[$tag.'_'.$level]++; //0 and 1 index is already taken
                }
            }

        } elseif($type == 'close') { //End of tag '</tag>'
            $current = &$parent[$level-1];
        }
    }

    return($xml_array);
}

?>

Hallo mnb,

ja das Array wird erstellt – super Arbeit. So habe ich mir das vorgestellt – Input von Außen, wenn man den Wald vor Bäumen nicht mehr sieht :rolleyes:

Deshalb stelle ich mal test-weise meinen aktuellen Entwicklungsstand online (wiedermal mit dem Project-Exporter von Raketenschnecke).

Multimedia 2014-07-20.zip (661 KB)

Die Function habe ich noch nicht implementiert. Das erfolgt dann in UPNP_Browse_Functions statt der function BrowseList($Result)

Wie installieren ?

Im Wesentlichen erfolgt das wie in Post #1 beschrieben.

Als erstes das Script (mit Projekt-Exporter von Raketenschnecke erstellt) in ein neues Script kopieren und die ID des Webfront-Konfigurator (WFC) eintragen. Vorsichtshalber oben in das Script noch ini_set(‚max_execution_time‘, 600); eintragen (mein ursprünglicher Server mit Atom hat es z.B. nicht innerhalb von 30 sec geschafft) und starten.

Wenn es dann installiert ist erscheint ein Objektbaum, der sich ein wenig von Post #1 unterscheidet, das ist aber irrelevant.

Unter „/Multimedia/Core/UPNP_Constants“ die IP-Symcon IP und Port eintragen:

$IPS_IP = "XXX.XXX.XXX.XXX:82";

Dann noch die GIF´s in Smileys.zip in das Verzeichnis \IP-Symcon\webfront\user\Multimedia\image kopieren (das sind animierte Preloader, welche leider momentan nicht anders zu portieren sind)

Smileys.zip (313 KB)

Wie starten ?

Ausgangspunkt ist die SSDP-Suche. Hier unter System (Bild 4) unter SSDP-Suche einen Suchlauf starten. Das dauert eine Weile. Wenn aber nach 5 Minuten nichts da ist und der Smiley sich immer noch dreht ist etwas schief gegangen.

Wenn alle gewünschten Devices/Server angezeigt werden solltest Du der Suche einen Namen geben (SSDP Name) und speichern. Der Rest ist dort erstmal uninteressant.

Wenn das geglückt ist links oben auf Server gehen (Bild 1) und einen Server anklicken. Es müsste dann das Root-Menu der Abfrage (z.B: Musik/Video/Foto) erscheinen. Getestet ist das mit den auf dem Bild sichtbaren Servern. Für WMP muss ich noch Dein Script einbauen …

Jetzt unter Device einen Renderer auswählen (links oben)

Zum direkt Abspielen den BrowseMode auf Single setzen (die anderen sind zum Selktieren für eine Playlist).

Dann den Titel anklicken und es sollte nach ein paar Sekunden etwas zu hören sein.

Meine Konfiguration habe ich schon mehrfach beschrieben (siehe Post #1 sowie http://www.ip-symcon.de/forum/threads/22187-UPNP-DLNA-for-IPS-basics-and-first-how-to).

Ich habe das 3 mal auf meinem ehemaligen Atom-Homeserver (baue gerade auf die QNAP um – siehe anderer Tread) durchexerziert. Trotzdem: offenbar ist das portieren tricky - gib mal Rückmeldung :wink: Wenn es nicht funktioniert brauche ich am Besten die Fehlermeldungen. Die Vielzahl der Scripts ist ein Tribut an die Komplexität, da ich mich immer wieder durch Functions und Logiken gewühlt habe, die ich sonst kaum wiederfinde. Vieles kann man sicher besser machen …

Nochmal Achtung: unter Chrome funktioniert es nicht (a.e. inkompatibles HTML)

Anbei ein paar Screenshots:




Für Alle: Der Motor ist die UPNP_Functions.ips.php (jetzt V2.8) mit allen notwendigen Functions ! Bei wem es also nicht funktioniert oder es nicht gefällt: macht was draus ! UPNP/DLNA über IPS funktioniert bei mir !

Viele Grüße aus Sachsen

André

Danke André

werde es die Tage ganz sicher probieren, da ich ja gerade auf UPNP-Basis mein neues Heim aufbauen will.

Gruß André

Hi mnb,

ich würde gern mit einer foreach-Schleife über das Array das deine Funktion erzeugt gehen. Dafür wäre es gut wenn nicht z.B. [0] und die Attribute dazu [0_attr] getrennt existieren, sondern die Attribute mit im Array [0] stehen. Also z.B. [0][attributes].

Kannst Du das hinbiegen ?

Gruß André

… falls jemand doch noch eine Idee hat, wie man die komplette Message des Gerätes direkter auslesen kann wäre das sehr willkommen. Die Function steckt in Upnp_ Browse_Functions und das Problem mit den Namespaces habe ich oben beschrieben. Wenn man eventuell gleich schon ein Array aufbauen könnte mit der BrowseResponse (Achtung: mal u: mal m: davor) wäre das wahrscheinlich besser als mein Explode-Weg. Das Result verarbeiten mit der function von mnb wird sicher gut.

Viele Grüße

André