Autor Thema: VLC über HTTP Interface steuern  (Gelesen 692 mal)

Offline xenos1984

  • Full Member
  • ***
  • Beiträge: 166
VLC über HTTP Interface steuern
« am: 24 November 2019, 17:57:49 »
Hat schon mal jemand versucht, den VLC Media Player über das HTTP-Interface in FHEM einzubinden? Ich konnte dazu nichts im Wiki oder Forum finden und habe mich einmal ans Werk gemacht, daher hier ein paar Erfahrungsberichte.

Hintergrund: Ich nutze einen Raspberry Pi (headless) als Radiowecker. Derzeit läuft dort einfach via Cron + mplayer zeitgesteuert ein Live-Radio. Nun würde ich dort gerne VLC nutzen, da man damit z.B. auch Youtube-Playlisten abspielen kann, und weil VLC eine Steuerung über HTTP erlaubt, wodurch eine Einbindung in FHEM möglich sein sollte.

Technische Details und weitere Infos:

Umsetzung: Derzeit arbeite ich an einer Einbindung über das Modul HTTPMOD. Längerfristig wäre es vielleicht eine Überlegung wert, ob man nicht ein Perl-Modul speziell für das VLC HTTP Interface schreiben könnte oder sollte - ähnlich wie beim SONOS. Allerdings habe ich noch nicht (viel) mit Perl gearbeitet, daher erst einmal die einfache Variante.

Meine bisherigen Erkenntnisse beim Einsatz von HTTPMOD:

1.
VLC benutzt für das HTTP Interface eine HTTP Basic Authentifizierung mit Passwort, aber leerem Benutzernamen. Das scheint etwas trickreich in der Umsetzung zu sein. Mein erster Versuch, die URL in der Form
http://<username>:<password>@<host>:<port>/requests/status.xmlanzugeben, aber <username> leer zu lassen, führten zum Fehler "Read callback: Error: <url>: malformed or unsupported URL". Gelöst habe ich es nun so, dass ich das Password als Request-Header übergebe, d.h., es sieht dann so in meiner Definition aus:
define vlc HTTPMOD http://<host>:<port>/requests/status.xml 5
attr vlc requestHeader1 Authorization: Basic <auth-code>
Den <auth-code> habe ich in dem Fall dadurch ausgelesen, dass ich das VLC Interface mit FireFox aufgerufen und die Request-Header dort mitgelesen habe.

2.
VLC bietet Status-Informationen wahlweise als XML oder JSON an - beides kann HTTPMOD verarbeiten. Ich habe mich einmal für XML entschieden. Auf diese Weise bekommt man z.B. den Status und kann ihn auch gleich als Icon nutzen:
attr vlc reading01Name state
attr vlc reading01XPath-Strict /root/state/text()
attr vlc devStateIcon stopped:audio_stop@red playing:audio_play@green paused:audio_pause@yellow

3.
Manche Einträge sind in der XML-Ausgabe nur vorhanden, wenn gerade die Wiedergabe läuft. Da bietet es sich an, HTTPMOD anzuweisen, sie zu entfernen, wenn sie nicht vorhanden sind:
attr vlc reading06DeleteIfUnmatched 1
attr vlc reading06Name now_playing
attr vlc reading06XPath-Strict /root/information/category[@name="meta"]/info[@name="now_playing"]/text()
attr vlc reading07DeleteIfUnmatched 1
attr vlc reading07Name title
attr vlc reading07XPath-Strict /root/information/category[@name="meta"]/info[@name="title"]/text()

Nächstes Mal gibt es dann ein paar Erkenntnisse dazu, wie man nicht nur den Status liest, sondern auch den VLC steuert, aber da ist bei mir noch Baustelle und mein Code ändert sich bestimmt noch :) Wenn Interesse am Thema besteht, kann ich die Erkenntnisse zu gegebener Zeit auch zu einem Wiki-Artikel zusammenstellen.

Offline rischbiter123

  • Full Member
  • ***
  • Beiträge: 378
Antw:VLC über HTTP Interface steuern
« Antwort #1 am: 24 November 2019, 18:26:10 »
Moin,

Interesse vorhanden.

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

Offline xenos1984

  • Full Member
  • ***
  • Beiträge: 166
Antw:VLC über HTTP Interface steuern
« Antwort #2 am: 24 November 2019, 19:03:52 »
Hier mal ein kleiner Ausblick auf die Steuerung des VLC von FHEM aus, am Beispiel des Befehls "Playlist leeren":
attr vlc setURL http://<host>:<port>/requests/status.xml?command=%%cmd%%
attr vlc setHeader1 Authorization: Basic <auth-code>
attr vlc replacement01Regex %%cmd%%
attr vlc set01Name empty
attr vlc set01NoArg 1
attr vlc set01Replacement01Value pl_empty
Erläuterungen:
  • Mit setURL bekommt das HTTPMOD mitgeteilt, wie die URL zur Übermittlung eines Befehls an VLC aussehen soll. Das "%%cmd%%" wird dabei später per Regex ersetzt.
  • Mit setHeader1 wird HTTPMOD angewiesen, auch für Befehle wieder die HTTP Basic Authentifizierung zu benutzen.
  • replacement01Regex ist der Teil der URL, der später ersetzt werden soll.
  • set01Empty gibt den Namen der Eigenschaft an, die gesetzt werden soll.
  • Da zum leeren der Playlist kein Parameterwert übergeben wird, ist dies durch set01NoArg gekennzeichnet. Bei anderen Eigenschaften, bei denen z.B ein Lautstärkewert oder eine URL zum Abspielen übergeben wird, entfällt dieses Attribut.
  • set01Replacement01Value besagt schließlich, durch was das %%cmd%% in der URL ersetzt werden muss, damit VLC die Playlist leert.
Leeren lässt sich die Playlist dann z.B. so:
set vlc emptyDerzeit habe ich das über ein Dummy eingebunden, aber da ich noch FHEM-Einsteiger bin, hat vielleicht ja noch jemand einen besseren Vorschlag. So weit ich bisher rausfinden konnte, kann man bei dieser Variante "noArg" als Argument im devStateIcon benutzen, wenn man ein solches haben möchte:
define vlc_empty dummy
attr vlc_empty devStateIcon noArg:audio_eject:noArg

define vlc_empty_act notify vlc_empty set vlc empty

Offline xenos1984

  • Full Member
  • ***
  • Beiträge: 166
Antw:VLC über HTTP Interface steuern
« Antwort #3 am: 24 November 2019, 19:40:51 »
Und wo wir schon mal bei der Sache sind, gleich ein kleiner Auszug zu Eigenschaften, die sowohl gelesen als auch gesetzt werden, hier am Beispiel "zufällige Wiedergabe". Zunächst einmal soll diese von VLC gelesen werden:
attr vlc reading04Name random
attr vlc reading04XPath-Strict /root/random/text()
Der Rückgabewert lautet dann true oder false. Allerdings bietet das VLC HTTP Interface scheinbar keine Möglichkeit, einen bestimmten Wert zu setzen, sondern nur den aktuellen Wert zu invertieren (toggle). Dieser Befehl nimmt keinen weiteren Parameter an. Also:
attr vlc set04Name random
attr vlc set04NoArg 1
attr vlc set04Replacement01Value pl_random
Und nun lässt sich mit diesem Befehl der Zustand umschalten:
set vlc randomUm beides - Auslesen / Anzeigen und Schalten - zu kombinieren, habe ich es in ein readingsProxy gepackt:
define vlc_random readingsProxy vlc:random
attr vlc_random devStateIcon false:audio_shuffle@red:noArg true:audio_shuffle@green:noArg
attr vlc_random setFn {fhem('set vlc random')}
attr vlc_random setList noArg
Auch hier wird wieder noArg als "Dummy-Status-Parameter" benutzt, da der Befehl selbst keinen Parameter braucht. Und nun zeigt die Farbe des Icons an, ob zufällige Wiedergabe aktiviert ist, und lässt sich durch Klick darauf umschalten.

Offline rischbiter123

  • Full Member
  • ***
  • Beiträge: 378
Antw:VLC über HTTP Interface steuern
« Antwort #4 am: 24 November 2019, 19:53:57 »
Moin,

mich würde vor allem das Auswählen und Abspielen von Playlisten interessieren.

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

Offline xenos1984

  • Full Member
  • ***
  • Beiträge: 166
Antw:VLC über HTTP Interface steuern
« Antwort #5 am: 24 November 2019, 21:03:18 »
Daran arbeite ich noch :) Bisher habe ich noch keine Möglichkeit gefunden, z.B. eine Liste von Dateien oder Playlisten dynamisch zu generieren und zur Auswahl anzuzeigen. Aber vielleicht hat ja jemand eine Idee oder einen Vorschlag, wie sich das realisieren ließe.