-
Notifications
You must be signed in to change notification settings - Fork 1
jellyfin plugins
Which plugins are worth installing when the stack is tuned for direct play on a native TV client, and why. Written against Jellyfin 10.11 in 2026-08; re-check versions before trusting specifics.
The constraint behind every decision: the primary client is the native Jellyfin app on a Fire Stick
/ Android TV (jellyfin-androidtv). That rules out most of what appears in "best Jellyfin plugins"
lists. Jellyfin runs outside this stack (see cloudflared for addressing it from a
container), and Bazarr owns subtitles.
Intro Skipper cannot be installed. Its manifest URL https://intro-skipper.org/manifest.json
(and manifest.intro-skipper.org) returns a 308 redirect to the bare GitHub org, so Jellyfin
cannot add the repository. Re-verified 2026-08-17. It remains the highest-value plugin here if
distribution is ever fixed, so it is described below.
⚠ Do not install TheIntroDB as a substitute. It looks right — targets 10.11.6+, drives the same
media-segments table, no CPU-heavy fingerprinting. In practice its Dispose() throws:
[FTL] Main: Unhandled Exception
System.ObjectDisposedException: The CancellationTokenSource has been disposed.
at TheIntroDB.TheIntroDbUsageReportingService.Dispose()
That unhandled exception takes down Jellyfin's shutdown path, so the server does not come back after a restart and must be started by hand. It also produced zero segments across 206 lookups, warning every ~2 minutes. Remove its repository as well as the plugin.
Removing any media-segment provider purges the segments table. Re-run the Media Segment Scan task afterwards or every skip button silently disappears.
Net effect: intro skipping comes from Chapter Segments Provider alone.
Server-side plugins run inside the server process — metadata, media segments, scrobbling, reporting. Their effects reach every client.
Web-UI plugins inject JavaScript or CSS into jellyfin-web. The Fire Stick app is a separate
Android application that never loads that page, so these are completely inert on the main viewing
device: Jellyfin Enhanced, Media Bar, Home Sections, Collection Sections, Custom Tabs, HoverTrailer,
InPlayerEpisodePreview, JellyfinTweaks, KefinTweaks, the JavaScript Injector, and every skin.
If a plugin's selling point is how the interface looks, assume it does nothing here.
Intro Skipper — fingerprints audio across a season, finds repeated intro and credit sequences, and writes typed entries into the media segments table. The Android TV client reads that type natively and shows a real skip button. Not in the official catalog. Needs ≥10.11.11 — don't roll the server back below that without uninstalling first. The analysis scan decodes audio across the whole library, so schedule it off-hours. Does not work when playback is handed to an external player.
Chapter Segments Provider — official, v4.0.0.0. Reads chapter titles already in the file,
pattern-matches them (Intro, Recap, Credits, Previously On, …) and writes the same typed
segments, so the same skip button. Database rows only: no decoding, effectively instant.
It depends entirely on releases carrying meaningful chapter names. A 25-file sample from one library:
| Result | Count | Examples |
|---|---|---|
| Usable intro/recap titles | 6 (24%) | Obi-Wan Kenobi, House of the Dragon, Superman & Lois, Blue Mountain State |
Credits only |
3 (12%) | Tangled, Toy Story 2 |
| No chapters at all | 16 (64%) | Netflix WEBRips, most movie rips |
The pattern: Disney+ and HBO sources carry rich chapter names; Netflix WEBRip and most movie releases carry none. Survey your own library:
docker exec bazarr ffprobe -v error -show_chapters -of json "/data/complete/tv/<show>/<file>.mkv"(That path assumes docker-compose.override.yml; without it Bazarr sees /tv and /movies.)
TMDb Box Sets — official, v13.0.0.0. Builds collections from TMDb box-set data. Server-side, so collections appear in the Fire Stick UI like any other item.
Playback Reporting — official, v17.0.0.0. Who watched what, when, and critically, what transcoded. The only good instrument for finding files the Fire Stick can't direct-play, which is the central question on a stack tuned for direct play.
| Plugin | Version | Why |
|---|---|---|
| Trakt | 30.0.0.0 | Scrobbles from any client, Fire Stick included, because scrobbling is server-side. |
| Reports | 18.0.0.0 | Library auditing — gaps, quality, missing metadata. |
| Transcode Killer | 4.0.0.0 | Kills any transcoding session, forcing direct play or failure. Blunt, but surfaces problem files fast. |
| Merge Versions | third-party | Merges duplicate 1080p/4K entries into one item with a version picker. Needs danieladov's repo; verify the 10.11 build. |
- Open Subtitles — Bazarr owns subtitles here. Two systems writing subtitle files for the same media.
- JellyScrub — superseded. Trickplay is built into 10.11: enable it on the libraries, then turn on Developer options → Enable trickplay in video player in the Android TV app.
- Every web-UI plugin — see the rule above.
The reference Bazarr config in ${CONFIG_ROOT}/config/bazarr/config/config.yaml:
| Setting | Value | Meaning |
|---|---|---|
use_embedded_subs |
false |
Embedded tracks do not satisfy a language requirement |
enabled_providers |
opensubtitlescom, gestdown, subf2m, yifysubtitles
|
embeddedsubtitles is configured but not enabled |
subfolder |
current |
Sidecar files land next to the video |
ignore_pgs_subs / ignore_vobsub_subs
|
true |
Inert unless use_embedded_subs is on |
So this is not "embedded first, Bazarr as fallback" — Bazarr downloads an external subtitle for essentially everything. Both tracks appear in the picker and Jellyfin's default-track logic chooses.
Subtitle Extract (catalog v7.0.0.0) — skip, conditionally. It pre-extracts embedded subtitle
streams so Jellyfin doesn't run ffmpeg on demand. It writes to Jellyfin's internal cache
(/config/data/subtitles, keyed by item ID), not sidecar files, so it cannot collide with Bazarr.
It's skipped only because with use_embedded_subs: false a Bazarr sidecar already exists nearly
everywhere, so the stall it prevents rarely happens. It also never prunes its cache when media is
deleted.
If you enable embedded subtitles, which way you do it inverts the answer:
-
use_embedded_subs: true(Bazarr accepts embedded tracks and stops fetching externals) → more playback uses embedded tracks, the extraction stall becomes real, so install Subtitle Extract. Keepignore_pgs_subsandignore_vobsub_substrue; they go live under this setting and correctly force a text subtitle for image-only files. -
The
embeddedsubtitlesprovider (Bazarr extracts tracks out to sidecars) → nothing is left for Jellyfin to extract, so Subtitle Extract stays redundant.
The constraint neither changes: image subtitles (PGS, VOBSUB) cannot be sent as a separate stream. Jellyfin burns them into the picture, forcing a full video transcode even on a file that would otherwise direct-play. No plugin fixes this — always having a text subtitle does, which is what Bazarr is already for.
Installing segment plugins is half the job. In the Android TV app:
-
Playback → Media Segments — set Intro and Outro to
SkiporAsk to skip. Left at the default, the plugins produce no visible behaviour at all. - Developer options → Enable trickplay in video player — experimental, off by default.
Segment skipping does not work with an external player.
Catalog plugins install from Dashboard → Plugins → Catalog, or via the API. Jellyfin must restart before a plugin loads.
J=http://JELLYFIN_HOST:8096
K=$(python3 -c "import json;print(json.load(open('.claude/settings.json'))['services']['jellyfin']['apiKey'])")
curl -s -H "X-Emby-Token: $K" "$J/Plugins" | python3 -c \
"import json,sys;[print(p['Name'],p['Version'],p['Status']) for p in json.load(sys.stdin)]"
curl -s -X POST -H "X-Emby-Token: $K" "$J/Packages/Installed/Chapter%20Segments%20Provider"Everything the catalog has a 10.11 build for:
curl -s -H "X-Emby-Token: $K" "$J/Packages" | python3 -c "
import json,sys
for p in json.load(sys.stdin):
ok=[v for v in p.get('versions',[]) if v.get('targetAbi','').startswith('10.11')]
print(('YES ' if ok else '-- ')+p['name']+' | '+(ok[0]['version'] if ok else 'no 10.11 build'))
"| Plugin | Source | Status |
|---|---|---|
| Intro Skipper | intro-skipper.org |
Uninstallable — manifest 308s. Would need ≥10.11.11, scan off-hours |
| TheIntroDB | Third-party | Do not install — crashes Jellyfin's shutdown path |
| Chapter Segments Provider | Official | Install |
| TMDb Box Sets | Official | Install |
| Playback Reporting | Official | Install |
| Trakt / Reports / Transcode Killer | Official | Optional |
| Merge Versions | Third-party | Optional, verify 10.11 build |
| Subtitle Extract | Official |
Conditional — only if use_embedded_subs: true
|
| Open Subtitles | Official | Skip — Bazarr owns subtitles |
| JellyScrub | Third-party | Skip — built into 10.11 |
| Any web-UI plugin | — | Skip — inert on Fire Stick |