Im heutigen Artikel möchte ich euch einen Weg vorstellen, wie man von die Squeezebox vom Rechner aus steuern kann, ohne dazu die Web-Oberfläche des Squeezebox-Servers zu benutzen. Der Wunsch dazu entstand bei mir, weil ich die Web-Oberfläche relativ träge finde (was vielleicht aber auch an geringer Leistung meines NAS liegen könnte). Mit einem “leichteren” Skin kann man das zwar etwas verbessern – ich benutze das Skin ClassicCB
– aber dennoch sollte es flotter gehen.
pysqueezecenter
Zunächst einmal geht es um ein Python-Modul namens pysqueezecenter, das den Zugriff auf das CLI (Command Line Interface) des Squeezebox-Servers ermöglicht bzw. erleichtert.
Damit das Modul ordentlich installiert werden kann, installiert man sich am besten zunächst noch easy_install. Einfach über Synaptic oder das Software-Center – das Paket heißt python-setuptools
– oder per:
sudo apt-get install python-setuptools
Als nächstes lädt man sich das Modul von der Download-Seite des Projekts herunter. Derzeit ist die Version 0.94 aktuell, so dass die heruntergeladene Datei pysqueezecenter-0.94.tar.gz
hieß.
Um die Installation dann durchzuführen, wechselt man in das Verzeichnis, in das man die Datei heruntergeladen hat und führt folgenden Befehl aus:
sudo easy_install pysqueezecenter-0.94.tar.gz
Damit wird das Modul in den Pfad von Python kopiert, so dass es ohne weitere Konfiguration in jedes Python-Skript importiert werden kann.
Squeezebox CLI aktivieren
Natürlich muss am Squeezebox-Server die Verwendung des CLI aktiviert werden. So weit ich mich erinnern kann, ist die Funktion per Default nicht aktiviert. Also auf der Weboberfläche des Squeezebox-Servers auf die Server-Einstellungen
wechseln und dort in den Bereich Befehlszeilenschnittstelle (CLI)
. Hier kann man dann die Portnummer eingeben, die man verwenden möchte. Default ist 9090
.
Nebenbei bemerkt:
Die Steuerung der Squeezebox ist auch per einfachem Telnet-Aufruf möglich, wie hier im Squeezebox-Wiki beschrieben ist. Welche Befehle ausgeführt werden können, ist in der Server-Dokumentation zu finden. Die Server-Dokumentation könnt ihr über folgende Adresse aufrufen (wobei ihr natürlich Host-Adresse und Portnummer durch euren Server ersetzen müsst):
http://squeezeserver:9002/html/docs/cli-api.html
Diese Dokumentation beschreibt aber eben den (vollen) Funktionsumfang der Squeezeboxserver-CLI und nicht den des Python-Moduls…
Basis-Steuerungsskript
Nun kann man munter los skripten und die Squeezebox beliebig steuern. Zumindest fast beliebig, denn ein paar Funktionen sind wohl im pysqueezecenter-Modul nicht umgesetzt. Als Dokumentation der Modul-API gibt es derzeit das Beispiel auf der Startseite des Projektes und zusätzlich eine API-Beschreibung im Dokumentationsbereich.
Für mich ging es darum, folgende Calls an die Squeezebox umzusetzen – und zwar so, dass ich die Aufruf praktischerweise in das Nautilus-Kontextmenü einbinden konnte:
- Einfügen bzw. Anhängen eines ganzen Albums an die aktuelle Playlist.
- Einfügen bzw. Anhängen eines einzelnen Titels an die aktuelle Playlist.
- Leeren der aktuellen Playlist.
- Starten/Stoppen/Pausieren des Players.
Dazu habe ich mir dieses Basisskript (/usr/local/bin/squeeze.py
genannt) gebastelt:
#!/usr/bin/python
import sys
from pysqueezecenter.server import Server
from pysqueezecenter.player import Player
server_host = 'myhost'
server_port = 9090
server_auth_username = 'myuser'
server_auth_passwd = 'mypass'
player_mac_addr = '01:02:03:04:05:06'
music_src_base = '/home/ich/Musik/'
music_dst_base = 'file:///volume1/Medien/Audio/Musik/'
fileargs = []
i = 0
for arg in sys.argv:
if i == 1:
action = arg
elif i != 0:
files = arg.splitlines()
fileargs.extend(files)
i += 1
filelist = []
if action == 'plinsert' or action == 'pladd':
for filearg in fileargs:
if filearg.startswith(music_src_base):
file = filearg.replace(music_src_base, '')
if file.find('/') >= 0:
filelist.append(music_dst_base + file)
sc = Server(hostname=server_host, port=server_port, username=server_auth_username, password=server_auth_passwd)
sc.connect()
sq = sc.get_player(player_mac_addr)
if action == 'plinsert':
for file in filelist:
sq.playlist_insert(file)
elif action == 'pladd':
for file in filelist:
sq.playlist_add(file)
elif action == 'plclear':
sq.playlist_clear()
elif action == 'start':
sq.play()
elif action == 'stop':
sq.stop()
elif action == 'pause':
sq.pause()
Wichtig ist folgende Voraussetzung, unter der ich dieses Skript gebaut habe:
Das gesamte Musik-Verzeichnis, auf das ich per Nautilus zugreife (oder z.B. auch mit Banshee) wird genau so auch vom Squeezebox-Server benutzt. Entweder wird also das selbe (!) Verzeichnis von beiden Seiten verwendet oder ihr synchronisiert das gesamte Musik-Verzeichnis auf beiden Seiten. Letzteres ist bei mir der Fall. Ich habe einmal das Musik-Verzeichnis auf meinem Ubuntu-Rechner und kopiere Neuerungen und Änderungen daran jeweils auf den NAS, auf dem der Squeezebox-Server läuft.
Damit das Skript richtig funktionieren kann, müsst ihr noch die Konfigurationsparameter anpassen:
- Anstatt
myhost
gebt ihr die Adresse des Squeezebox-Servers an.
- Ggfs. passt ihr den Port an – falls ihr nicht den
9090
benutzt.
- Anstatt
myuser
und mypass
gebt ihr euren Benutzernamen bzw. euer Kennwort für den Zugriff auf den Squeezebox-Server an. Ich habe den Kennwortschutz bei mir aktiv, weil ich den Squeezebox-Server auch aus dem Internet verfügbar machen wollte. Ob der CLI-Zugriff ohne Passwort funktioniert und wie das Skript dann umgebaut werden müsste, weiß ich nicht.
- Anstatt
01:02:03:04:05:06
gebt ihr die MAC-Adresse eurer Squeezebox an. Um die MAC-Adresse herauszubekommen, könnt wechselt in der Web-Oberfläche des Squeezebox-Servers auf die Player-Einstellungen
eures Players. Dort wird die MAC-Adresse angezeigt.
Disclaimer
An dieser Stelle sei auch noch einmal erwähnt, dass ich in der Python-Welt noch recht frisch bin und das eine oder andere sicher auch einfacher oder besser gelöst werden könnte.
Seht das Ganze bitte auch eher als Idee und weniger als 100%-iges Tool.
Ggfs. werde ich das Skript demnächst auch im Download-Bereich meines Blogs anbieten. Allerdings möchte ich es bis dahin noch etwas reifen lassen. Wer also sachdienliche Hinweise (zur Optimierung, Korrektur usw.) hat… einfach ein Kommentar schreiben oder das Kontakt-Formular benutzen.
Einbindung in Nautilus
Wie die Einbindung eigener Skripte in Nautilus funktioniert, habe ich vor Kurzem bereits in einem gesonderten Artikel beschrieben. Die folgenden Nautilus-Skripte habe ich zur Squeezebox-Steuerung bei mir eingebunden:
Das Skript für das Anfügen an die Playlist:
#!/bin/bash
/usr/local/bin/squeeze.py pladd "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
Das Skript für das Einfügen in die Playlist:
#!/bin/bash
/usr/local/bin/squeeze.py plinsert "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
Das Skript zum Leeren der Playlist:
#!/bin/bash
/usr/local/bin/squeeze.py plclear
Das Skript zum Starten des Players:
#!/bin/bash
/usr/local/bin/squeeze.py start
Das Skript zum Stoppen des Players:
#!/bin/bash
/usr/local/bin/squeeze.py stop
Das Skript zum Pausieren des Players:
#!/bin/bash
/usr/local/bin/squeeze.py pause
pssst, weitersagen!