Externe Integration - Jellyfin / Emby

Hallo zusammen :waving_hand:

Wie im Thema der zu portierenden Home Assistant-Integrationen angekündigt, hier ist Jellyfin & Emby: eine einzige Integration für beide Server (Jellyfin ist ein Fork von Emby, die API ist gemeinsam), die automatisch erkennt, mit welchem Server sie kommuniziert. @AlexTrovato, das ist dein Wunsch von August :wink:

[capture des tableaux de bord]

Was es kann

Ein Gerät pro Player (TV-App, Telefon, Browser):

  • :play_button: Wiedergabe, Pause, Stop, Vorheriger, Nächster, Rücklauf und Schnellvorlauf, Lautstärke, Stumm
  • :musical_note: der Wiedergabestatus, kompatibel mit dem Musik-Widget des Dashboards
  • :label: der aktuelle Titel und die verbleibende Zeit
  • :sparkles: „Während der Intro“ und „Während des Abspanns“: unter Jellyfin 10.10+ mit einem Segment-Plugin (Chapter Segments Provider, Intro Skipper…), unter Emby mit seiner Intro-Erkennung

Ein Server-Gerät: laufende Wiedergaben, Transcodierungen, eine Zusammenfassung „Wer schaut was“ und ein Zähler pro Bibliothek.

:bullseye: Szenen

Vier Auslöser, Wiedergabe gestartet / pausiert / fortgesetzt / gestoppt, filterbar nach Player und Medientyp (Film, Episode, Musik, Live-TV…):

:clapper_board: Ein Film startet auf dem Wohnzimmer-TV → gedimmtes Licht
:pause_button: Pause → Licht wieder an

Und zwei Szenenaktionen:

  • :bell: Nachricht auf einem Player anzeigen: „Es klingelt an der Tür“ über dem Film
  • :popcorn: Medien auf einem Player abspielen: Suche einen Titel in der Bibliothek (Film, Serie, Album, Künstler, Wiedergabeliste) und starte ihn, zufällig, wenn nötig

:framed_picture: Widgets

  • Aktuell abgespielt: Wer schaut was, wo, mit den Postern
  • Player: Die aktuelle Wiedergabe als Fernbedienung (Hintergrundbild, Titel, verbleibende Zeit, Buttons). Leere Einstellung = es folgt, was gespielt wird; oder wählen Sie einen bestimmten Player
  • Neu hinzugefügt: Die Poster der neuesten Filme, Serien oder Alben, neue Episoden gruppiert nach Serie

Installation

:warning: Gladys 5.1 mindestens.

  1. Erstellen Sie einen API-Schlüssel für Gladys: unter Jellyfin, Dashboard → API-Schlüssel; unter Emby, Einstellungen → Erweitert → API-Schlüssel
  2. In Gladys: Integrationen → Multimedia → Jellyfin & Emby
  3. Geben Sie die Server-URL (http://ip-des-servers:8096, oder Ihre https-Adresse) und den Schlüssel ein, dann Verbindung testen
  4. Registerkarte Entdeckung: Fügen Sie den Server und Ihre Player hinzu

Ein Player erscheint nur, wenn er mit dem Server verbunden ist: Öffnen Sie die App auf dem TV, dann klicken Sie auf „Player suchen“.

Was ich gerne von euch getestet hätte :folded_hands:

Ich habe es auf Jellyfin 10.11 und 12.1 und auf Emby 4.10 getestet, mit einem simulierten Player. Mir fehlen die echten Bedingungen:

  • eure TV-Apps (Android TV, Fire TV, LG, Samsung…): die Buttons, die Lautstärke, die Bildschirmanzeige
  • Emby: alles, und insbesondere Intro und Abspann
  • ein Server hinter einem Reverse Proxy: wenn das WebSocket nicht durchkommt, weicht die Integration auf eine Abfrage alle 15 s aus (sagt mir Bescheid, wenn das der Fall ist, die Logs zeigen es an)

Im Fehlerfall helfen mir die Logs der Integration, die in Gladys sichtbar sind, enorm.

Es ist eine 0.2.0: Die 1.0 kommt mit eurem Feedback. Code, FR/EN-Dokumentation und Tests: GitHub - guim31/gladys-jellyfin · GitHub

Hallo und danke :television:

Getestet mit meinem Jellyfin-Server hinter einem Proxy (aber der Websocket funktioniert) :white_check_mark:
Geräte wurden entdeckt und erfolgreich hinzugefügt.
Die Widgets zeigen die Abspielgeräte/Wiedergaben kurz und die neuesten Hinzufügungen an :star_struck:
Die Aktionen und Auslöser funktionieren, außer die für Nachricht senden (getestet mit dem offiziellen iPhone-Client und dem offiziellen Apple TV).
Die Funktionen Pause/Wiedergabe und Stop funktionieren auf dem Widget (aber mit einigen Sekunden Verzögerung bei der Rückmeldung des Status). Allerdings funktioniert nichts mit dem „Weiter“-Button.

Hier sind meine Logs:

[2026-09-27T20:31:16.413Z] [INFO] Starte die Jellyfin & Emby-Integration v0.2.0...
[2026-09-27T20:31:17.027Z] [INFO] [gladys-sdk] Verbunden mit Gladys (http://172.30.0.1:80)
[2026-09-27T20:31:17.119Z] [INFO] Warten auf die Konfiguration (Server-URL + API-Schlüssel)
[2026-09-27T20:32:03.208Z] [INFO] onConfigUpdated -> Neue Konfiguration erhalten
[2026-09-27T20:32:03.401Z] [INFO] [media-monitor] Verbunden mit Jellyfin-Server "99b9829bee05" (v12.1.0)
[2026-09-27T20:32:03.478Z] [INFO] [media-monitor] Neues Abspielgerät entdeckt: Firefox (Jellyfin Web)
[2026-09-27T20:32:03.871Z] [INFO] [media-socket] Echtzeit-Socket verbunden
[2026-09-27T20:32:07.675Z] [INFO] [media-monitor] Verbunden mit Jellyfin-Server "99b9829bee05" (v12.1.0)
[2026-09-27T20:32:07.694Z] [INFO] [media-monitor] Neues Abspielgerät entdeckt: Firefox (Jellyfin Web)
[2026-09-27T20:32:39.225Z] [INFO] [media-monitor] Neues Abspielgerät entdeckt: iPhone von Cyril (Jellyfin iOS)
[2026-09-27T20:32:39.382Z] [INFO] [media-monitor] Scene-Event playback_started: Severance - S01E02 - Halbschleife auf iPhone von Cyril
[2026-09-27T20:32:50.765Z] [INFO] onDeviceCreated <- ext:ext-guim31-gladys-jellyfin:player:62eff0df731b02bf
[2026-09-27T20:32:52.309Z] [INFO] onDeviceCreated <- ext:ext-guim31-gladys-jellyfin:server:76b6e7325e104d378c17f1432a1a0dde
[2026-09-27T20:35:20.643Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:62eff0df731b02bf:pause = 1
[2026-09-27T20:35:20.731Z] [INFO] [media-monitor] Pause-Befehl an iPhone von Cyril gesendet
[2026-09-27T20:35:29.191Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:62eff0df731b02bf:pause = 1
[2026-09-27T20:35:29.243Z] [INFO] [media-monitor] Pause-Befehl an iPhone von Cyril gesendet
[2026-09-27T20:35:35.099Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:62eff0df731b02bf:stop = 1
[2026-09-27T20:35:35.176Z] [INFO] [media-monitor] Stop-Befehl an iPhone von Cyril gesendet
[2026-09-27T20:35:50.401Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:62eff0df731b02bf:pause = 1
[2026-09-27T20:35:50.479Z] [INFO] [media-monitor] Pause-Befehl an iPhone von Cyril gesendet
[2026-09-27T20:37:57.838Z] [INFO] [media-monitor] Nachricht auf iPhone von Cyril angezeigt
[2026-09-27T20:38:27.762Z] [INFO] [media-monitor] "Vaiana, die Legende des verborgenen Meeres (2016)" auf iPhone von Cyril abgespielt
[2026-09-27T20:38:31.917Z] [INFO] [media-monitor] "Vaiana, die Legende des verborgenen Meeres (2016)" auf iPhone von Cyril abgespielt
[2026-09-27T20:39:26.866Z] [INFO] [media-monitor] Scene-Event playback_paused: Severance - S01E02 - Halbschleife auf iPhone von Cyril
[2026-09-27T20:39:30.246Z] [INFO] [media-monitor] Neues Abspielgerät entdeckt: AppleTV (Swiftfin tvOS)
[2026-09-27T20:39:40.014Z] [INFO] [media-monitor] "Vaiana, die Legende des verborgenen Meeres (2016)" auf iPhone von Cyril abgespielt
[2026-09-27T20:40:11.116Z] [INFO] onDeviceCreated <- ext:ext-guim31-gladys-jellyfin:player:aa7023ad2115e61c
[2026-09-27T20:40:26.749Z] [INFO] [media-monitor] "Severance" auf AppleTV abgespielt
[2026-09-27T20:40:32.684Z] [INFO] [media-monitor] Scene-Event playback_started: Severance - S01E01 - Die gute Seite der Hölle auf AppleTV
[2026-09-27T20:41:01.842Z] [INFO] [media-monitor] Scene-Event playback_paused: Severance - S01E01 - Die gute Seite der Hölle auf AppleTV
[2026-09-27T20:41:14.032Z] [INFO] [media-monitor] Scene-Event playback_resumed: Severance - S01E01 - Die gute Seite der Hölle auf AppleTV
[2026-09-27T20:41:29.032Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:aa7023ad2115e61c:pause = 1
[2026-09-27T20:41:29.120Z] [INFO] [media-monitor] Pause-Befehl an AppleTV gesendet
[2026-09-27T20:41:31.034Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:aa7023ad2115e61c:pause = 1
[2026-09-27T20:41:31.042Z] [INFO] [media-monitor] Pause-Befehl an AppleTV gesendet
[2026-09-27T20:41:34.246Z] [INFO] [media-monitor] Scene-Event playback_paused: Severance - S01E01 - Die gute Seite der Hölle auf AppleTV
[2026-09-27T20:41:35.699Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:aa7023ad2115e61c:play = 1
[2026-09-27T20:41:35.709Z] [INFO] [media-monitor] Wiedergabe-Befehl an AppleTV gesendet
[2026-09-27T20:41:40.846Z] [INFO] [media-monitor] Scene-Event playback_resumed: Severance - S01E01 - Die gute Seite der Hölle auf AppleTV
[2026-09-27T20:41:48.766Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:aa7023ad2115e61c:next = 1
[2026-09-27T20:41:48.843Z] [INFO] [media-monitor] Weiter-Befehl an AppleTV gesendet
[2026-09-27T20:41:58.735Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:aa7023ad2115e61c:stop = 1
[2026-09-27T20:41:58.793Z] [INFO] [media-monitor] Stop-Befehl an AppleTV gesendet
[2026-09-27T20:41:58.923Z] [INFO] [media-monitor] Scene-Event playback_stopped: Severance - S01E01 - Die gute Seite der Hölle auf AppleTV
[2026-09-27T20:42:11.278Z] [INFO] [media-monitor] Scene-Event playback_started: Severance - S01E02 - Halbschleife auf AppleTV
[2026-09-27T20:42:15.261Z] [INFO] onSetValue <- ext:ext-guim31-gladys-jellyfin:player:aa7023ad2115e61c:pause = 1
[2026-09-27T20:42:15.352Z] [INFO] [media-monitor] Pause-Befehl an AppleTV gesendet
[2026-09-27T20:42:20.614Z] [INFO] [media-monitor] Scene-Event playback_paused: Severance - S01E02 - Halbschleife auf AppleTV

Super Rückmeldungen, ich schau mir das morgen an!

Die 0.2.1 ist verfügbar, hier sind die Ergebnisse deiner Rückmeldungen:

:next_track_button: Die „Weiter“-Taste: Swiftfin (wie Jellyfin für Android TV) springt nur zur nächsten Folge, wenn eine Wiedergabeliste vorhanden ist, was bei einer einzelnen gestarteten Folge nicht der Fall ist. Jetzt, bei einer Folge, fordern „Weiter“ und „Zurück“ die benachbarte Folge vom Server an und starten sie direkt. Das funktioniert überall, wo die Aktion „Medien abspielen“ funktioniert, und das hat bei dir schon funktioniert :wink:

:stopwatch: Die Latenz beim Status: In deinen Logs meldet die App ihre Pause etwa 5 Sekunden nach dem Befehl, und Gladys begrenzt das Aktualisieren eines Widgets auf einmal alle 10 Sekunden. Zwei Änderungen: Die Tasten des Player-Widgets nutzen jetzt „Widget-Aktionen“, die Gladys sofort nach dem Drücken neu lädt, und der erwartete Status wird sofort angezeigt, bevor er von der App bestätigt wird. Kein Doppeldruck mehr :grinning_face_with_smiling_eyes:

:bell: Die Nachricht: Hier liegt es nicht an der Integration, der Server empfängt den Befehl korrekt („Nachricht angezeigt“ in deinen Logs). Es liegt an der App, ob sie die Nachricht anzeigt:

  • Swiftfin unterstützt noch keine Nachrichten (das ist wörtlich ein TODO in ihrem Code :sweat_smile:)
  • Die offizielle iOS-App zeigt sie nicht während eines Videos an
  • Der Web-Client und Jellyfin für Android TV zeigen sie korrekt an

Das ist jetzt in der Dokumentation und in der Beschreibung der Aktion vermerkt.

Lass mich wissen, ob es bei dir jetzt besser ist!