Napster Album Cover bei Sonos

Hallo alle zusammen,

ich zeige in IPS die Cover der Lieder die auf dem Sonos Player laufen an.
Da funktioniert soweit auch ganz gut.

Die Ausnahme ist Napster. Hat das schon jemand gemacht?

Für Unterstützung besten Dank.

Bis dann

Martin

Moin… läuft bei mir!! Müsste aber den String minimal Ändern!!

Ich schau mal bei mir nach und poste es dann hier!! Komme gerade nicht an meinen Rechner!!

Funzt aber ohnebProbleme! Nur die Größe des Covers ist über Napster recht bescheiden!!!

Gruß,

Peter

Ach Peter, Du bis ne bütz!!! :slight_smile:

Moin Martin,

ich muss erstmal Fragen wie Du die Cover URL abfragst!? Machst Du das über Sonosweb und einem Textparser oder über dieses Script hier aus dem Forum?

<?

 include("PHPSonos.inc.php");

$sonos = new PHPSonos("192.168.2.15"); //Sonos ZP IPAdresse

//$sonos->Stop();
$volume = $sonos->GetVolume(); // gibt die Lautstärke als Integer zurück
$mute = $sonos->GetMute(); // gibt ein bool zurück: TRUE -> MUTE an, FALSE -> MUTE aus
$shuffleRepeat = $sonos->GetTransportSettings(); // gibt ein Array zurück mit den keys "shuffle" und "repeat", welche jewils bool-Werte enthalten
$status = $sonos->GetTransportInfo(); // gibt den aktuellen Status des Sonos-Players als Integer zurück, 1: PLAYING, 2: PAUSED, 3: STOPPED
$posInfo = $sonos->GetPositionInfo(); // gibt ein Array mit den Informationen zum aktuellen Titel zurück (Keys: position, duration, artist, title, album, albumArtist, albumTrackNumber)

$title = $posInfo["title"];
$title = str_replace("ü","ü",  $title);


//SetValueInteger(51823 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Volume]*/, $volume);
SetValueBoolean(43545 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Mute]*/, $mute);
SetValueInteger(23293 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Status]*/, $status);
SetValueBoolean(55616 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Repeat]*/, $shuffleRepeat["repeat"]);
SetValueBoolean(34260 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Shuffle]*/, $shuffleRepeat["shuffle"]);
SetValueString(12857 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Titel]*/, $title); //$posInfo["title"]
SetValueString(38745 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Interpret]*/, $posInfo["artist"]);
SetValueString(11438 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Album]*/, $posInfo["album"]);
SetValueString(43037 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Position]*/, $posInfo["position"] . "/" . $posInfo["duration"]);
//SetValueString(57873 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Album URL]*/, $posInfo["albumArtURI"]);
SetValueString(12638 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Tracknumber]*/, $posInfo["albumTrackNumber"]);
//print_r ($posInfo);
SetValueString(36728 /*[.Allgemeines\Audio/Video\Sonos\Infomation\Volume String]*/, "$volume");
?>

Solltest Du es mit dem Script machen müßte es eigentlich ohne Probleme und änderung funktionieren. Ich benutze den String 1 zu 1 um mir das Cover im Dashboard anzeigen zu lassen.

Bei Sonosweb musste ich damals den String ein wenig ändern, weil der unterschiedlich war ob Local auf meiner Festplatte oder eben von Napster oder Lastfm etc. War aber minimal der Unterschied!!

Hier ist mal ein Napster Cover String:

http://192.168.2.15:1400/getaa?s=1&u=x-sonos-mms:track%3a34243206%3fsid%3d0%26flags%3d32

Hier einer auf meinem NAS:

http://192.168.2.15:1400/getaa?u=x-file-cifs://HPMEDIAVAULT/Music/Hip-Hop,%20Rap,%20Raggae%20and%20Dub/Fischmob/Power%20(1998)/Fischmob%20-%2002%20-%20Susanne%20zur%20Freiheit%20(feat.%20Stieber%20Twins,%20Dendemann,%20Michi%20Hausmarke%20Beck%20und%20Smudo).mp3&v=525

Beide von dem Script oben bekommen!!

Hoffe ich konnte bissel helfen!?

Hallo Peter,

ich nutze die gleiche Sonos-Klasse und auch das gleiche Script.
Ich hatte das Problem das ich bei z.B. Last.fm den URI String zerlegen muss um an das Bild zu kommen. Des weiteren musste ich dann noch unterscheiden ob das Bild .png oder .jpg ist. Das klappt aber soweit.
Ich kopiere die Bilder aus dem Internet nach media/Cover_Wohnen.png oder jpg.
Dieser Bilder zeige ich dann im Dash an.

Lustiger weise klappt das laden des Covers von Napster mit dem kompletten Cover URI von Sonsos.

Besten Dank für den Tipp.

Ich habe nur noch eine Frage:

Womit zeigst Du alles im Dash an?

Für die Cover von Last.fm habe ich zwei Image-Controls.
Eins fürs .png und eins fürs .jpg. Die liegen übereinander und werden jeweils über eine Bit-Variable sichtbar gemacht.

Besten Dank bis hier.

Moin Martin,
da hast aber mal was geschrieben!! Ich musste eben mal Feststellen das LastFm Cover nicht angezeigt werden. Hab dann mal den String gecheckt und
auch gefunden woran es liegt. Hmm… hab irgendwie noch nie auf mein Dashboard geschaut beim Abspielen von LastFm!!! :slight_smile:

Hab unten mal ein Screenshot meines SONOS-Dashboards angehängt. Sieht nicht sehr prall aus, wollte es immer überarbeiten, kam aber bis heute nicht dazu. Icons für Mute, Repeat und Shuffle werden eingeblendet wenn aktiv!!
Stecken gerade im Umbau/Ausbau einer neuen Wohnung und da ist gerade schwer Elektrik und Gimmik-Planung angesagt.

Wenn Du noch Fragen oder ein guten Tip für mich hast nur raus damit!!

Hoffe Sonos wird hier bald mal direkt von IPS ünterstützt!!! Das wäre was!!!

Grüß,

Peter

Hallo Peter,

ich bin schon etwas weiter gekommen.
Hauptprobleme waren bzw. sind:

  1. Wenn die URI einen Dateinamen enthält muss der String zerlegt werden -> das war bereits gelöst.

  2. Wenn die URI keinen Dateinamen enthält braucht der String nicht zerlegt werden. -> ist gelöst

  3. Die Cover können das Format .png oder .jpg haben. -> Ich wandel alle Cover in das .jpg Format -> ist gelöst

  4. Die Cover haben alle unterschiedliche Größe. Für eine einheitliche Größe muss man einen „Resize“ durchführen. -> teilweise gelöst.

Der Resize klappt jedoch geht die Farbe flöten. Vielleicht hat noch jemand eine Idee warum.

Wenn dieses letzte Problem gelöst ist kann man daraus mal eine Funktion machen.

Ich kann nicht glauben das wir die einzigen sind, die das Problem mit den Covern haben.

Hier nun was ich bis jetzt habe:


// Berechnung der abgelaufenen Sekunden des aktuellen Tittels
$arrTrackPosition = explode(":",$posInfo["position"]);
$TrackPositionSec = ($arrTrackPosition[0] * 3600) + ($arrTrackPosition[1] * 60) + $arrTrackPosition[2];

// nur wenn es ein Albumcover gibt wird am Anfang das Cover aus dem Internet geladen
if ($posInfo["albumArtURI"] != "")
{
	// Auslösen der extension "png" oder "jpg"
	$ImageEx = substr ($posInfo["albumArtURI"], -3 );

	if ($ImageEx == "png" or $ImageEx == "jpg")
	{
		// Bei der URI des Albumcovers wird die Adresse des Players mitgesendet.
		// das Trennzeichen für die Playeradresse und die Coveradresse ist ":1400"
		$CoverURI_arr = explode(":1400", $posInfo["albumArtURI"]);
		// Die Adresse des Covers ist im zweiten Arrayelement also "1"
		$remoteImage = $CoverURI_arr[1];
		// zusammenstellen des lokalen Dateinamens
		$localImage = IPS_GetKernelDir()."\\media\\Album_cover_Wohnen.".$ImageEx;
	}
	else
	{
      $remoteImage = $posInfo["albumArtURI"];
		// zusammenstellen des lokalen Dateinamens
		$localImage = IPS_GetKernelDir()."\\media\\Album_cover_Wohnen.jpg";
	}

	if ($TrackPositionSec >= 6 and $TrackPositionSec <= 10)
	{
		// Bild Downloaden
		$content = @file_get_contents($remoteImage);
		if((strpos($http_response_header[0], "200") === false)) {
			 return;
		}
		file_put_contents( $localImage, $content );

		if($ImageEx == "png")
		{
         $image = ImageCreateFromPNG($localImage);
			ImageJPEG($image, IPS_GetKernelDir()."\\media\\Album_cover_Wohnen.jpg");
		}

      resize_image(IPS_GetKernelDir()."\\media\\Album_cover_Wohnen.jpg", 174, 174);
     	SetValueBoolean($id_Visible_jpg, true);
	}
}
else
{
	SetValueBoolean($id_Visible_jpg, false);
}

//---------------------- Main Ende ----------------------------

function resize_image($image,$max_width,$max_height)
{

	//First of all..grab some image infos
	$picinfos=getimagesize($image);

	//When the old size is the same like the new size do nothing
	if ($picinfos[0] <> $max_width)
	{
		//Create an new image from the old one
		$oldpic=ImageCreateFromJPEG($image);

		//Check which site is bigger, and calculate the factor to resize
		if($picinfos[0]>$picinfos[1])
		{
		   $fator=$max_width / $picinfos[0];
	   }
		else
		{
		    $factor=$max_height / $picinfos[1];
		}

		//calculate new sizes
		$new_width=$picinfos[0] * $factor;
		$new_height=$picinfos[1] * $factor;

		//Create an new blank image with new sizes
		$newpic=imagecreate($new_width,$new_height);

		//Copy resized old pic into new pic
		ImageCopyResized($newpic,$oldpic,0,0,0,0,$new_width,$new_height,$picinfos[0],$picinfos[1]);

		//Save the resized image
		ImageJPEG($newpic,$image);

	}
}


Wenn keine URI mitkommt schalte ich das Image unsichtbar.
Die Funktion für den Resize habe ich aus den unendlichen Welten des Internets.

Man soll sich ja nicht mit fremden Federn schmücken. :wink:

Die Funktion aus den Weiten des WWW scheint älter zu sein, denn sie benutzt imagecreate, weshalb das Bild keinen ausreichend großen Farbraum hat. Mit imagecreatetruecolor sollte das Problem gelöst sein.

Das war‘s. Horst, ich hab Dich lieb. :):slight_smile:

Ich werde dann in Kürze die Funktion hier einstellen.

Nochmals besten Dank.

Hallo alle zusammen, Hallo Peter,

ich habe die Funktion fertig.

Übergeben wird die URI von Sonos und der Dateiname mit kompletten Pfad.
Die Funktion braucht einen Zwischenspeicher der bei jedem Aufruf gelöscht wird.
Der Name dieser Datei ist „Cover_Stack…“

Als erstes die Funktion:


function Get_Sonos_Cover($URI,$filename)
			{
			
			//Wenn die URI leer ist wird das Script nicht ausgeführt
			if ($URI == "")
			{
				return;
			}

			// Zwischenspeicher für das Cover "png"
			$Cover_Stack_png = IPS_GetKernelDir()."\\media\\Cover_Stack.png";

			// Wenn die Datei schon vorhanden ist dann löschen
			if(file_exists($Cover_Stack_png))
			{
				unlink  ($Cover_Stack_png);
			}

			// Zwischenspeicher für das Cover "jpg"
			$Cover_Stack_jpg = IPS_GetKernelDir()."\\media\\Cover_Stack.jpg";

			// Wenn die Datei schon vorhanden ist dann löschen
			if(file_exists($Cover_Stack_jpg))
			{
				unlink  ($Cover_Stack_jpg);
			}

			// Auslösen der Extension "png" oder "jpg"
			$ImageEx = substr ($URI, -3 );

			// Hat die URI einen Dateinamen muss die Adresse zerlegt werden
			// sonst nicht
			if ($ImageEx == "png" or $ImageEx == "jpg")
			{
				// Bei der URI des Albumcovers wird die Adresse des Players mitgesendet.
				// das Trennzeichen für die Playeradresse und die Coveradresse ist ":1400"
				$CoverURI_arr = explode(":1400", $URI);
				// Die Adresse des Covers ist im zweiten Arrayelement also "1"
				$remoteImage = $CoverURI_arr[1];
				// zusammenstellen des lokalen Dateinamens
				$localImage = IPS_GetKernelDir()."\\media\\Cover_Stack.".$ImageEx;
			}
			else
			{
		      $remoteImage = $URI;
				// zusammenstellen des lokalen Dateinamens
				$localImage = $Cover_Stack_jpg;
			}

			// Bild Downloaden
			$content = @file_get_contents($remoteImage);
			if((strpos($http_response_header[0], "200") === false))
			{
				 return;
			}
			file_put_contents( $localImage, $content );

			// Informationen des geladenen Covers lesen
			$picinfos=getimagesize($localImage);

			// Einlesen des Covers als Image
			if($ImageEx == "png")
			{
	      	$oldpic = ImageCreateFromPNG($localImage);
			}
			else
			{
	      	$oldpic = ImageCreateFromJPEG($localImage);
			}
			
			// Wenn das Cover bereits eine Grösse von 174 hat -> kein Resize
			if ($picinfos[0] <> 174)
			{
			
				// Erzeuge ein neues Image von 174 x 174
				$newpic=imagecreatetruecolor(174, 174);

				// Resize das Image
				ImageCopyResized($newpic,$oldpic,0,0,0,0,174,174,$picinfos[0],$picinfos[1]);

				// Und ablegen
				ImageJPEG($newpic, $filename);
			}
			else
			{
				// Und ablegen
				ImageJPEG($oldpic, $filename);
			}
			}

Die Einbindung ist dann so:


$URI = GetValueString($id_URI);
$filename = IPS_GetKernelDir()."\\media\\Album_cover_Wohnen.jpg";
Get_Sonos_Cover($URI,$filename);

Die Covergrösse liegt fest auf 174x174.

Hallo alle zusammen,

ich hab die Funktion nochmal überarbeitet.

Neu:

  1. Wenn die URI von Sonos leer ist, wird ein Leercover erzeugt.
  2. An der Funktion kann die Grösse des Covers angegeben werden.

Hier die Funktion:


function getSonosCover($URI, $filename, $CoverSize)
{
/*=============================================
getSonosCover - Martin Heinzel - 19.11.2010
Version: 1.0

Beschreibung:
Mit dieser Funktion wird ein Cover mit Hilfe der von Sonos gelieferten URI
geladen und normiert auf jpg mit der in $CoverSize angegebenen Größe.
Das Cover wird dann unter "$filename" abgelegt.


Änderungen
----------

tt.mm.yyyy von Version x.x -> x.x

Berschreibung:

================================================*/

//--------------------------- Main ----------------------------

//Wenn die URI leer ist wird ein leeres Cover erzeugt
if ($URI == "")
{
	$im 				= ImageCreate($CoverSize, $CoverSize);
	$back_color 	= ImageColorAllocate($im, 200, 255, 255);
	$black 			= ImageColorAllocate($im, 0  , 0  , 0  );
	$end_xy        = $CoverSize -10;
	ImageRectangle($im, 10, 10, $end_xy, $end_xy, $black);
	ImageString($im, 3, 20, 80, "kein Cover verfügbar", $black);
	Header('Content-Type: image/jpeg');
	ImageJPEG($im, $filename);
	return;
}

// Zwischenspeicher für das Cover "png"
$Cover_Stack_png = IPS_GetKernelDir()."\\media\\Cover_Stack.png";

// Wenn die Datei schon vorhanden ist dann löschen
if(file_exists($Cover_Stack_png))
{
	unlink  ($Cover_Stack_png);
}

// Zwischenspeicher für das Cover "jpg"
$Cover_Stack_jpg = IPS_GetKernelDir()."\\media\\Cover_Stack.jpg";

// Wenn die Datei schon vorhanden ist dann löschen
if(file_exists($Cover_Stack_jpg))
{
	unlink  ($Cover_Stack_jpg);
}

// Auslösen der Extension "png" oder "jpg"
$ImageEx = substr ($URI, -3 );

// Hat die URI einen Dateinamen muss die Adresse zerlegt werden
// sonst nicht
if ($ImageEx == "png" or $ImageEx == "jpg")
{
	// Bei der URI des Albumcovers wird die Adresse des Players mitgesendet.
	// das Trennzeichen für die Playeradresse und die Coveradresse ist ":1400"
	$CoverURI_arr = explode(":1400", $URI);
	// Die Adresse des Covers ist im zweiten Arrayelement also "1"
	$remoteImage = $CoverURI_arr[1];
	// zusammenstellen des lokalen Dateinamens
	$localImage = IPS_GetKernelDir()."\\media\\Cover_Stack.".$ImageEx;
}
else
{
	$remoteImage = $URI;
	// zusammenstellen des lokalen Dateinamens
	$localImage = $Cover_Stack_jpg;
}

// Bild Downloaden
$content = @file_get_contents($remoteImage);
if((strpos($http_response_header[0], "200") === false))
{
	 return;
}
file_put_contents( $localImage, $content );

// Informationen des geladenen Covers lesen
$picinfos=getimagesize($localImage);

// Einlesen des Covers als Image
if($ImageEx == "png")
{
	$oldpic = ImageCreateFromPNG($localImage);
}
else
{
	$oldpic = ImageCreateFromJPEG($localImage);
}

// Wenn das Cover bereits die passende Grösse hat -> kein Resize
if ($picinfos[0] <> $CoverSize)
{

	// Erzeuge ein neues Image von 174 x 174
	$newpic=imagecreatetruecolor($CoverSize, $CoverSize);

	// Resize das Image
	ImageCopyResized($newpic,$oldpic,0,0,0,0,$CoverSize,$CoverSize,$picinfos[0],$picinfos[1]);

	// Und ablegen
	ImageJPEG($newpic, $filename);
}
else
{
	// Und ablegen
	ImageJPEG($oldpic, $filename);
}

//----------------------- Main ENDE ----------------------------

}


Einbinden der Funktion:



$id_URI 		= 47568 /*[.Sound\.Sonos_Wohnen\CoverURI_Sonos_Wohnen]*/;
$URI 			= GetValueString($id_URI);
$filename 	= IPS_GetKernelDir()."\\media\\Album_cover_Wohnen.jpg";
$CoverSize 	= 174;

getSonosCover($URI, $filename, $CoverSize)


Ich nehme immer als Grösse die 174.
Das ist das Format von „last.fm“.
„Deezer“ ist grösser, „Napster“ ist kleiner.