IPSSonos

Hab IPSSonos nochmal genauer unter die Lupe genommen. Es geht nichts was mit „Browse“ arbeitet. Also alles im Zusammenhang mit Radiostationen und Playlisten.

An sich sind die ganzen Parameter so geblieben, wie sie in IPSSonos verwendet werden, aber der übliche Mist mit dem „Aufbau“ des SOAP-Befehls… Und da ich da bei IPSSonos absolut nicht durchsteige, bekomme ich es nicht gefixed.

Sollte also jemand richtig Ahnung von UPnP/SOAP haben und ein wenig mit DeviceSpy umgehen können, oder einfach zuviel Zeit und den entsprechenden Willen haben, dann sollte es für denjenigen kein großes Problem sein IPSSonos wieder ans Laufen zu bringen.

Da ich in SonosBY bisher nur 2 Features nicht drin habe, die ich noch über IPSSonos verwendet habe (RadiostationByID/Name und PlaylistByID/Name), werde ich mir das demnächst in SonosBY einbauen. Hilft all den IPSSonos-Nutzern leider nichts, aber wie gesagt, ich bekomme es leider nicht gefixed…

Grüße,
Chris

Kein Problem Chris.

Aber danke für deine Mühen.

Von mir auch DANKE !!!

Hallo Kollegen,

probiert mal den Fix wie hier beschrieben. Bei mir läuft IPSSonos auch mit 6.0 wieder normal. Aber Vorsicht ist erst seit 3-4 h im Laufen und noch nicht voll getestet. Daher bitte die Original PHPSonos.inc.php als Sicherheitskopie speichern.
Beste Grüße
hoep

Hallo MaLu,

bist Du auf IPSSonos 1.1.2 ? Hast du vielleicht eine Kopie der PHPSonos.inc.php woanders als im Scripts/IPSLibrary/app/modules/IPSSonos liegen ?

probiere mal folgendes testscript mit der ip einer deiner Sonos Boxen:


<?
$ip = '10.10.10.51';
$content ='POST /MediaServer/ContentDirectory/Control HTTP/1.1
HOST: '.$ip.':1400
SOAPACTION: "urn:schemas-upnp-org:service:ContentDirectory:1#Browse"
CONTENT-TYPE: text/xml; charset="utf-8"
Content-Length: 530

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <u:Browse xmlns:u="urn:schemas-upnp-org:service:ContentDirectory:1">
         <ObjectID>SQ:</ObjectID>
         <BrowseFlag>BrowseDirectChildren</BrowseFlag>
         <Filter />
         <StartingIndex>0</StartingIndex>
         <RequestedCount>100</RequestedCount>
         <SortCriteria />
      </u:Browse>
   </s:Body>
</s:Envelope>';
//var_dump($content);
$fp = fsockopen($ip, 1400 /* Port */, $errno, $errstr, 10);
fputs ($fp, $content);
		$ret = "";
		while (!feof($fp)) {
			$ret.= fgetss($fp,128); // filters xml answer
		}
		fclose($fp);
		$array = preg_split("/
/", $ret);
		//echo $ret;
		$returnContent = $ret;
		$returnContent = substr($returnContent, stripos($returnContent, '<'));
        $returnContent = substr($returnContent, 0, strrpos($returnContent, '>') + 4);
        $returnContent = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $returnContent);

        $xml = new SimpleXMLElement($returnContent);
        $liste = array();
        for($i=0,$size=count($xml);$i<$size;$i++)
        {
            $attr = $xml->container[$i]->attributes();
            $liste[$i]['id'] = (string)$attr['id'];
            $title = $xml->container[$i];
            $title = $title->xpath('dc:title');
            $liste[$i]['title'] = (string)$title[0];
            $liste[$i]['typ'] = "Sonos";
           $liste[$i]['file'] = urlencode((string)$xml->container[$i]->res);

        }
print_r($liste);
?>

Als Resultat solltest du Deine Playlists sehen.
Alternativ könnte ich Dir noch meine PHPSonos.inc.php senden.
Bei mir funktioniert alles wie vorher.

Grüße
hoep

Hallo hoep,

Ja, bin auf Version 1.1.2
Ich habe weitere PHPSonos.inc.php nur in den Backup Verzeichnissen. Ansonsten liegt die „aktive“ unter
–> C:\IP-Symcon\scripts\IPSLibrary\app\modules\IPSSonos
Dein Testskript list die vorhandenen Playlists aus - die gleichen wie im Songs Modul - sind jedoch nicht „abspielbar“.

Kannst Du mir mal Deine PHPSonos.inc.php schicken.

Danke und Grüsse,
MaLu

Hallo MaLu,

anbei meine PHPSonos.inc.php - Aber Achtung, habe weiter Schwierigkeiten mit der IPSSonos entdeckt (Setzen der Lautstärke), muss ich mir aber erst ansehen.

Radiostations wechseln/synchronisieren, Playlist wechseln/synchronisieren funktioniert aber bei mir problemlos.
Gruß
hoep

PHPSonos.inc.zip (14.4 KB)

Hallo Kollegen,

muss leider vermelden, dass der Hack zwar die Probleme mit den Synchronisationen bei mir löst, aber andere Probleme macht. Offensichtlich hat sich die Antwort der „Browse“-Funtion geändert. Ich habe zwar einen Super-Dirty-Hack, der momentan uneingeschränkt zu funktionieren scheint, möchte den aber noch genauer testen und analysieren. Also bitte momentan meinen obigen geposteten hack nicht anwenden.
Danke
hoep

Danke hoep!

„IPSSonos_PlayRadiostationByID“ funktioniert bei mir mit deiner PHPSonos-Version wieder :slight_smile:
Dann kann ich in Ruhe das Feature bei mir einbauen und hab keinen Stress :cool:

Grüße,
Chris

Hi Bayaro,

Achtung mit der vorherigen Version gibts bei Laut/Leise u. ein paar anderen Dingen Probleme. Ein gaaaaanz dreckiger Hack wäre der Austausch der function sendPacket durch folgenden code:

private function sendPacket( $content )
	{
		$fp = fsockopen($this->address, 1400 /* Port */, $errno, $errstr, 10);
		if (!$fp)
		    throw new Exception("Error opening socket: ".$errstr." (".$errno.")");

		fputs ($fp, $content);
		$ret = "";
		while (!feof($fp)) {
			$ret.= fgetss($fp,128); // filters xml answer
		}
		fclose($fp);

		if(strpos($ret, "200 OK") === false)
   	throw new Exception("Error sending command: ".$ret);
// TAG_DEBUG_DEEP sendpacketdebug
		// echo "sendPacketDebug: "; //DEBUG
		// print_r($ret);

		$array = preg_split("/
/", $ret);
		if (strpos($content,"<BrowseFlag>BrowseDirectChildren</BrowseFlag>") === false){
		   return $array[count($array) - 1];
		   }
		else {
        return $ret;
		  }
	}
	
}

Aber wie gesagt, schön ist anders… :frowning:
Gruß
hoep

Mich persönlich interessieren von IPSSonos nur noch die beiden Features für Radiostation und Playlist abspielen, alles andere habe ich schon im SonosBY eingebaut und ist mir persönlich also egal :slight_smile: > Soll nicht so egoistisch rüberkommen wie es vlt. klingt :smiley: :smiley:

Grüße,
Chris

Jo passt eh, aber wenn jemand anderer versucht die PHPSonos zu patchen, so sei er vorgewarnt :slight_smile:

Hallo zusammen, ich habe seit kurzem auch eine Play1 und versuche mich gerade an IPSSonos.
Die Installation hat geklappt, aber einige Radiosender liefern kein Logo. Woran liegt das, ich denke die Info kommt aus einem xml File? Wie kann ich prüfen wo der Fehler liegt bzw. wie komme ich an die Info aus dem Sonos System oder hat das Problem schon jemand gelöst (wurde weiter vorn ja schon mal angesprochen)?

Aktuell habe ich noch die 5.5 als Firmwarestand.

edit
Ok, durch Benutzung der PHPSonus.inc.php und „GetPositionInfo()“ habe ich herausgefunden das die Info scheinbar nicht mitgeliefert wird, aber warum ist das so oder ist das evtl. eine Fehler in der Klasse? Denn in dem Windows Programm von Sonos werden die Infos doch auch dargestellt !?

Gruß
Jens

Hallo hoep,

Danke für Deine Datei und die weiteren Änderungen - aber es ändert sich nicht wirklich was.
Die Fehlermeldungen bleiben gleich.

Grüsse,
MaLu

@MaLu

Sicher dass der Radiosender noch existiert ? Man synchronisiert ja nicht täglich/wöchentlich. Such mal unter der Songs App ob es den Radio Sender noch gibt. Solche Fehlermeldungen hatte ich auch, aber nur bei defekten Playlisten aus Rdio (Titel waren nicht mehr verfügbar).
Gruß
hoep

@Jens: Das Thema mit Radiosendern ohne Logo kam immer wieder mal auf… Die Logos (im IPSSonos-Code als „Artwork“ bezeichnet) werden online bei einem Anbieter (hab vergessen welcher) gesucht. Wenn gefunden, dann angezeigt. Wenn nicht gefunden, hilft nur manuell im Skript nacharbeiten (war glaub ich mal irgendwo beschrieben und ich hatte noch was dazu gesagt, kann mich aber leider nicht genauer erinnern).

Ich hoffe die Infos helfen dir ein wenig weiter :slight_smile:

Grüße,
Chris

@Jens: Radio-Infos werden von Tunein abgerufen.
Gruß
hoep

Hallo Chris, danke für die Antwort.

Ich glaube ganz so einfach ist die Erklärung nicht …
Als Beispiel einfach die Sender N-Joy oder Bremen4 anzeigen lassen (die Logos werden auch gefunden).

Bremen4 Logo: http://cdn-radiotime-logos.tunein.com/s25565.png

Wenn ich aber SunshineLive als Sender über Sonos ausprobiere, dann kommt kein Logo … obwohl es bei dem gleichen Anbieter wie die beiden anderen zu finden ist (bei der Squeezebox ging das nämlich auch so, daher wusste ich die richtige Nummer vom Logo).

SSL Logo: http://cdn-radiotime-logos.tunein.com/s10637.png

Irgendeine andere Idee dazu? :wink:
Ansonsten muss ich dann doch manuell etwas basteln.
Blöd ist auch das dann z.B. der Titel bei Radio SSL nicht richtig dargestellt wird

Gruß
Jens

Such mal hier im gesamten IPS-Forum nach „AlbumArtURI“, da finden sich ein paar Threads zum Thema Sonos und Cover. Vielleicht hilft dir irgendwas davon etwas weiter.

Grafik (Sonos-Cover) in HTML-Box zentrieren
> Evtl. kannst du statt Cover zentrieren mal ein paar Debug Ausgaben machen und dann „filtern“ wenn dein Radiosender ohne Logo aktiv/eingeschaltet ist und dann entsprechend die richtige URL unterjubeln!? Ich hoffe du kannst mir folgen :slight_smile:

Grüße,
Chris

@hoep

So, im Prinzip bei den Playlists-Versuch abspielen - passiert folgendes- ein SaveQueue bringt dieselben Meldungen - wie die WF Oberfläche - Send Packet geht wohl nicht bei mir. Zeile 2311 liegt in dem Bereich.

Auslesen der Playlist -->

[id] => SQ:2
[title] => Faun
[typ] => Sonos
[file] => file%3A%2F%2F%2Fjffs%2Fsettings%2Fsavedqueues.rsq%232

SaveQueue -->

Fatal error: Uncaught exception ‚Exception‘ with message 'Error sending command: HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: 347
CONTENT-TYPE: text/xml; charset=„utf-8“
EXT:
Server: Linux UPnP/1.0 Sonos/31.3-22220 (ZPS1)
Connection: close

s:ClientUPnPError’ in C:\IP-Symcon\scripts\PHPSonos.inc.php:2311
Stack trace:
#0 C:\IP-Symcon\scripts\PHPSonos.inc.php(821): PHPSonos->sendPacket(‚POST /MediaRend…‘)
#1 C:\IP-Symcon\scripts\24255.ips.php(11): PHPSonos->SaveQueue(‚Susi‘, 4)
#2 {main}
thrown in C:\IP-Symcon\scripts\PHPSonos.inc.php on line 2311
Abort Processing during Fatal-Error: Uncaught exception ‚Exception‘ with message 'Error sending command: HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: 347
CONTENT-TYPE: text/xml; charset=„utf-8“
EXT:
Server: Linux UPnP/1.0 Sonos/31.3-22220 (ZPS1)
Connection: close

s:ClientUPnPError’ in C:\IP-Symcon\scripts\PHPSonos.inc.php:2311
Stack trace:
#0 C:\IP-Symcon\scripts\PHPSonos.inc.php(821): PHPSonos->sendPacket(‚POST /MediaRend…‘)
#1 C:\IP-Symcon\scripts\24255.ips.php(11): PHPSonos->SaveQueue(‚Faun‘, 2)
#2 {main}
thrown
Error in Script C:\IP-Symcon\scripts\PHPSonos.inc.php on Line 2311