# External integration - Jellyfin / Emby

**URL:** <https://community.gladysassistant.com/t/integration-externe-jellyfin-emby/10916>\
**Category:** Développement\
**Tags:** integration-externe\
**Created:** [September 27, 2026, 8:11pm UTC](https://community.gladysassistant.com/t/integration-externe-jellyfin-emby/10916 "2026-09-27T20:11:17Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![guim31](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/guim31/32/4840_2.png) [@guim31](https://community.gladysassistant.com/u/guim31)\
**Post date:** [September 27, 2026, 8:11pm UTC](https://community.gladysassistant.com/t/integration-externe-jellyfin-emby/10916/1 "2026-09-27T20:11:17Z")

</div>

![image](https://gladys-assistant-community.b-cdn.net/uploads/default/original/3X/5/5/559d5f2e8249266818ec1a3c904006fa98ddfb06.jpeg)

Hi everyone 👋

As announced in the topic of Home Assistant integrations to port, here is **Jellyfin & Emby** : a single integration for both servers (Jellyfin is a fork of Emby, the API is common), which automatically detects which server it is communicating with. @AlexTrovato, this is your request from August 😉

[screenshot of the dashboard]

## What it does

**One device per player** (TV app, phone, browser):

- ▶ **play, pause, stop, previous, next, rewind and fast forward, volume, mute**
- 🎵 the **playback state** , compatible with the **Music** widget on the dashboard
- 🏷 the **current title** and **remaining time**
- ✨ «&nbsp; **during the intro** &nbsp;» and «&nbsp; **during the credits** &nbsp;»: under Jellyfin 10.10+ with a segments plugin (Chapter Segments Provider, Intro Skipper…), under Emby with its intro detection

**One server device** : current plays, transcodes, a summary of «&nbsp;who is watching what&nbsp;» and a counter per library.

## 🎯 Scenes

Four triggers, **Playback started / paused / resumed / stopped** , filterable by player and media type (movie, episode, music, live TV…):

> 🎬 A **movie** starts on **the living room TV** → dim the lights  
> ⏸ **Pause** → turn them back on

And two scene actions:

- 🔔 **Display a message on a player** : «&nbsp;Someone is at the door&nbsp;» over the movie
- 🍿 **Play a media on a player** : search for a title in the library (movie, series, album, artist, playlist) and play it, randomly if needed

## 🖼 Widgets

- **Now playing** : who is watching what, where, with the posters
- **Player** : the current playback in remote control (background image, title, remaining time, buttons). Blank setting = it follows what is playing; or choose a specific player
- **Recently added** : the posters of the latest movies, series or albums, the new episodes grouped by series

## Installation

⚠ **Gladys 5.1 minimum.**

1. Create an **API key** for Gladys: under Jellyfin, _Dashboard → API Keys_; under Emby, _Settings → Advanced → API Keys_
2. In Gladys: **Integrations → Multimedia → Jellyfin & Emby**
3. Enter the **server URL** (`http://server-ip:8096`, or your https address) and the **key** , then **Test the connection**
4. **Discovery** tab: add the server and your players

A player only appears when it is **connected** to the server: open the app on the TV, then click on «&nbsp;Search for players&nbsp;».

## What I would like you to test 🙏

I tested it on **Jellyfin 10.11 and 12.1** and on **Emby 4.10** , with a simulated player. I am missing real conditions:

- your **TV apps** (Android TV, Fire TV, LG, Samsung…): the buttons, the volume, the on-screen message
- **Emby** : everything, and especially the intro and the credits
- a server **behind a reverse proxy** : if the WebSocket does not pass, the integration falls back to a query every 15 s (let me know if this is the case, the logs report it)

In case of trouble, the integration logs, visible in Gladys, help me a lot.

This is a **0.2.0** : the 1.0 will come with your feedback. Code, FR/EN doc and tests: [GitHub - guim31/gladys-jellyfin · GitHub](https://github.com/guim31/gladys-jellyfin)

---

<div class="post-metadata">

**Author:** ![cicoub13](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/cicoub13/32/4482_2.png) [@cicoub13](https://community.gladysassistant.com/u/cicoub13)\
**Post date:** [September 27, 2026, 8:46pm UTC](https://community.gladysassistant.com/t/integration-externe-jellyfin-emby/10916/2 "2026-09-27T20:46:26Z")

</div>

Hi and thanks 📺

Tested with my Jellyfin server behind a proxy (but the websocket works) ✅  
Devices discovered and added successfully.  
The widgets display the players/playbacks in short and the latest additions 🤩  
Actions and triggers work except the one to **send a message** (tested with the official iPhone client and the official Apple TV).  
The Pause/Play and Stop functions work on the widget (but with a few seconds of latency on the state return). However, nothing at all with the next button.

Here are my logs :

```auto
[2026-09-27T20:31:16.413Z] [INFO] Starting the Jellyfin & Emby integration v0.2.0...
[2026-09-27T20:31:17.027Z] [INFO] [gladys-sdk] connected to Gladys (http://172.30.0.1:80)
[2026-09-27T20:31:17.119Z] [INFO] Waiting for the configuration (server URL + API key)
[2026-09-27T20:32:03.208Z] [INFO] onConfigUpdated -> new configuration received
[2026-09-27T20:32:03.401Z] [INFO] [media-monitor] Connected to Jellyfin server "99b9829bee05" (v12.1.0)
[2026-09-27T20:32:03.478Z] [INFO] [media-monitor] New player discovered: Firefox (Jellyfin Web)
[2026-09-27T20:32:03.871Z] [INFO] [media-socket] Real-time socket connected
[2026-09-27T20:32:07.675Z] [INFO] [media-monitor] Connected to Jellyfin server "99b9829bee05" (v12.1.0)
[2026-09-27T20:32:07.694Z] [INFO] [media-monitor] New player discovered: Firefox (Jellyfin Web)
[2026-09-27T20:32:39.225Z] [INFO] [media-monitor] New player discovered: Cyril's iPhone (Jellyfin iOS)
[2026-09-27T20:32:39.382Z] [INFO] [media-monitor] Scene event playback_started: Severance - S01E02 - Half Loop on Cyril's iPhone
[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] Command pause sent to Cyril's iPhone
[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] Command pause sent to Cyril's iPhone
[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] Command stop sent to Cyril's iPhone
[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] Command pause sent to Cyril's iPhone
[2026-09-27T20:37:57.838Z] [INFO] [media-monitor] Message displayed on Cyril's iPhone
[2026-09-27T20:38:27.762Z] [INFO] [media-monitor] Playing "Moana (2016)" on Cyril's iPhone
[2026-09-27T20:38:31.917Z] [INFO] [media-monitor] Playing "Moana (2016)" on Cyril's iPhone
[2026-09-27T20:39:26.866Z] [INFO] [media-monitor] Scene event playback_paused: Severance - S01E02 - Half Loop on Cyril's iPhone
[2026-09-27T20:39:30.246Z] [INFO] [media-monitor] New player discovered: AppleTV (Swiftfin tvOS)
[2026-09-27T20:39:40.014Z] [INFO] [media-monitor] Playing "Moana (2016)" on Cyril's iPhone
[2026-09-27T20:40:11.116Z] [INFO] onDeviceCreated <- ext:ext-guim31-gladys-jellyfin:player:aa7023ad2115e61c
[2026-09-27T20:40:26.749Z] [INFO] [media-monitor] Playing "Severance" on AppleTV
[2026-09-27T20:40:32.684Z] [INFO] [media-monitor] Scene event playback_started: Severance - S01E01 - The Good Half on AppleTV
[2026-09-27T20:41:01.842Z] [INFO] [media-monitor] Scene event playback_paused: Severance - S01E01 - The Good Half on AppleTV
[2026-09-27T20:41:14.032Z] [INFO] [media-monitor] Scene event playback_resumed: Severance - S01E01 - The Good Half on 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] Command pause sent to AppleTV
[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] Command pause sent to AppleTV
[2026-09-27T20:41:34.246Z] [INFO] [media-monitor] Scene event playback_paused: Severance - S01E01 - The Good Half on 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] Command play sent to AppleTV
[2026-09-27T20:41:40.846Z] [INFO] [media-monitor] Scene event playback_resumed: Severance - S01E01 - The Good Half on 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] Command next sent to AppleTV
[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] Command stop sent to AppleTV
[2026-09-27T20:41:58.923Z] [INFO] [media-monitor] Scene event playback_stopped: Severance - S01E01 - The Good Half on AppleTV
[2026-09-27T20:42:11.278Z] [INFO] [media-monitor] Scene event playback_started: Severance - S01E02 - Half Loop on 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] Command pause sent to AppleTV
[2026-09-27T20:42:20.614Z] [INFO] [media-monitor] Scene event playback_paused: Severance - S01E02 - Half Loop on AppleTV

```

---

<div class="post-metadata">

**Author:** ![guim31](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/guim31/32/4840_2.png) [@guim31](https://community.gladysassistant.com/u/guim31)\
**Post date:** [September 27, 2026, 8:55pm UTC](https://community.gladysassistant.com/t/integration-externe-jellyfin-emby/10916/3 "2026-09-27T20:55:13Z")

</div>

Great feedback, I’ll check it out tomorrow!

---

<div class="post-metadata">

**Author:** ![guim31](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/guim31/32/4840_2.png) [@guim31](https://community.gladysassistant.com/u/guim31)\
**Post date:** [September 28, 2026, 5:46am UTC](https://community.gladysassistant.com/t/integration-externe-jellyfin-emby/10916/4 "2026-09-28T05:46:52Z")

</div>

Version **0.2.1** is out, here’s what your feedback led to:

**⏭ The Next button** : Swiftfin (like Jellyfin for Android TV) only moves to the next item if it has a playback queue, which is not the case for a single episode. Now, on an episode, Next and Previous request the neighboring episode from the server and launch it directly. It works everywhere the «&nbsp;Play media&nbsp;» action works, and it worked for you 😉

**⏱ Latency on state** : in your logs, the app reports its pause about 5 seconds after the command, and Gladys limits widget refreshes to once every 10 seconds. Two changes: the Player widget buttons now use «&nbsp;widget actions,&nbsp;» which Gladys reloads immediately upon press, and the expected state is displayed right away before being confirmed by the app. No more double-tapping 😄

**🔔 The message** : here, it’s not the integration, the server receives the command correctly («&nbsp;Message displayed&nbsp;» in your logs). It’s the application that chooses to display it:

- Swiftfin doesn’t handle messages yet (it’s literally a TODO in its code 😅)
- the official iOS app doesn’t display it during a video
- the web client and Jellyfin for Android TV display it correctly

This is now specified in the documentation and in the action description.

Let me know if it’s better on your end!

---

<div class="post-metadata">

**Author:** ![cicoub13](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/cicoub13/32/4482_2.png) [@cicoub13](https://community.gladysassistant.com/u/cicoub13)\
**Post date:** [September 28, 2026, 9:11pm UTC](https://community.gladysassistant.com/t/integration-externe-jellyfin-emby/10916/5 "2026-09-28T21:11:38Z")

</div>

Next Button ✅  
Latency ✅ it’s hyper responsive  
Message ✅ on a Web client

Thanks 🤝

---

<div class="post-metadata">

**Author:** ![guim31](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/guim31/32/4840_2.png) [@guim31](https://community.gladysassistant.com/u/guim31)\
**Post date:** [September 28, 2026, 9:44pm UTC](https://community.gladysassistant.com/t/integration-externe-jellyfin-emby/10916/6 "2026-09-28T21:44:39Z")

</div>

Well that’s cool 👍
