mpdsync - Annähernde Synchronisation mehrerer MPD-Rechner

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
outis
Beiträge: 395
Registriert: 07.10.2005 12:28:01

mpdsync - Annähernde Synchronisation mehrerer MPD-Rechner

Beitrag von outis » 13.01.2014 23:04:38

Hallo,

neues Spielfeld für mich: eben diese Synchronisation. Ich habe im Netz diesen Ansatz gefunden:
https://github.com/nickpegg/mpdsync

Leider funktioniert der überhaupt nicht. Denn es gelingt nicht, dem Client einen Song zu "verordnen". Das Problem liegt daran:
Der Server ermittelt einen Songtitel z.B. im Verzeichnis Amazon MP3. Er übergibt also den String Amazon MP3. Damit kann der MPD aber nichts anfangen:

Code: Alles auswählen

 mpc ls Amazon MP3
error: Not found
Der MPD hätte es gerne so:

Code: Alles auswählen

mpc ls "Amazon MP3"
Amazon MP3/Amy Winehouse
Die fehlende Quotierung ist also offenbar das Problem. Leider bin ich kein Programmierer und finde nicht, wie und wo in dem python-script oder der python-mpd der Hebel anzusetzen wäre.

Es wäre nett, wenn jemand von euch mal den Code des python-scripts checken könnte. Der Verantwortliche für den Code ist offenbar leider mittlerweile bei github unbekannt und ich kann ihn nicht kontaktieren. TIA.
LG

Jochen

Benutzeravatar
TRex
Moderator
Beiträge: 8320
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von TRex » 13.01.2014 23:57:23

Mal kurz drüber geschaut würde ich Zeile 139 genauer untersuchen. Da wird Datei und Zeitpunkt übergeben. Ich würd morgen abend mal drüber schauen, wenn bis dahin sonst nix kam ;)
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von Cae » 14.01.2014 01:24:44

Ich hab' ja den Verdacht, dass vielleicht Debianpython-mpd kaputt sein koennte, aber da blick' ich nicht durch, das Ding besteht praktisch nur aus Abstranktionsebenen und braucht beim Ausfuehren vermutlich 500km Stack. Aber jedenfalls geht's da komplett ueber Netzwerk und nicht ueber etwas wie system(), wo Whitespace-Probleme auftreten wuerden, sofern man nicht escapt. Das Netzwerkprotokoll ist im Klartext und mit Newlines getrennt, Dateipfade sind wohl in Anfuehrungzeichen zu setzen:

Code: Alles auswählen

[...]
->OK
<-idle
<-noidle
->OK
<-command_list_ok_begin
<-add "foo/bar baz boom.mp3"
<-status
<-playlistinfo "1"
<-command_list_end
->list_OK
->volume: 60
->repeat: 0
->random: 1
[...]
Vorhandene Anfuehrungszeichen werden wohl gestript. Der Zeichensatz scheint sinnigerweise UTF-8 zu sein.

Gruss Cae

P.S.: Ich hab' mir beim Rumprobieren die ungespeicherte Playlist gekillt... ich hoffe, ihr seid gluecklich :evil:
Loesung: /var/lib/mpd/state aus dem Backup einspielen (aktuell von vorhergehendem mpd-Start) oder

Code: Alles auswählen

# cd /var/log/mpd
# (cat mpd.log; zcat mpd.log*gz) | sed -n '/played/{s/^[^"]*"//;s/".*$//;p}' | sort -u | mpc add
anwerfen... Wobei mir das "nur" die letzten paar Monate wiederherstellt.
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

outis
Beiträge: 395
Registriert: 07.10.2005 12:28:01

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von outis » 14.01.2014 18:04:53

Möglicherweise ist schon etwas "vor" python faul:
auf dem "Server":

Code: Alles auswählen

 mpc playlist
Cassandra Wilson - Polka Dots And Moonbeams
Cassandra Wilson - 'Round Midnight
Versuchen wir's mal rüberzuschieben:

Code: Alles auswählen

mpc -h <client-ip> add "Cassandra Wilson - Polka Dots And Moonbeams"
error adding Cassandra Wilson - Polka Dots And Moonbeams: directory or file not found
Geht also nicht, Vielleicht so:

Code: Alles auswählen

mpc -h <client-ip> add "Amazon MP3/Cassandra Wilson/Sings Standards/01 - Cassandra Wilson - Polka Dots And Moonbeams"
error adding Amazon MP3/Cassandra Wilson/Sings Standards/01 - Cassandra Wilson - Polka Dots And Moonbeams: directory or file not found
Also schauen wir mal auf dem Client:

Code: Alles auswählen

 mpc find title "Polka Dots And Moonbeams"
Amazon MP3/Cassandra Wilson/Sings Standards/01 - Polka Dots And Moonbeams.mp3
Also da isser, der Titel.
Da auch:

Code: Alles auswählen

ls /net/nas/Multimedia/music/Amazon\ MP3/Cassandra\ Wilson/Sings\ Standards/|grep Polka
01 - Polka Dots And Moonbeams.mp3
Also versuchen wir mal volle Granate:

Code: Alles auswählen

 mpc -h <client-ip> add /net/nas/Multimedia/music/Amazon\ MP3/Cassandra\ Wilson/Sings\ Standards/01\ -\ Polka\ Dots\ And\ Moonbeams.mp3
Segmentation fault (core dumped)
Sicherheitshalber ein Blick in die mpd.conf:
Server:

Code: Alles auswählen

music_directory         "/net/nas/Multimedia/music"
Client:

Code: Alles auswählen

music_directory         "/net/nas/Multimedia/music"
Mache ich etwas in Sachen Befehlssyntax falsch?
LG

Jochen

Benutzeravatar
TRex
Moderator
Beiträge: 8320
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von TRex » 14.01.2014 18:38:25

Code: Alles auswählen

~$ echo $MPD_HOST 
odin
~$ mpc clear
volume: 63%   repeat: off   random: off   single: off   consume: off
~$ mpc add "Pretty Lights/Taking up your precious time"
~$ mpc playlist 
Pretty Lights - Short Line
Pretty Lights - Until Tomorrow
Pretty Lights - Wrong Platform
Pretty Lights - Finally Moving
Pretty Lights - Stay
Pretty Lights - Summer's Thirst
Pretty Lights - An Empty Station
Pretty Lights - Switch Up
Pretty Lights - Waiting For Her
Pretty Lights - Samso
Pretty Lights - Down The Line
Pretty Lights - Happiness (Troubled Faces)
Pretty Lights - Almost Familiar
Pretty Lights - The Last Passenger
Pretty Lights - Try To Remember
Funktioniert bei mir hervorragend.. jessy client mit wheezy server. Auch den escapten Weg habe ich ausprobiert, funktioniert ebenso. Bei dir ist da irgendwas kaputt...
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

outis
Beiträge: 395
Registriert: 07.10.2005 12:28:01

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von outis » 14.01.2014 19:39:20

Du machst das ja offenbar auf dem lokalen Rechner. Das klappt bei mir auch,
LG

Jochen

outis
Beiträge: 395
Registriert: 07.10.2005 12:28:01

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von outis » 14.01.2014 20:00:18

Grummel...
1. Zur mpc-Geschichte. Offenbar sprechen unterschiedliche mpd/mpc-Versionen nicht miteinander. Wenn auf beiden ein 0.16er-mpd läuft, klappt's auch mit mpc remote.

2. Python: Das will trotzdem nicht:

Code: Alles auswählen

Connected to slave <slave>:6600
{'songid': '0', 'playlistlength': '1', 'playlist': '3', 'repeat': '0', 'consume': '0', 'mixrampdb': '0.000000', 'random': '0', 'state': 'stop', 'xfade': '0', 'volume': '-1', 'single': '0', 'mixrampdelay': '-1.000000', 'song': '0'}
['file: Amazon MP3/Cassandra Wilson/Sings Standards/01 - Polka Dots And Moonbeams.mp3']
Traceback (most recent call last):
  File "mpdsync.py", line 206, in <module>
    main()
  File "mpdsync.py", line 80, in main
    full_sync(master, slaves)
  File "mpdsync.py", line 174, in full_sync
    slave.client.add(song)
  File "/usr/lib/python2.7/dist-packages/mpd.py", line 167, in <lambda>
    return lambda *args: wrapper(command, args)
  File "/usr/lib/python2.7/dist-packages/mpd.py", line 213, in _execute
    return retval()
  File "/usr/lib/python2.7/dist-packages/mpd.py", line 312, in _fetch_nothing
    line = self._read_line()
  File "/usr/lib/python2.7/dist-packages/mpd.py", line 233, in _read_line
    raise CommandError(error)
mpd.CommandError: [50@0] {add} directory or file not found
Möglicherweise tatsächlich die Anführungsstriche. Denn die wollen eingesetzt werden bei mpc -h.
LG

Jochen

Benutzeravatar
TRex
Moderator
Beiträge: 8320
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von TRex » 14.01.2014 21:39:28

outis hat geschrieben:Du machst das ja offenbar auf dem lokalen Rechner. Das klappt bei mir auch,
Nein, darum hab ich MPD_HOST noch gezeigt - das zeigt auf einen anderen Rechner (anders hätte auch meine Angabe von wheezy und jessy keinen Sinn gemacht), kannst du in der manpage nachlesen. Aber ich kann das auch explizit mit -h angeben, wenn dir das mehr Vertrauen schenkt.

Außerdem nochmal das genannte Beispiel ohne Anführungszeichen:

Code: Alles auswählen

trex2003@modi:~$ mpc -h odin clear
volume: 63%   repeat: off   random: off   single: off   consume: off
trex2003@modi:~$ mpc -h odin add Pretty\ Lights/Taking\ up\ your\ precious\ time/
trex2003@modi:~$ mpc -h odin playlist
Pretty Lights - Short Line
Pretty Lights - Until Tomorrow
Pretty Lights - Wrong Platform
Pretty Lights - Finally Moving
Pretty Lights - Stay
Pretty Lights - Summer's Thirst
Pretty Lights - An Empty Station
Pretty Lights - Switch Up
Pretty Lights - Waiting For Her
Pretty Lights - Samso
Pretty Lights - Down The Line
Pretty Lights - Happiness (Troubled Faces)
Pretty Lights - Almost Familiar
Pretty Lights - The Last Passenger
Pretty Lights - Try To Remember
Vor nem Jahr oder so wars übrigens wheezy (testing) aufm Client und squeeze aufm Server, da hat das auch funktioniert. Dennoch kannst du mit der Versionsgeschichte recht haben. Ich hab derzeit mpc 0.25-1 aufm Client und mpd 0.16.7-2+b1 aufm Server.

Du hast da übrigens nen kleinen Fehler im add: Im ersten fehlt der Pfad. playlist zeigt nur Interpret - Titel. So weit so klar, hast du bemerkt. Im zweiten Beispiel hast du .mp3 vergessen. Beispiel drei, volle Granate, sollte funktionieren, tuts aber aus unerfindlichen Gründen nicht. Versuch mal bitte

Code: Alles auswählen

mpc -h <ip> add "Amazon MP3/Cassandra Wilson"
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

outis
Beiträge: 395
Registriert: 07.10.2005 12:28:01

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von outis » 14.01.2014 22:00:18

Danke, vergessen hatte ich die Dateiendung nicht. Ich war nur fälschlicherweise davon ausgegangen, dass die von mpc playlist angezeigten Werte genügen. Wenn die Dateiendung angegeben wird, reden auch mpd-0.18 und 0.16 miteinander:

Code: Alles auswählen

mpc -h <ip> playlist
mpc -h <ip> add "Amazon MP3/Cassandra Wilson/Sings Standards/01 - Polka Dots And Moonbeams.mp3"
mpc -h <ip> playlist
Cassandra Wilson - Polka Dots And Moonbeams
Das ist ja schon mal was.

Das Python-script mag allerdings immer noch nicht...
LG

Jochen

Benutzeravatar
TRex
Moderator
Beiträge: 8320
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von TRex » 14.01.2014 22:39:25

Und die Ursache dazu hab ich nun auch gefunden. Ich hab auch ne primitive Lösung dazu, die mir qualitativ noch nicht ganz gefällt, die aber funktioniert.

Zeile 174:

Code: Alles auswählen

        for song in playlist:
            song = song.strip('file: ')
            slave.client.add(song)
            print(song)
Das ganze File nochmal auf NoPaste-Eintrag37606. Es hatte nichts mit Anführungszeichen zu tun, sondern dass die ausgelesene Playlist jeweils "file: " als Prefix hat.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

outis
Beiträge: 395
Registriert: 07.10.2005 12:28:01

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von outis » 14.01.2014 22:50:27

Herzlichsten Dank. Nun gilt's das Synchronisieren in der Praxis (Musikhören) zu testen...
LG

Jochen

outis
Beiträge: 395
Registriert: 07.10.2005 12:28:01

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von outis » 14.01.2014 22:55:58

Grundsätzlich läuft's. Was meinst du, bekommt man in dem scripting den zeitlichen Versatz noch in den Griff? Dann wäre es perfekt.
LG

Jochen

Benutzeravatar
TRex
Moderator
Beiträge: 8320
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von TRex » 15.01.2014 08:41:43

Das kann ich bei mir leider nicht genau testen - ist der von der Netzwerklatenz? Exakt bekommt man den dann vermutlich nicht weg, da du dann ja schon für den noch auszuführenden Befehl die Latenz wissen und addieren musst. Vorgesehen ist die Synchronisation ja im Script und auf die Sekunde stimmt das bei mir augenscheinlich.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

outis
Beiträge: 395
Registriert: 07.10.2005 12:28:01

Re: mpdsync - Annähernde Synchronisation mehrerer MPD-Rechne

Beitrag von outis » 15.01.2014 13:52:23

Ich kenne mich zu wenig mit der Materie aus. Aber man hat ja wenigstens zwei Unbekannte: Zum einen die Zeit, die für die Übertragung der Befehle an den MPD-Client benötigt wird. Zum anderen, die Zeit, die der Client benötigt, um den Befehl umzusetzen. Da das aber von Netzwerk- und Rechnergeschwindigkeit der individuellen örtlichen Verhältnisse abhängt, könnte man vermutlich nur durch eine individuell konfigurierbare Variable annäherungsweise arbeiten. Die Variable wäre dann die Zeit, die der Server wartet, bevor er mit dem Abspielvorgang wartet. Es sei denn, der Server könnte vorher Netzwerk und Client testen. Aber selbst dann wären die Unwägbarkeiten temporär unterschiedlich hoher Netzwerk- und Rechnerlast nicht komplett beseitigt.

Nur so ins Blaue gedacht...

Ob ein pulse-audio-basierter Ansatz mit den beiden genannten Unbekannten umgehen kann, kann ich mangels Erfahrung damit nicht abschätzen:
http://fruit.je/mpd-rtp

Der Streaming-Ansatz wäre nur dann akzeptabel, falls der ohne Datenkompression und Formatwandlung arbeiten kann.
LG

Jochen

Antworten