SQUEEZEBOX - Mediawiedergabe von IPS steuern

Hallo nancilla,

das mit den Befehlen ist schon klar, war auch mit euren guten Beispielen kein Problem.
Die CLI-Befehle hatte ich schon mal durchgeschaut.

Könnte man denn nicht einen Stream von der Soundkarte umleiten auf die Box?
Machen die Radiosender doch auch so, oder?
Ich habe eigentlich was dagegen, erst immer in eine Datei schreiben zu müssen und diese anschließend wieder zu öffnen.
Geht das nicht anders?

Keiner eine Ahnung, wie ich den letzten Teil aus dem String entfernen kann. Ich habe bei den PHP-Befehlen irgendwie nicht das passende gefunden …

Grüße,
Doc

hier ist das dabei was Du suchst.

PHP: String-Funktionen - Manual

Probier mal das:

<?
$string = 'Die heilige Kuh von Barbados 13'; // Beispiel
$zeichen = preg_split('/ /', $string, -1, PREG_SPLIT_OFFSET_CAPTURE); // String in Array zerlegen
$strbis = (($zeichen[(count($zeichen) - 1)][1])-1); // Array auflösen - Teil ab letztem Leerzeichen abschneiden
echo substr($string, 0, $strbis ); // Neuen String wiedergeben
?>

Sind bei dir die Titel generell mit der Tracknummer im Namen abgespeichert, oder hast du das am Squeezeserver so eingestellt?
Die Titelanzeige wird so dargestellt, wie die Vorgaben vom Squeezeserver sind!

Habe da nichts gefunden, was mal da beim SqueezeCenter einstellen könnte, vllt. bin ich aber auch zu blind :confused:

Wenn ich mit „listen1“ die Ausgabe aktiviert habe bekomme ich beim Wechsel eines Titels folgen Info gesendet:

00:04:20:1e:xx:xx playlist newsong Love How You Love Me 11

Wie kann man das einstellen, das die „11“ nicht gesendet wird?

Habe das jetze aber so gemacht, nach dem Hinweis von Rainer


$Wert1 = substr($String, 0, strrpos($String, " "));
$Wert2 = substr(strrchr($String, " "),1);

Grüße,
Doc

Ich weiss ja nicht, was ihr vorhabt aber um das letzte abzuschneiden reicht auch das hier. :slight_smile:

$string = 'Die heilige Kuh von Barbados 13'; // Beispiel
echo substr($string, 0, -2);

@Rainer

Das reicht aber nicht, um z.B. Titelnummer 101 abzuschneiden.
Ich habe solche Alben :wink:
Deshalb hatte ich mir die Mühe gemacht mit „preg_split“.

@Doc
Ich meinte eigentlich unter
>Einstellungen
>Player
>Grundeinstellungen
>Titelformat

Ungetestet!

Ja Rainer,

wenn das so einfach wäre, hätte ich das selber gemacht :smiley:

Nee mal im Ernst, ich habe das jetzt so gelöst, das funktioniert wunderbar so.


$Titel = substr($val, 0, strrpos($val, " "));
$PlayListItem = (Int)substr(strrchr($val, " "),1) + 1;
SetValue(27231 /*[Programme\Squeezebox\NowPlaying]*/, $Titel);
SetValue(16325 /*[Programme\Squeezebox\PlayListItem]*/, $PlayListItem);

@nancilla

da kann man glaube ich nur die Ausgabe auf dem Display mit beeinflussen, nicht aber das CLI.

Hat den schon jemand das mit der Abfrage der Titel/ Interpret/ Album usw. gelöst?
Das CLI biete ja noch viele Möglichkeiten, aber um die Auswertung hierfür ist es hier sehr ruhig geworden.

Mir geht das mit dem Streamen vom TTS auf die Box einfach nicht aus dem Kopf, das muss sich doch irgendwie realisieren lassen :confused:

Grüße,
Doc

Also wenn ich den aktuellen Titel abfrage, dann steht bei mir keine Ziffer hinter dem Titelname seidenn es ist Teil vom Titelname:

CSCK_SendText($sqc, $no1box.' title ?'.chr(13));                  			  
IPS_Sleep(65);
$result = rawurldecode(GetValue($regvar));
echo $result;

Ergibt z.B:
XX:XX:XX:XX:XX:XX title Let The Beat Control Your Body

Du hast das bestimmt mit im MP3-Tag gespeichert.

CSCK_SendText($sqc, $no2box.' artist ?'.chr(13));
IPS_Sleep(65);
$result = rawurldecode(GetValue($regvar));
echo $result;

XX:XX:XX:XX:XX:XX artist 2 Unlimited

Die passenden Abfragen sind übrigens:

<playerid> genre ?
<playerid> artist ?
<playerid> album ?
<playerid> title ?
<playerid> duration ?
<playerid> remote ?
<playerid> current_title ?
<playerid> path ?

Nee, nee, das ist exakt die Tracknummer in der Playliste.
Ich habe die jetzt abgeschnitten und nutze die auch weiter zur Anzeige.

Das Script ist übrigens das Originalscript von tinu, wo das auftritt.

Mit dem Scripten für die weiteren Abfragen wie du es verwendest habe ich so meine Bedenken, wenn der Server mal zu träge reagiert, deshalb die Nachfrage nach weiteren Scripten.

Grüße,
Doc

Du hast Recht. Wenn man nur mit „listen“ über die RegVar lauscht, dann steht die Tracknummer hinter dem Tracktitel.
Dann bleibt wohl nix anderes, als abzuschneiden.

Da hatte ich dich wohl die letzen Beiträge falsch verstanden. Jetzt verstehe ich deine Vorgehensweise.
Für meinen Verwendungszweck spielte das bisher keine Rolle.

Habe mal noch etwas gebastelt:

function strstr_after($haystack, $needle, $case_insensitive = false) {
    $strpos = ($case_insensitive) ? 'stripos' : 'strpos';
    $pos = $strpos($haystack, $needle);
    if (is_int($pos)) {
        return substr($haystack, $pos + strlen($needle));
    }
    return $pos;
}


	$result = rawurldecode(GetValue($regvar)); // Abfrage Registervariable
if (strstr_after($result, 'playlist newsong '))
{
	$result = rawurldecode($result);
	$result = strstr_after($result, 'playlist newsong ');
	$zeichen = preg_split('/ /', $result, -1, PREG_SPLIT_OFFSET_CAPTURE); // String in Array zerlegen
	$strbis = (($zeichen[(count($zeichen) - 1)][1])-1); // Array auflösen - Teil ab letztem Leerzeichen abschneiden
	$result = substr($result, 0, $strbis );
	$result = explode(" - ", $result);
	SetValueString(52190  /*[Test\Test-String]*/, $result[0]);  // Titel
	SetValueString(50382  /*[Test\Test-String2]*/, $result[1]); // Artist
	SetValueString(53869  /*[Test\Test-String3]*/, $result[2]); // Album
}

function habe ich bei php.net gefunden.
Triggern über die RegVar.
Titelformat an der Box über Squeezbox-Server muss dabei auf „TITLE - ARTIST - ALBUM“ stehen, oder eben entsprechend anpassen.

Hallo nancilla,

bei den ganzen Stringfunktionen blickt man ja gar nicht mehr durch, was da geschieht.

Ich habe/werde das jetzt so lösen, wie ich das oben schon gepostet habe.
Das modifizierte Script von tinu lauscht ständig in die RegVar vom Server und Filter die Basisinformationen wie Titel, Trackliste und Boxstatus heraus.

Wenn sich die Position in der Trackliste ändert, werde ich ein weiteres Script triggern, welches dann alle weiteren Infos einzeln abfragt, wie Album, Spieldauer usw.

Mal schauen, ob das so funktioniert.

Grüße,
Doc

Also ich muss ja sagen, ich bin echt begeistert von der Squeezebox.

Ich werde mal schauen, ob man die in den USA nicht vielleicht etwas günstiger bekommen kann.

Evtl. aber nochmal eine Frage an Squeezebox erprobten unter euch.

Wie kann ich es einstellen, das die Box oder der Server die Titel einer Playlist nicht alphabetisch, sondern nach den Tracknummern des ID3 sortiert.

Bei den Musikalben war mir das bis jetzt ja egal in welcher Reihenfolge das abgespielt wurde, bei den Hörspielen ist das mit der Reihenfolge aber so eine Sache.

Ich will jetzt auch nicht unbedingt den Filenamen von allen umbenennen, nur damit die Reihenfolge auf der Squeezebox stimmt.

Es gibt im Server zwar die Möglichkeit das Titelfomat einzustellen, aber an der Reihenfolge der Titel ändert das trotzdem nicht.

Jemand eine Idee?

Viele Grüße,
Doc

Ich habe jetzt mal 2 kleine Scripte gebastelt, um die Steuerung und das Auslesen der Squeezeboxen zu erleichtern, um evtl. das ganze über vorhandene eDips zu realisieren.

Damit können sowohl die Daten zu den abgespielten Titel angezeigt werden, als auch die Box über Tasten des eDips ferngesteuert werden, wobei das Menu (Display der Box) dann auch wiederum in den eDips angezeigt werden kann, um das Navigieren aus der Ferne zu vereinfachen.

Ist nichts wirklich neues, aber vielleicht kann es jemand gebrauchen.

Script zum Abfragen von Informationen:


<?
// Abfragescript Box Schlafzimmer
// Trigger PlayListItem auf update

include("44008.ips.php"); //Configscript der Boxen

$MAC = $MAC_Box1;
//IPS_Sleep(500);

// Album abfragen
CSCK_SendText($ID_sqc, $MAC.' album ?'.chr(13));
IPS_Sleep(200);
$result = rawurldecode(GetValue($ID_RegVar_StringVar));
if (substr_count($result, $MAC) == 1) { //prüfen ob richtige MAC
	SetValue(54819 /*[Programme\Squeezebox\Squeezebox Schlafzimmer\Album]*/, vokal(str_replace('album ', '', strstr($result, 'album '))));
}

// Titel abfragen
CSCK_SendText($ID_sqc, $MAC.' title ?'.chr(13));
IPS_Sleep(70);
$result = rawurldecode(GetValue($ID_RegVar_StringVar));
if (substr_count($result, $MAC) == 1) { //prüfen ob richtige MAC
	SetValue(27231, vokal(str_replace('title ', '', strstr($result, 'title '))));
}

// Artist abfragen
CSCK_SendText($ID_sqc, $MAC.' artist ?'.chr(13));
IPS_Sleep(70);
$result = rawurldecode(GetValue($ID_RegVar_StringVar));
if (substr_count($result, $MAC) == 1) { //prüfen ob richtige MAC
	SetValue(50103 /*[Programme\Squeezebox\Squeezebox Schlafzimmer\Artist]*/, vokal(str_replace('artist ', '', strstr($result, 'artist '))));
}

// Genre abfragen
CSCK_SendText($ID_sqc, $MAC.' genre ?'.chr(13));
IPS_Sleep(70);
$result = rawurldecode(GetValue($ID_RegVar_StringVar));
if (substr_count($result, $MAC) == 1) { //prüfen ob richtige MAC
	SetValue(27838 /*[Programme\Squeezebox\Squeezebox Schlafzimmer\Genre]*/, vokal(str_replace('genre ', '', strstr($result, 'genre '))));
}

// Duration abfragen
CSCK_SendText($ID_sqc, $MAC.' duration ?'.chr(13));
IPS_Sleep(70);
$result = rawurldecode(GetValue($ID_RegVar_StringVar));
if (substr_count($result, $MAC) == 1) { //prüfen ob richtige MAC
	$Duration = str_replace('duration ', '', strstr($result, 'duration '));
	$Duration = date("i:s", $Duration);
	SetValue(16344 /*[Programme\Squeezebox\Squeezebox Schlafzimmer\Duration]*/, $Duration);
}

// Anzahl Playlist Tracks abfragen
CSCK_SendText($ID_sqc, $MAC.' playlist tracks ?'.chr(13));
IPS_Sleep(70);
$result = rawurldecode(GetValue($ID_RegVar_StringVar));
if (substr_count($result, $MAC) == 1) { //prüfen ob richtige MAC
	SetValue(57576 /*[Programme\Squeezebox\Squeezebox Schlafzimmer\PlayListTracks]*/, str_replace('playlist tracks ', '', strstr($result, 'playlist tracks ')));
}

// -----------------------------------------------------------------------------------
function vokal($text) {

	$text = str_replace("Ä","Ä",$text); // Sonderzeicher definieren
	$text = str_replace("ä","ä",$text);
	$text = str_replace("Ö","Ö",$text);
	$text = str_replace("ö","ö",$text);
	$text = str_replace("%F6","ö",$text);
	$text = str_replace("%FC","ü",$text);
	$text = str_replace("Ãœ","Ü",$text);
	$text = str_replace("ü","ü",$text);
	$text = str_replace("ß","ß",$text);

return $text;
}

?>

… und zum steuern mit Rückgabe der Displayinformationen (trigger Stringvariable):


<?
include("44008.ips.php"); //Configscript der Boxen
$MAC = $MAC_Box1;

$Data = $IPS_VALUE;

// Daten extrahieren
$Data = explode("|", $Data);
$action = $Data[0];
$cmd1 = $Data[1];
$cmd2 = $Data[2];
$cmd3 = $Data[3];

switch ($action)
{
// Power|on/off
	case "Power";
	   {
	   if ($cmd1 == 'off')
			{
	      CSCK_SendText($ID_sqc, $MAC.' power 0 '.chr(13));
      	}
	   if ($cmd1 == "on")
			{
	      CSCK_SendText($ID_sqc, $MAC.' power 1 '.chr(13));
      	}
	   }
		break;

// Button|play,stop,pause,power,left,right,up,down,knop,ref,fwd,home,volup,voldown,preset1..6
	case "Button";
	   {
		If ($cmd1 == "play") CSCK_SendText($ID_sqc, $MAC.' button play.single'.chr(13));
		If ($cmd1 == "stop") CSCK_SendText($ID_sqc, $MAC.' button stop'.chr(13));
		If ($cmd1 == "pause") CSCK_SendText($ID_sqc, $MAC.' button pause.single'.chr(13));
		If ($cmd1 == "power") CSCK_SendText($ID_sqc, $MAC.' button power'.chr(13));
		If ($cmd1 == "left") CSCK_SendText($ID_sqc, $MAC.' button arrow_left'.chr(13));
		If ($cmd1 == "right") CSCK_SendText($ID_sqc, $MAC.' button arrow_right'.chr(13));
		If ($cmd1 == "up") CSCK_SendText($ID_sqc, $MAC.' button arrow_up'.chr(13));
		If ($cmd1 == "down") CSCK_SendText($ID_sqc, $MAC.' button arrow_down'.chr(13));
		If ($cmd1 == "knop") CSCK_SendText($ID_sqc, $MAC.' button knop_push'.chr(13));
		If ($cmd1 == "rev") CSCK_SendText($ID_sqc, $MAC.' button rew.single'.chr(13));
		If ($cmd1 == "fwd") CSCK_SendText($ID_sqc, $MAC.' button fwd.single'.chr(13));
		If ($cmd1 == "home") CSCK_SendText($ID_sqc, $MAC.' button home'.chr(13));
		If ($cmd1 == "volup") CSCK_SendText($ID_sqc, $MAC.' button volup'.chr(13));
		If ($cmd1 == "voldown") CSCK_SendText($ID_sqc, $MAC.' button voldown'.chr(13));
		If ($cmd1 == "preset1") CSCK_SendText($ID_sqc, $MAC.' button preset_1.single'.chr(13));
		If ($cmd1 == "preset2") CSCK_SendText($ID_sqc, $MAC.' button preset_2.single'.chr(13));
		If ($cmd1 == "preset3") CSCK_SendText($ID_sqc, $MAC.' button preset_3.single'.chr(13));
		If ($cmd1 == "preset4") CSCK_SendText($ID_sqc, $MAC.' button preset_4.single'.chr(13));
		If ($cmd1 == "preset5") CSCK_SendText($ID_sqc, $MAC.' button preset_5.single'.chr(13));
		If ($cmd1 == "preset6") CSCK_SendText($ID_sqc, $MAC.' button preset_6.single'.chr(13));
	   }
		break;

// Volume|0..100
	case "Volume";
	   {
		CSCK_SendText($ID_sqc, $MAC.' mixer volume '.$cmd1.chr(13));
	   }
		break;

// Sleep|xx sec.
	case "Sleep";
	   {
		CSCK_SendText($ID_sqc, $MAC.' sleep '.$cmd1.chr(13));
	   }
		break;
		
// Display|line1|line2|time(s)
	case "Display";
	   {
		CSCK_SendText($ID_sqc, $MAC." display ".rawurlencode($cmd1)." ".rawurlencode($cmd2)." ".$cmd3.chr(13));
	   }
		break;

// Webradio|URL
	case "Webradio";
	   {
      CSCK_SendText($ID_sqc, $MAC.' playlist play '.rawurlencode($cmd1).chr(13));
	   }
		break;
}

// Display Daten auswerten
CSCK_SendText($ID_sqc, $MAC.' display ? ?'.chr(13));

for ($i=0; $i<200; $i++) {  // max. 2 Sekunden (200 x 10ms) auf Displaydaten warten
    IPS_Sleep(10);
      $string = GetValue($ID_RegVar_StringVar);
      $data = explode(" ", $string);

   	if ((substr_count(rawurldecode($data[0]), $MAC) == 1) and ($data[1] == 'display')) { // prüfen ob Displaydaten und richtige MAC
        $line1 = rawurldecode($data[2]);
		  $line2 = rawurldecode($data[3]);

		  SetValue(42364 /*[Programme\Squeezebox\Squeezebox Schlafzimmer\Squeezebox Steuerung\Display Line1]*/, vokal($line1));
		  SetValue(53401 /*[Programme\Squeezebox\Squeezebox Schlafzimmer\Squeezebox Steuerung\Display Line2]*/, vokal($line2));

      break;
    }
}
// ---------------------------------------------
function vokal($text) {

	$text = str_replace("Ä","Ä",$text); // Sonderzeicher definieren
	$text = str_replace("ä","ä",$text);
	$text = str_replace("Ö","Ö",$text);
	$text = str_replace("ö","ö",$text);
	$text = str_replace("%F6","ö",$text);
	$text = str_replace("%FC","ü",$text);
	$text = str_replace("Ãœ","Ü",$text);
	$text = str_replace("ü","ü",$text);
	$text = str_replace("ß","ß",$text);

return $text;
}
?>

hab es ins aktuelle Forum gehängt.

Hallo Gemeinde :),

Ich hab nun auch ein Squeezbox Radio,

Ich versuche das gerade über IPS einzubinden.

Mein Bescheidener erster Versuch nachdem ich alle Beiträge (denke ich) hierzu gelesen habe.

<?

$box_mac = "00:04:20:27:c0:f6";

CSCK_SendText(41329 /*[Squeezboxserver]*/, $box_mac.' playlist play '.rawurlencode('http://streams.br-online.de/bayern3_2.asx').chr(13));

?>

Geht aber leider natürlich nicht :slight_smile:

Was ich noch nicht verstanden habe ist die „registervariable“…

Momentan habe ich nur einen Socket erstellt mit der IP Adresse vom SlimServer und dem Port 9090 (Socket wurde danach geöffnet)

Meine Adresse zum Server über eine Webseite ist übrigens „9000“…weiß nicht, ob das etwas damit zu tun hat…

Macadresse im Script habe ich natürlich angepaßt.

Vielleicht kann mir (schon wieder) einer von euch helfen ?

LG
Sascha

Hallo Sascha,

der Port 9090 ist schon korrekt, dass ist der Port für das CLI (Command Line Interface) um die Box via TELNET zu steuern.

Nun zu der ersten Frage. Zeigt Dir das Radio im Display was an wenn Du den Befehl absetzt? Sollte da „NICHTS“ stehen findet er den Sender bzw. die Playlist nicht.

Als erstes würde ich mal klein beginnen und schauen ob das Radio überhaupt reagiert.


<? 
 
$box_mac = "00:04:20:27:c0:f6"; 
 
CSCK_SendText(41329 /*[Squeezboxserver]*/, $box_mac.' power 1'.chr(13)); 
 
?> 

power 1 schaltet die Box ein und power 0 natürlich aus.

Sollte das auch schon nicht funktionieren dann fehlt es am Client-Socket.

Die Register-Variable brauchst Du erst später wenn Du die Meldungen die dir der Squeezeserver sendet auch im Webfront visualisieren möchtest.

Danke,

Das werde ich gleich probieren. Ich wollte gerade den Slimserver neu starten…leider hat er sich aufgehängt…da der server auf meine WHS läuft, will ich gerade noch warten, bis dieser seine Backups fertig gemacht hat, um den ganzen WHS neu zu starten (Slimserver reagiert nicht mehr).

„klein Anfangen“ Juhuu…du hast mich verstanden :slight_smile:

Momentan scheitert es leider noch an der verbindung zwischen dem SlimServer und dem Radio :frowning:

Ich hab das mit dem „MySqueez.com“ Account noch nicht ganz verstanden…

Anscheinend geht ja etweder nur das eine, oder das andere…

Ich google mir mal nen Wolf…

LG
Sascha

Wenn dein „heimischer“ SqueezeBoxServer down oder anweilig nicht erreichbar ist, dann gibts den Fallback auf den „Internetserver“.
Die Priorität lässt sich aber selbst nur an der jeweiligen Box einstellen.