Projekt: yt-dlna (DLNA-Server mit Online-Video-Gateway und FHEM-Modul)

Begonnen von x86, 27 September 2026, 17:34:58

Vorheriges Thema - Nächstes Thema

x86

Liebe FHEM-Community,

ich hab seit mittlerweile ca. 7 Jahren (Coronazeit, wo man fürs Aufsetzen Zeit hatte und so... ;)) ein kleines FHEM-System auf einem damals "übrig" gewesenen und für sonst eigentlich nix mehr wirklich tauglichen alten Raspberry Pi 1 in Betrieb. Das genügsame FHEM mit Anbindung diverser Shellys, nanoCUL, Fritzbox/DECT SmartHome usw. lief darauf aber noch ganz gut.

Als nun diesen Sommer der Pi 1 tatsächlich das Zeitliche gesegnet hat und durch einen ebenso noch vorhandenen Pi 3 ersetzt wurde (hätt ich mal viel früher machen sollen - Unterschied wie Tag und Nacht - allerdings auch keine 1,5-2 W, sondern eher so 4-5 W Verbrauch...), waren plötzlich wieder einige Ressourcen frei, auf dem Pi noch so einiges andere nebenher laufen zu lassen.

Ich habe mich daher an ein Projekt gewagt, das mir schon seit längerem vorschwebte, mit dem ich auch schon in etwas ungelenkem Python angefangen habe, das aber auf dem Pi 1 nie so richtig gut lief. Mit, wie heute üblich, ein bisschen Nachhilfe durch KI (aber tatsächlich nicht komplett ge"vibe-codet", sondern auf meiner ursprünglichen Architektur aufsetzend) habe ich es aber letztlich auf dem Pi 3 zum "Fliegen" gebracht:

yt-dlna: Ein DLNA-Server, der das Python-Modul/Paket "yt-dlp" (sicherlich einschlägig bekannt...) benutzt, um folgenden Workflow bereitzustellen (und ich komme auch noch dazu, was das ganze mit FHEM zu tun hat, sodass das hier nicht vollends Off-Topic und "shameless self-plugging" ist, auch wenn ich es vorsorglich mal unter Off-Topic einsortiert habe  ;D):

  • Stellt die "Dienstleistung" von yt-dlp als Proxy im Netz bereit, d.h. wenn yt-dlna erstmal auf einem Host im Netz läuft, kann jedes System im Heimnetz unter der URL z.B. http://<yt-dlna-host>:5000/play/{youtube_video_id} (Beispiel YouTube, ID genügt) oder http://<yt-dlna-host>:5000/play/{encoded_ard_mediathek_url} (Beispiel ARD-Mediathek) das gewünschte Video sofort abspielen
  • Der Proxy arbeitet in mehreren Modi:
    • Standardmäßig erfolgt ein 302 Redirect zur direkten CDN-URL zum MP4 (z.B. ARD/ZDF Mediathek).
    • Es gibt auch einen "echten" proxy-Mode (Tunnel): dabei wird das Video durch den Proxy getunnelt und kommt direkt unter der o.g. URL beim Client an (belastet den Pi natürlich etwas mehr), ist aber nötig für Fernseher, deren UPnP-Client kein 302 zulässt.
    • Für YouTube oder andere Portale, die nur noch mäßige Videoqualität (360p bei YouTube) als Standard-MP4 anbieten, erfolgt automatisch (wenn aktiviert) ein Remuxing der vorhandenen MPEG-DASH Streams (Audio / Video als getrennte Streams) via ffmpeg (muss installiert sein) in einen gemeinsamen MPEG-TS-Stream (sehr kompatibel auch zu älteren TVs!) oder ein fragmented-MP4-File.
  • Der Clou: Es lassen sich Playlists definieren - entweder lokal ("Custom") oder mit dem Videoportal synchronisiert ("Online", z.B. die berühmte YouTube "Watch Later"-Liste), die dann vom integrierten UPnP/DLNA-Mediaserver als virtuelle "Ordner" bereitgestellt werden - d.h. jeder olle Fernseher auch ohne YouTube-App kann über die UPnP-MediaPlayer-Funktion die YouTube-Lieblingsvideos, oder auch die aktuelle Tagesschau aus der Mediathek, oder täglich das Sandmännchen, mit einem Klick aus einer Liste abrufen und abspielen (natürlich als kleiner Nebeneffekt auch alles werbefrei...), ohne dass native Streaming-Apps oder umständliches Geklicke in den HbbTV-Portalen der Sender nötig wären
  • Falls man persönliche Listen wie die genannte Watch-Later-Liste synchronisieren möchte, kann man yt-dlna für jeden Videodienst den Pfad zu einer cookies.txt mit Logindaten bekanntgeben - eine komplett "anonyme" Nutzung ist aber ebenfalls möglich und empfohlen (siehe auch Disclaimer unten).
  • Die CDN-URLs für diese in Listen vorhandenen Videos werden auf Wunsch auch in definierten Zeitabständen automatisch vorab "resolved" (z.B. TTL der YouTube-CDN-URLs ca. 6 Stunden), sodass beim Anwählen am Fernseher das betreffende Video so ziemlich sofort losläuft
  • Zusätzlich gibt es eine Web-Oberfläche (http://<yt-dlna-host>:5001), die nicht nur die Konfiguration erlaubt, sondern auf der auch mit einem Klick/Tap beliebige Video-Page-URLs (Mediathek-Links, YouTube-Links) reingepastet und sofort mit "Play to TV" an im Netz gefundene MediaRenderer zum Abspielen gesendet werden können
  • Als weiterer Clou annonciert sich "yt-dlna" dann auch gleich noch als "Cast"-Receiver (UPnP-DIAL-Standard) im Netz, sodass es in der offiziellen YouTube-App als "Fernseher" angezeigt wird, an den Videos direkt aus der YouTube-App mit "Wiedegeben auf..." gesendet werden können (bitte den Eintrag "yt-dlna Cast/UPnP Bridge" auswählen, nicht den Namen des eigenen Fernsehers, falls dieser sich auch noch selbst bekanntmacht - letzteres würde die offizielle YouTube-App öffnen mit Werbung etc.). Die "yt-dlna Cast/UPnP Bridge" nimmt die Abspielaufforderung via DIAL/Cast entgegen und leitet sie als UPnP-Play-Befehl an den als Standard-Renderer konfigurierten (oder zuletzt genutzten / ersten gefundenen) UPnP-MediaRenderer weiter

Warum ich das ganze hier im FHEM-Forum "bekannt gebe" ist nicht nur, dass das Ding sich perfekt zum "Mitlaufen lassen" auf einem ohnehin im Netz befindlichen FHEM-Raspberry eignet, sondern auch, dass sich mit dem Feature der sog. "Custom Playlists" in Verbindung mit einem ebenfalls von mir zusammengeklöppelten FHEM-Modul die Möglichkeit ergibt, auch (rudimentär) Werte bzw. Readings aus der FHEM-Welt auf einem UPnP-fähigen Fernseher als "Pseudo-Ordnermenü" anzuzeigen und mittels des "hit"-Proxy-Modes sogar Aktionen auszuführen (dieser Modus macht einfach via Backend ein GET auf die in der Playlist hinterlegte URL und liefert dem anfragenden Client eine stille dummy.mp3-Datei).

Da diese "Custom Playlists" in .json-Files gespeichert werden, die im Filesystem liegen, ist es möglich, mittels des genannten FHEM-Moduls zyklisch, z.B. alle 5 Minuten, ein solches File erstellen zu lassen, das dann von yt-dlna als Playlist auf dem Client angezeigt wird.

Dazu ersetzt das Modul bestimmte Tokens im Playlist-File (siehe Doku) durch Readings usw. - wirklich ganz simpel.

Ein weiterer Grund, warum ich es hier schreibe, ist natürlich, dass ich mich extremst über alle freuen würde, die Lust haben, das mal mit ihren Fernsehern/DVD-/Bluray-Playern oder sonstigen DLNA-Clients zu testen, ich hab nämlich bislang nur diese Erfahrungen hier gemacht:

  • TV Panasonic TX-55MZT1506 (und vermutlich sämtliche anderen TVs mit myHomeScreen 8.0 und vermutlich auch älter) - geht (Remux-Mode nur als MPEG-TS)!
  • BD-Player Panasonic DMP-BDT500 - Alles außer "Play-to" (Renderer) geht!
  • Software VLC Player 3.0.23 - geht (alle Modi)!

Sollte also jemand weitere Erfahrungen gemacht haben, gerne hier melden (oder auch einfach direkt als Issue im GitHub-Repo, oder wenn Lösungsidee auch noch sehr viel gernererer direkt nen Pull-Request  ;) ).

Wo ist das ganze zu finden?

yt-dlna
GitHub-Repo (https://github.com/fabianswebworld/yt-dlna)

fhem-yt-dlna-custom-playlist-frontend (das FHEM-Modul)
GitHub-Repo (https://github.com/fabianswebworld/fhem-yt-dlna-custom-playlist-frontend)

Ich freu mich auf Feedback!  :)

Disclaimer (steht aber natürlich auch im README.md): Das Ganze nutzt, wie schon gesagt, yt-dlp (via import oder exec); das Tool selbst beinhaltet keinerlei Routinen die direkt mit den Videodiensten interagieren. Bei Nutzung von yt-dlp gelten natürlich alle in dessen Dokumentation/Lizenz genannten Bedingungen und Vorsichtsmaßnahmen, insbesondere der Hinweis, dass die Nutzung ggf. gegen Nutzungsbedingungen der Portale, speziell YouTube, verstoßen _könnte_ - evtl. Folgen wie Account-Einschränkungen (besser "Wegwerf-Account" oder gar kein Cookie nutzen) nimmt der Nutzende selbstverständlich auf eigenes Risiko in Kauf.

Liebe Grüße
Fabian
FHEM auf Raspberry Pi 3 Model B
SIGNALduino (CC1101), 6 IT-Steckdosen/Fernbedienungen, 8 433-MHz-Temperatursensoren, 6 tuya-LEDs, 6 Shelly 2.5 Rolladenaktoren, 1 Comet DECT Heizungsaktor, tasmota IR, VIERA TV, HomeConnect, GoogleAssistant, FTUI, Wetter- u. Fahrplandaten, yt-dlna = 220 defines