UPNP/DLNA for IPS: new version

Moin DigiHouse,

nicht schlecht das mit xpath wusste ich so auch nicht.
So wie es aussieht ist das Script auch um einiges schneller.
Dadurch das jetzt der xml Code sauberer übergeben wird,
vereinfacht es die Sache etwas.

PS: Das mit HTTP/1.0 stand auch im Link, aber im kleingedruckten. :smiley:

MFG MNB

Hi mnb,

genau, genau, genau … Definitiv schneller.

Ich versuche nach wie vor xPath dann weiterzuverwenden. In meiner Function komme ich jedoch nur mit einem Kunstgriff an <res> indem ich daraus <upnp:res> mache. Ist mir bisher ein Rätsel.

Hier die Beispiel-DIDL (=$Result):

<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/"><item id="5:audio5:part11:92:57" parentID="4:cont2:530:11:Asaf Avidan0:" refID="5:audio5:part11:91:5" restricted="0"> <dc:title>One Day (Wankelmut Remix)</dc:title> <upnp:class>object.item.audioItem.musicTrack</upnp:class> <upnp:genre>Pop</upnp:genre> <upnp:actor>Asaf Avidan</upnp:actor> <upnp:originalTrackNumber>1</upnp:originalTrackNumber> <dc:date>2012-10-14</dc:date> <dc:publisher>1LIVE</dc:publisher> <dc:creator>Asaf Avidan</dc:creator> <upnp:artist role="AlbumArtist">Asaf Avidan</upnp:artist> <upnp:artist role="Performer">Asaf Avidan</upnp:artist> <upnp:albumArtURI xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/" dlna:profileID="JPEG_TN">http://192.168.178.1:49200/EXTRACTALBUMART/mp3/DLNA-14-0/Musik/Asaf%20Avidan%20-%20One%20Day%20(Wankelmut%20Remix).jpg</upnp:albumArtURI> <res protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000" size="3114569" duration="0:00:00.000" >http://192.168.178.1:49200/AUDIO/DLNA-1-0/Musik/Asaf%20Avidan%20-%20One%20Day%20(Wankelmut%20Remix).mp3</res> </item></DIDL-Lite>

Hier das korrekte Array:

    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="5:audio5:part11:92:57" parentID="4:cont2:530:11:Asaf Avidan0:" refID="5:audio5:part11:91:5" upnp:restricted="0"> <dc:title>One Day (Wankelmut Remix)</dc:title> <upnp:class>object.item.audioItem.musicTrack</upnp:class> <upnp:genre>Pop</upnp:genre> <upnp:actor>Asaf Avidan</upnp:actor> <upnp:originalTrackNumber>1</upnp:originalTrackNumber> <dc:date>2012-10-14</dc:date> <dc:publisher>1LIVE</dc:publisher> <dc:creator>Asaf Avidan</dc:creator> <upnp:artist role="AlbumArtist">Asaf Avidan</upnp:artist> <upnp:artist role="Performer">Asaf Avidan</upnp:artist> <upnp:albumArtURI xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/" dlna:profileID="JPEG_TN">http://192.168.178.1:49200/EXTRACTALBUMART/mp3/DLNA-14-0/Musik/Asaf%20Avidan%20-%20One%20Day%20(Wankelmut%20Remix).jpg</upnp:albumArtURI> <upnp:res protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000" size="3114569" duration="0:00:00.000">http://192.168.178.1:49200/AUDIO/DLNA-1-0/Musik/Asaf%20Avidan%20-%20One%20Day%20(Wankelmut%20Remix).mp3</upnp:res> </item></DIDL-Lite>
            [id] => 5:audio5:part11:92:57
            [refid] => 5:audio5:part11:91:5
            [parentid] => 4:cont2:530:11:Asaf Avidan0:
            [restricted] => leer
            [artist] => Asaf Avidan
            [album] => leer
            [title] => One Day (Wankelmut Remix)
            [resource] => http://192.168.178.1:49200/AUDIO/DLNA-1-0/Musik/Asaf%20Avidan%20-%20One%20Day%20(Wankelmut%20Remix).mp3
            [duration] => 0:00:00.000
            [size] => 3114569
            [bitrate] => leer
            [albumArtURI] => http://192.168.178.1:49200/EXTRACTALBUMART/mp3/DLNA-14-0/Musik/Asaf%20Avidan%20-%20One%20Day%20(Wankelmut%20Remix).jpg
            [genre] => Pop
            [date] => 2012-10-14
            [originalTrackNumber] => 1
            [class] => object.item.audioItem.musicTrack
        )
)

Hier das defekte Array (Resource und die Attribute dazu fehlen):

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="5:audio5:part11:92:57" parentID="4:cont2:530:11:Asaf Avidan0:" refID="5:audio5:part11:91:5" restricted="0"> <dc:title>One Day (Wankelmut Remix)</dc:title> <upnp:class>object.item.audioItem.musicTrack</upnp:class> <upnp:genre>Pop</upnp:genre> <upnp:actor>Asaf Avidan</upnp:actor> <upnp:originalTrackNumber>1</upnp:originalTrackNumber> <dc:date>2012-10-14</dc:date> <dc:publisher>1LIVE</dc:publisher> <dc:creator>Asaf Avidan</dc:creator> <upnp:artist role="AlbumArtist">Asaf Avidan</upnp:artist> <upnp:artist role="Performer">Asaf Avidan</upnp:artist> <upnp:albumArtURI xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/" dlna:profileID="JPEG_TN">http://192.168.178.1:49200/EXTRACTALBUMART/mp3/DLNA-14-0/Musik/Asaf%20Avidan%20-%20One%20Day%20(Wankelmut%20Remix).jpg</upnp:albumArtURI> <res protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000" size="3114569" duration="0:00:00.000">http://192.168.178.1:49200/AUDIO/DLNA-1-0/Musik/Asaf%20Avidan%20-%20One%20Day%20(Wankelmut%20Remix).mp3</res> </item></DIDL-Lite>
            [id] => 5:audio5:part11:92:57
            [refid] => 5:audio5:part11:91:5
            [parentid] => 4:cont2:530:11:Asaf Avidan0:
            [restricted] => leer
            [artist] => Asaf Avidan
            [album] => leer
            [title] => One Day (Wankelmut Remix)
            [resource] => leer
            [duration] => leer
            [size] => leer
            [bitrate] => leer
            [albumArtURI] => http://192.168.178.1:49200/EXTRACTALBUMART/mp3/DLNA-14-0/Musik/Asaf%20Avidan%20-%20One%20Day%20(Wankelmut%20Remix).jpg
            [genre] => Pop
            [date] => 2012-10-14
            [originalTrackNumber] => 1
            [class] => object.item.audioItem.musicTrack
        )

)

Hier die Function:

function BrowseList($Result)
{
$Result = str_replace("res", "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";
		print_r ($liste[$i]['typ']);
		}
	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);
}

Kamst Du mit Deinem Ansatz weiter ?

Gruß André

Moin Digihouse,

durch die Beispiele sind mir noch ein paar Sachen aufgefallen die ich bei meinem Ansatz ändern müsste.
Und auch einige Sachen die ich optimieren kann sind mir aufgefallen.

Ich habe auch mal geschaut ob man die Nodes bei deinem Script mit Wildcards finden kann, bzw. verfügbare als Array ausgeben.
Gefunden habe ich bisher nichts.
Da ich bei meinem Script genau das verfolge. Somit ist es bei meinem Ansatz egal ob unp:res oder xy:res oder nur res gegeben wird.

MFG MNB

Moin DigiHouse,

habe an dem Script noch ein paar Verbesserungen vorgenommen.
Es ist zwar immer noch nicht perfekt, aber es sollte funktionieren. :smiley:

MFG MNB

XML_Script.rar (6.17 KB)

Hallo Andrè,

kommt denn bald ein Update ? :smiley:

Hallo Horst

Ich komme gerade aus dem Urlaub. Jetzt packe ich erstmal aus und in den nächsten Tagen Euch den aktuellen Stand zusammen B-)

Gruß André

Gesendet von meinem C6833 mit Tapatalk

Alles klar. Hoffe der Urlaub war schön und erholsam.

Gesendet von meinem GT-P7501 mit Tapatalk

Hallo Gemeinde,

anbei mal als Zwischenstand die Build direkt vor meinem Urlaub. Sie ist jetzt auch Chrome-kompatibel, da ich sämtliche Buttons angepasst habe. Desweiteren werden Server mit Chunked-Responses (wie die Fritzbox) schneller ausgelesen. Vorgehen wie in Post 37 beschrieben (bis auf den Punkt mit den Smileys, da mir Raketenschnecke den Exporter angepasst hatte :slight_smile: ) und weiter nachzulesen in Basis how to 2014-08-31.pdf (375 KB)

Zugegebenermaßen alles nur kurz zusammengepackt und ohne Prüfung durch eine Testinstallation bei mir …

Multimedia 2014-08-31.zip (729 KB)

Screenshot:

Gebt mal Rückmeldung wo was klemmt.

Die Playlisterstellung erkläre ich bei Gelegenheit genauer. Nur erstmal soviel: beim Browsen auf [Select] oder [Select All] schalten (rechts unten) und die selektierten Titel mit [SET] als Auswahl setzen. Diese sollten dann unter dem Reiter „Playlist“ erscheinen.

@mnb: Deine Function ist hier noch nicht enthalten. Sobald ich sie getestet habe baue ich sie ein. Im Moment ist noch meine letzte Anpassung über XPath drin (kann wie gesagt kein gemischtes Browsing, also Folder und Item zugleich). Zu finden in den UPNP_Browse_Functions unter function BrowseList($Result)

Viele Grüße

André

Hallo Andrè,

habe jetzt mal die neue Version getestet und läuft schon ganz gut.
Was aber etwas komisch ist mal findet es die Server, mal nur einen Teil und mal gar keine, das gleich bei den Devices.

Hast Du da eine Idee?

Und dann habe ich auch noch einige Fehlermeldungen im Logger.

IPS-Err-PHP 2014-09-01 18:06:45.221 Notice: Undefined variable: height
Error in Script C:\IP-Symcon_2_0\scripts\UPNP_SSDP_Device.ips.php on Line 247
133 in IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
44 in IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
247 in UPNP_SSDP_Device.ips.php (call IPSLogger_PhpErrorHandler)
83 in UPNP_SSDP_Request.ips.php (call include) IPS-Err-PHP 2014-09-01 18:06:45.228 Notice: Undefined variable: height
Error in Script C:\IP-Symcon_2_0\scripts\UPNP_SSDP_Server.ips.php on Line 242
133 in IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
44 in IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
242 in UPNP_SSDP_Server.ips.php (call IPSLogger_PhpErrorHandler)
86 in UPNP_SSDP_Request.ips.php (call include) IPS-Err-PHP 2014-09-01 18:07:23.156 Warning: end() expects parameter 1 to be array, boolean given
Error in Script C:\IP-Symcon_2_0\scripts\UPNP_SSDP_Device.ips.php on Line 149
133 in IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
37 in IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
in IPSLogger_PhpErrorHandler
149 in UPNP_SSDP_Device.ips.php (call end)
83 in UPNP_SSDP_Request.ips.php (call include) IPS-Err-PHP 2014-09-01 18:07:33.217 Warning: end() expects parameter 1 to be array, boolean given
Error in Script C:\IP-Symcon_2_0\scripts\UPNP_SSDP_Server.ips.php on Line 150
133 in IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
37 in IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
in IPSLogger_PhpErrorHandler
150 in UPNP_SSDP_Server.ips.php (call end)
86 in UPNP_SSDP_Request.ips.php (call include) IPS-Err-PHP 2014-09-01 18:07:43.537 Warning: end() expects parameter 1 to be array, boolean given
Error in Script C:\IP-Symcon_2_0\scripts\UPNP_SSDP_Server.ips.php on Line 150
133 in IPSLibrary\app\core\IPSLogger\IPSLogger.inc.php (call IPSLogger_Out)
37 in IPSLibrary\app\core\IPSLogger\IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
in IPSLogger_PhpErrorHandler
150 in UPNP_SSDP_Server.ips.php (call end)
86 in UPNP_SSDP_Request.ips.php (call include)

Ich habe sie mal einfach hier reinkopiert.

Hallo Horst,

zum ersten Teil der Frage:

das Phänomen ist mir bekannt. Aus diesem Grund habe ich die Möglichkeit Konfigurationen zu speichern eingefügt. Ich nehme an, dass der Puffer überläuft, da mir das immer passiert, wenn ich mehrmals suche. Bei neu installierten Geräten rufe ich die SSDP auf (klappt dann eigentlich auf Anhieb) - das habe ich dann gespeichert und kann es bei Bedarf aufrufen. Sonst bei normalen Betrieb fragt es alle 5 Minuten mit einem Ping ab, ob noch alle mitmachen :smiley:
Es findet eigentlich auch meine WLAN-Devices und das Handy. Die Function steckt hier (UPNP_Discovery_Functions.ips.php):

function mSearch($ST)
	{
	//Variablen------------------------------------------------------------------
	$USER_AGENT = 'WINDOWS, UPnP/1.0, Intel MicroStack/1.0.1497';
	$MULTICASTIP = '239.255.255.250';
	$MX = 3;
	$MAN = 'ssdp:discover';
	$sockTimout = '10';

	//Message--------------------------------------------------------------------
	$msg  = 'M-SEARCH * HTTP/1.1' . "
";
	$msg .= 'HOST: '.$MULTICASTIP.':1900' . "
";
	$msg .= 'MAN: "'. $MAN .'"' . "
";
	$msg .= 'MX: '. $MX ."
";
	$msg .= 'ST: ' . $ST ."
";
	//$msg .= 'USER-AGENT: '. $USER_AGENT . "
";
	$msg .= '' ."
";

	//MULTICAST MESSAGE absetzen-------------------------------------------------
	$sock = socket_create( AF_INET, SOCK_DGRAM, getprotobyname('udp') );
	$opt_ret = socket_set_option( $sock, SOL_SOCKET, SO_REUSEADDR, 1 );
	$send_ret = socket_sendto( $sock, $msg, strlen( $msg ), 0, $MULTICASTIP, 1900);

	//TIMEOUT setzen-------------------------------------------------------------
	socket_set_option( $sock, SOL_SOCKET, SO_RCVTIMEO, array( 'sec'=>$sockTimout, 'usec'=>'0' ) );

	//RESPONSE empfangen und bearbeiten (parseMSearchResponse())-----------------
	$response = array();
	do
	{
		unset( $buf );
		@socket_recv( $sock, $buf, 1024, MSG_WAITALL );
		if( !is_null($buf) ) $response[] = parseMSearchResponse( $buf );
	}

	while( !is_null($buf) );

	//SOCKET schliessen----------------------------------------------------------
	socket_close( $sock );

	return $response;
	print_r ($response);
}

Wenn jemand eine gute Idee hat - gerne ! Ich habe mal mit einem Multicast-Socket (eigentlich UDP-Socket mit Cutter, Auswertescript etc.) experimentiert, aber dann wieder verlassen, da ich das auch schlecht portieren könnte.

Zum zweiten Teil:

Beim vielen herumbasteln habe ich in der iFrame-Erstellung eine Variable übersehen. In UPNP_SSDP_Device.ips.php on Line 247 muß es heissen:

//iFrame auffrischen------------------------------------------------------------
SetValue(UPNP_Browse_Webfront_iframe_Device, '<iframe src="../user/Multimedia/Discovery/Device.html" style="width: 800px" frameborder="no"</iframe>');

Und in UPNP_SSDP_Server.ips.php on Line 242:

//iFrame auffrischen------------------------------------------------------------
SetValue(UPNP_Browse_Webfront_iframe_Server, '<iframe src="../user/Multimedia/Discovery/Server.html" style="width: 800px" frameborder="no"</iframe>');

Die anderen Logs dürften bei leeren Array aufgetreten sein. Ich habe nicht so auf das Abfangen von Fehlern geachtet …
Das ganze Projekt hat sich mehr oder weniger immer weiter aus sich entwickelt, da hier und dort mal eine Idee kam.

Es gibt sehr viele Baustellen dabei, da mein eigentliches Anliegen die Machbarkeit von UPNP über IPS durch das Bereitstellen aller mir bekannten (Wireshark etc.) HTTP-Posts war (die UPNP_Functions.ips.php).
Da aber niemand so wirklich Bock auf ein Mitentwickeln hatte, dachte ich mir als noch blutiger PHP-Anfänger: „Was es nicht gibt, muss man eben selber machen“. Also - erwartet nicht zu viel von mir !

Tja ich will mal noch:

  • einen Partymode für Sony-Geräte einbauen
  • die Anzeige direkt vom Gerät abfragen (bisher werden beim Play-Befehl die Werte mit übegeben)
  • beim Aufruf einer Playlist abfragen, ob der entsprechende Server auch bereit ist
  • die Anzeige etwas optimieren (vielleicht hat jemand einen Tipp, wie ich die Seiten automatisch auf unterschiedliche Auflösungen anpassen kann)
  • eventuell die Einzelscripte (diente mehr der Übersicht, da ich die einfach manchmal gedruckt in der Hand vor mir haben muß) mal zusammenführen

Gruß

André

Hallo Andrè,

vielen Dank für die ausführliche Antwort, werde es dann anpassen.
Nein, ich erwarte nicht zu viel. Du hast da ein Super Projekt hingelegt und dafür bin ich Dankbar.
Es macht die Software/Hausautomation wieder ein Stück besser.

Hallo Andrè,

habe noch Fragen. :smiley:

Wie speicher / Lade ich die SSDP?
Kann ich für die Devices eindeutige Namen vergeben, wenn ja wo/wie?

Hallo Horst,

@1: die SSDP-Suche speichern kannst Du unter System im rechten unteren Quadranten:

Direkt unter SSDP laden und speichern findest Du ein Textfeld, in dem Du den Namen einträgst. Dann auf speichern klicken.

System02.jpg

Aufrufen kannst du das wieder in dem Du auf laden gehst und sich dann eine HTML-Box mit Buttons zu den gespeicherten Files öffnet .

System03.jpg

Dann Anklicken und die gespeicherte Suche sollte geladen werden.

@2: Das System ist so aufgebaut, dass es out of the Box funktionieren soll. Der Device-Name wird vom entsprechenden Device vorgegeben. D.h. in der dortigen Device-Description (eine XML, die vom Device bereitgestellt und abgefragt wird) wird nach dem „friendlyname“ gesucht und angezeigt (cut auf 12 Buchstaben oder nach Leerzeichen, sonst passt es nicht in die Buttons). Also in den Netzwerkeinstellungen des Device nach Anzeigename o.ä. suchen und einstellen. In meinem Control Point habe ich das nicht vorgesehen. Siehe auch meine Device-Names im Screenshot:

Meißt hat das Device selbst eine Webpage mit verschiedenen Netzwerkeinstellungen. Sony hat das so gelöst:

Viele Grüße

André

Hallo Andreas, so habe ich das mit dem Speichern auch versucht, aber es wird nichts gespeichert. Ich glaube es gibt auch Fehlermeldungen. Ich melde mich heute Abend noch mal, bin auf dienstreise.

Ge(Tapatalk)t mit meinem Galaxy S3

Hi, habe noch folgendes Problem:

Wenn ich im BrowsMode Select All ein ganzes Album auswähle und dann aus Set klicke um eine Playliste zu erstellen, erhalte ich folgende Fehlermeldung:

Fatal error: Call to a member function children() on a non-object in C:\IP-Symcon\scripts\UPNP_Browse_Functions.ips.php on line 369
Abort Processing during Fatal-Error: Call to a member function children() on a non-object Error in Script C:\IP-Symcon\scripts\UPNP_Browse_Functions.ips.php on Line 369

Gruß
Benjamin

Hallo Andrè,

[b]Update;

Habe den Fehler gefunden, dass Unterverzeichnis SSDP gab es nicht, deshalb konnte dort auch nichts gespeichert werden :wink:
Musst Du evtl. noch in Deinen Scripten anpassen.[/b]

also bei mir wird nichts gespeichert.

Hier der Screenshot der Fehlermeldung.

Hallo Leute,

erstmal Folgendes: bevor wir uns jetzt gleich in Details stürzen möchte ich erstmal wissen, ob Grundfunktionen funktionieren. D.h. Browsen und vor allem abspielen direkt aus dem Browsebereich und zwar von Audio, Foto und Video (direktes Anklicken des Buttons). Dazu wäre es nützlich auch kurz die Konfiguration (d.h. Server/Device) zu erwähnen.

Ein kurz hingeworfener Brocken Fehlermeldung soundso ist da nicht hilfreich ! In meiner Konfiguration funktioniert es ja, also werden spezifische Formate der Rückgabe-XML´s von was weiß ich für Geräten der primäre Haken sein oder es ist beim portieren etwas verloren gegangen.
Dabei ist ggf. das Array oder die XML an der es hakt essentiell. Also Eure Mithilfe ist gefragt !

@Horst

Nach Update: freue mich. Du suchst und versuchst schon den Fehler zu finden. So kommen wir vorwärts. Das Verzeichnis in /user/Multimedia sollte das Selbe sein, wie bei mir. Ist offenbar nicht exportiert worden. Die letzte Version war ja wie gesagt ohne Testinstallation von meinem Entwicklungslaptop übernommen. Die davor waren getestet, aber noch nicht Chrome-tauglich. Ich achte beim nächsten Update darauf … :wink:
Jetzt funktioniert es ? Gib mal Rückmeldung zu o.g. Funktionen / Konfiguration.

@bennybunny

Tja. Siehe oben …
Aber: Normalerweise öffnet sich bei Set ein neues Browserfenster mit Anzeige des gesamten abgeschickten Array (habe es per „Nullspace“ ins Nirvana geschickt). Von dort dann wieder auf das IPS-Fenster gehen.
Unter Multimedia/Browse sollte eine Browse.xml und dann eine Playlist.xml liegen. Aber vielleicht vergleichst Du erstmal, ob der Verzeichnisbaum existiert (siehe Problem bei Horst):

Explorer.jpg

Gruß André

Hi Andre,

vielen Dank für dein Feedback. Also generell funktioniert folgendes bei mir:

  1. SSDP suche. Bei mir werden erfolgreich folgende Server gefunden:
  • iHomeserver (iTunes Server)
  • Plex Server
  • Windows Media Player Server
  • Logitech Squeezebox Server

als Clients werden folgende Devices gefunden und funktionieren:

  • Samsung SmartTV
  • Logitech Squeezebox
  • XBMC (läudt auf meinem MAC mini)

folgende Geräte werden leider noch nicht gefunden:

  • Dreambox DLNA addon client

Zu den Funktionen kann ich erfolgreich einzelen mp3s auf und von den Geräten abspielen.

Zu meinem Problem beim Set von Playlists hat sich soeben von selbst erledigt. Habe ees gerade nochmals über den Firefox ausprobiert und hier wird, wie du auch erwähnt hast, ein weiterer Tab mit dem Inhalt des Arrays ausgegeben. Keine Fehlemeldung mehr vorhanden.

Anschließend konnte ich in Playlists meine neue Liste finden und auch erfolgreich wieder löschen.

Das einzige was mir (uund meiner besseren Hälfte) noch fehlt, sind die Radio Sender. Wie wird hier die „Playlist“ Radio gefüllt? Oder ist das noch ein offenes Feature?

Generell erstmal einen großen Respekt für dieses Projekt. Ich kann mir kaum vorstellen, wieviel Arbeit da drin steckt :wink:

EDIT: Hier noch ein Screenshot aus meinem Verzeichnis:

Gruß
Benjamin

Hallo Andrè,

Folgende Geräte werden bei mir gefunden:

Devices:
Bubble Player
Samsung TV
Harman Receiver

Server:
Plex
Fritzbox

Alles was ich an Geräten habe wird gefunden.

Ich teste mit dem Chrome Browser.

Single Play funktioniert bis jetzt für Bilder, Video und Musik.
Playlist geht nicht, es kommt im Chrome und IE nur eine Seite mit Fehlermeldungen.

Hallo Horst & bennybunny,

Danke für die griffigen Rückmeldungen. So sehe ich, dass die Grundfunktionen schon mal funktionieren. Habt Ihr auch mal Video probiert ? Ist damit richtig universell geworden !

Zu den Devices: prima, dass so viele funktionieren. Einige davon habe ich nicht testen können. Squeezebox und Samsung-TV auch ? Wird da die Information bzw. AlbumArt auch angezeigt ?
Die Dreamboxen kenne ich zwar, habe aber keine und so auch nicht getestet. Ggf. kann man das mal noch lösen. Dazu müsste man aber mit den Intel UPNP Tools testen - ich kann Euch Anleitung geben …

@Horst

bei mir funktioniert IE, Chrome und FF mit Playlists. Bitte beachten:

Normalerweise öffnet sich bei Set ein neues Browserfenster mit Anzeige des gesamten abgeschickten Array (habe es per „Nullspace“ ins Nirvana geschickt). Von dort dann wieder auf das IPS-Fenster gehen.

Siehe auch bennybunny´s Antwort. Am Ende meinst Du das - zeig einfach mal einen Screenshot. Ich wusste mir nicht besser zu behelfen, als das senden per Post in den Nullspace. Vielleicht hat ja Jemand von Euch eine Idee. In UPNP_Browse_Server:

$BrowseAuswahl =
"$HTML_Head".
"$HTML_Style_Browse".
"
  <form action=\"link/UPNP_SelectedArray_Web.php\" method=\"post\" target=\"nullspace\">".

  "$buttons". "
      <div class=\"form-submit\">
		 <input
			type=\"submit\"
			name=\"submit\"
			value=\"SET\"
			onclick=\"
			\">
		 </input>
		</div>

  </form>
 </body>
</html>

@bennybunny

Radio funktioniert nur wenn es Dein Server bereitstellt. Ich verwende ASSET-UPNP eben genau deshalb, da es mich an TuneIn-Radio anbindet.
Dann geht das so: ganz normal über Browsen eine Playlist mit dem Namen „Radio“ erstellen und speichern. Die müsste es dann finden und anzeigen.
Man könnte das aber perspektivisch auch über bereits vordefinierte URL´s die man in ein z.B. UPNP_Radio_Constants mit ebenfalls Verweis zu den AlbumArts packt lösen. Ist nur nicht so universell …

Und:

Generell erstmal einen großen Respekt für dieses Projekt. Ich kann mir kaum vorstellen, wieviel Arbeit da drin steckt :wink:

Ja das stimmt … Habe mich eben festgebissen …

Übrigens, da ich mir denke das unter den 75000 Klicks auch immer mal ein IPS-Entwickler dabei ist:
Gibt es was bei erreichen von 100K an Klicks ? (kleiner Scherz).
:wink:

Aber das wollte ich unbedingt loswerden: IPS ist schon ein tolles Teil :loveips: Habe es nie bereut mich damit zu beschäftigen !

Gruß André