Modul für MPD

Begonnen von roedert, 08 Januar 2014, 12:17:21

Vorheriges Thema - Nächstes Thema

Wzut

#465
Zitat von: Homatrix am 22 Januar 2017, 17:17:05
Kein state. :-(
-- snipp --
Kann ich das bei mir irgendwie anpassen, so dass beide Anzeigen rausfallen?
Thema state : Das ist keine Eigenart des Moduls sondern in fhem generell so -> http://fhem.de/Heimautomatisierung-mit-fhem.pdf

Zum ausblenden der Anzeigen gibt es zumindest für die Musik Liste eine Lösung : attr loadMusic 0 ist dein Freund wenn sie beim Neustart nicht geladen werden soll
oder mit attr stateMusic sich die Dropdown Liste im Webfrontend nicht anzeigen lassen ( steht aber auch in der command.ref : ) )
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wzut

#466
Das ging jetzt scneller als gedacht, als Anhang eine Version mit den umgesetzten Änderungen aus  Antwort #464
Ich habe das Kommando set <name> playlist <playlistname> intern erweitern müssen, der Nebenefekt  ist nun das ihr ein Kommando habt das mehr kann als nur die Liste zu laden.  Track und Position können direkt mit | getrennt angehängt werden. Bsp :
set <name> playlist rock - lädt wie bisher die Liste rock und spiielt den ersten Titel
set <name> playlist rock|3 - lädt die Liste rock und beginnt mit Song Nr.3 statt mit dem ersten
set <name> playlist rock|3|20 - lädt die Liste rock und beginnt mit Song Nr.3 ab der 20. Sekunde

@unimatrix , ich habe die Zeile beim speichern von Bookmarks auskommentiert :
$fname    =~ s/[^A-Za-z0-9\-\.]//g;    # ensure to use only valid characters for filenames
Hintergrund : Playlisten dürfen auch Leerzeichen ( und Underscore ? ) im Namen haben, d.h. hier sollte man vllt. nachbessern.

Edit : Anhang gelöscht, Version ist im svn
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

unimatrix

Zitat von: Wzut am 22 Januar 2017, 17:33:14
set <name> load_bookmark wird die neue Funktion, die lädt dann zur aktuellen Playliste den gespeicherten Track und springt zur entsprechenden Position.
set <name> load_bookmark <bookmark> wird neu dazukommen und erlaubt es zu jeder Zeit eine beliebige Bookmark zu laden mit zusätzlichem direkten Wechsel auf die passende Liste.
Der Befehl get <name> bookmark wird geändert zu set <name> save_bookmark (Stichwort Wiki Richtlinie)
Ja das macht Sinn und ich hatte das in meiner ursprünglichen Implementierung meines Multiroom-Systems außerhalb FHEM (das war ein Mix aus MPD und Pulseaudiosteuerung, was ich seit Wochen auf FHEM portiere) auch so. Ich hatte es noch auf meiner TODO, da ich es sich von der Umsetzung ggf. mit einem anderen Feature überlappt, dass ich noch brauche, was aber vll nicht unbedingt in dieses Modul gehört, sondern außerhalb. Ich möchte bei mir zu Hause den Zustand/Bookmark von einer MPD Instanz auf eine andere Instanz übertragen. Wenn ich z.B. ein Hörbuch morgens im Bad höre, gehe ich danach vll in die Küche und möchte das da weiterhören. Dann kann ich schon jetzt in der Küche sagen "höre im Bad mit", aber, dann läuft es ja immer noch im Bad. Wenn jetzt meine Frau ins bad geht und sich was anderes einschaltet, höre ich auch in der Küche was anderes. Ich will also eig. gar nicht mithören, sondern stattdessen den Zustand komplett übernehmen und das Bad soll dann wieder frei sein. Ich hatte das früher auch implementiert, und zwar dann für den Anwender so, dass er das alles mit nur einer Taste auf der Fernbedienung machen kann. Ein kurzer Druck auf "rot" bewirkt, dass man sich durch die Räume durchschaltet, wo gerade etwas läuft, also zunächst nur zum Zuhören. Ein langer Druck auf Rot bewirkt dann dass man sich den Zustand von dem Raum wo man zuhört kopiert. Wollte man nicht, dass in dem anderen Raum danach weitergespielt wird, musste man vorher noch einmal auf Pause drücken.

unimatrix

Zitat von: Wzut am 22 Januar 2017, 19:49:18
set <name> playlist rock|3|20 - lädt die Liste rock und beginnt mit Song Nr.3 ab der 20. Sekunde
@unimatrix , ich habe die Zeile beim speichern von Bookmarks auskommentiert :
$fname    =~ s/[^A-Za-z0-9\-\.]//g;    # ensure to use only valid characters for filenames
Hintergrund : Playlisten dürfen auch Leerzeichen ( und Underscore ? ) im Namen haben, d.h. hier sollte man vllt. nachbessern.
Genial, das mit dem set playlist!

Das mit der Regex ist wahrscheinlich ok, wenn du es rausnimmst.  Das war um Sicherzustellen, dass die Dateinamen gültig werden. Da hab ich in Kauf genommen, die anderen Zeichen einfach zu löschen. Würde sich ja nur dann negativ auswirken, wenn es 2 Playlisten gäbe, die dann genau gleich heissen, also z.B. "Radio 1" und Radio1"  Meine Spotifyplaylists, die teilweise automatisch so benannt sind, haben leider auch Klammern, Umlaute, usw.

harry303303

Hallo zusammen,

ich versuche gerade mit dem Modul einen Forked-Daap zu steuern. Leider habe ich ein Problem mit den Playlisten.

Rufe ich über das Modul set itunes_server_badezimmer_remote MpdCMD listplaylists auf:

itunes_server_badezimmer_remote listplaylists:
playlist: file:/srv/music/radio
Last-Modified: 2017-01-23T20:31:58Z
playlist: file:/srv/music/rockantenne-alternative
Last-Modified: 2017-01-23T20:22:40Z


über
set itunes_server_badezimmer_remote playlist file:/srv/music/radio

kann ich die Liste auch aufrufen.

Nur leider liefert mir

get  itunes_server_badezimmer_remote playlists immer nur ein leeres Ergebnis.

Was mache ich noch falsch?

Gruß harry303

Wzut

man kann beim "echten" MPD sich die Listen mit zwei verschiedenen Kommandos holen , entweder mit lsinfo oder mit listplaylists.
(ich verwende z.Z. intern lsinfo) Wähle doch bitte im Webfrontend aus den Set Befehlen mpdCMD aus und trage dahinter listplaylists ein.
Werden deine Listen dann ausgegeben ?
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

unimatrix

Ich habe die Arbeit an einem WIKI-Artikel für mein Multiroom-Konzept angefangen. @Wzut mit deinem Einverständnis werde ich auch einige der neuen Funktionen des MPD Moduls dort beschreiben. Insgesamt nimmt das Modul in dem Konzept ja eine zentrale Rolle ein. Ein Gesamtschaubild gibt es schon. https://wiki.fhem.de/wiki/OpenMultiroom

Wzut

gern, ich bin leider jemand der in keiner Weise vernünftige Doku schreiben kann. Aber meckern kann ich gut,
d.h. schreibe nach Herzenslust ich sag dann schon welche Formulierungen mir nicht gefallen :) 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

harry303303

#473
Zitat von: Wzut am 24 Januar 2017, 07:05:41
man kann beim "echten" MPD sich die Listen mit zwei verschiedenen Kommandos holen , entweder mit lsinfo oder mit listplaylists.
(ich verwende z.Z. intern lsinfo) Wähle doch bitte im Webfrontend aus den Set Befehlen mpdCMD aus und trage dahinter listplaylists ein.
Werden deine Listen dann ausgegeben ?

Komisch, mit lsinfo gibt es nur eine leere Antwort ohne Name während listplaylists alle listet:

itunes_server_badezimmer_remote lsinfo:
directory: file:
Last-Modified: 2017-01-23T20:31:58Z
directory: http:
Last-Modified: 2017-01-23T20:31:57Z


itunes_server_badezimmer_remote listplaylists:
playlist: file:/srv/music/radio
Last-Modified: 2017-01-23T20:31:58Z
playlist: file:/srv/music/rockantenne-alternative
Last-Modified: 2017-01-23T20:22:40Z 


Laut https://www.musicpd.org/doc/protocol/database.html ist lsinfo deprecated:

When listing the root directory, this currently returns the list of stored playlists. This behavior is deprecated; use "listplaylists" instead.

Wzut

OK, das hatte ich schon vermutet. Wenn du es dir zutraust suche im Modul die zwei Zeilen in denen lsinfo benutzt wird , tausche es gegen listplaylists aus und lade das Modul neu (oder starte fhem neu) oder warte bis zum nächsten Update (1-2 Tage) dann ist es gefixt.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Wzut

Ich werde heute im Laufe des Tages eine neue Version einchecken.
- change :
a. JSON statt XML d.h. JSON ist nun zwingend notwendig ( sudo apt-get install libjson-perl )
Wer .xml Dateien in seinem cache hat kann diese löschen da sie nicht mehr verwendet werden (nicht die PNG Bilder !)

b. MPD Kommando lsinfo ausgetauscht gegen listplaylists

c. set <name> playlist <playlistname> um die optionalen Parameter Song und Position erweitert

- add :
a. die Verwendung von Bookmarks für Playlisten (load_bookmark , save_bookmark ,  bookmarkDir,  autoBookmark -> von unimatrix)
b.  neue Attribute : seekStepThreshold seekStep seekStepSmall (von unimatrix)
c.  neues Attribut : no_playlistcollection (default 0)  damit kann auf Wunsch das Reading playlistcollection unterdrückt werden ( https://forum.fhem.de/index.php/topic,18517.msg566905.html#msg566905 )

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

unimatrix

Super, danke für deinen Support was die vielen Änderungen von mir in der letzten Zeit angeht!

unimatrix

Zitat von: Wzut am 26 Januar 2017, 09:40:26
Ich werde heute im Laufe des Tages eine neue Version einchecken.

Kleiner "Bug" noch: Mopidy meldet sich bei mir als MPD Version 0.19.0, unterstützt aber durchaus seekCur. Schlage vor, beim Versionscheck die Zeile zu ändern:


   if (int($v) < 20 && AttrVal($name,"player","mpd") ne "mopidy")

unimatrix

#478
sorry, um genau zu sein geht der Check so gar nicht wegen eines Fehlers im Split. Hier korrigiert:

if ($cmd eq "seekcur")
  {
   my (undef,$v,undef) = split(/\./,$hash->{VERSION});
   if (int($v) < 20 && AttrVal($name,"player","mpd") ne "mopidy")
   {
    $ret = "command $cmd needs a MPD version of 0.20.0 or greater (is: $v!";
    Log3 $name,3,"$name,$ret";
    readingsSingleUpdate($hash,"last_error",$ret,1);
   }
   else
   {
   if($subcmd=~/^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)$/) # Matches valid time given as [[hh:]mm:]ss
    {
      $subcmd=(defined($1) ? $1 : 0)*3600+(defined($2) ? $2 : 0)*60+$3;  # Sekunden ausrechnen
    }
   else { $subcmd--; $subcmd++; } # sicherstellen das subcmd numerisch ist     
   if ( $subcmd > 0 )
   { $ret = mpd_cmd($hash,clb."seekcur $subcmd\n".cle) ; } # ungetestet !
   else { $ret = undef; }
   }
  }



Der defined check nach $1, $2 und $3 ging so nicht wegen der Non-Capturing Group. Jetzt ist allerdings noch ein Problem übrig, das "Seeken" basiert ja auf dem aktuellen Reading, und das hinkt dem tatsächlichen Playerstatus ein Stück hinterher. Wenn ein neuer Track anspielt und man ein Stück vor-"spulen" will, landet man meist direkt am Ende, weil das MPD Modul noch die elapsed-Zeit des alten Moduls hat.

Ich habe mal per tcpflow mitgelauscht, wie andere Clients das machen. Die senden, falls MPD im "Play"-Zustand ist, 1 mal in der Sekunde ein "status" an MPD und bekommen so u.a. die aktuelle Zeit zurück.

Wollen wir das ???

Wzut

Danke für die Hinweise , habe es eben noch gefixt so das morgen nach 7:45 Uhr das richtig via update verteilt wird.
Zum Thema Mopidy und seekcur, ich muß mir wenn ich wieder etwas mehr Luft habe unbedingt mal einen Rpi damit aufsetzen.
Ist ein Mist wenn ich nicht gescheit testen kann, zumal eh noch die Autorestore Funktion fehlt ..... 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher