Files
officer a7f1a71785 jellyfin, extracted from the platform as a plugin
Eighth plugin out, and the second resurrection: like soulseek, hono.ts carried
the router import and its mount commented out since 2026-08-13, with the
permission reduced to api: [], so the server booted clean while every panel
request 404'd. jellyfin_servers was also absent from the drizzle barrel, so
bun db:push would have dropped it.

Easier than soulseek in one specific way: mountPrefix derives /jellyfin from
the appName, which is exactly what the router already hardcoded, so no frontend
call site needed repointing. Soulseek needed 47 because its appName and its old
prefix differed. The frontend also already routed through one helper, so there
were five call sites rather than forty-seven.

Self-contained, unlike transmission and soulseek: jellyfin_servers is a
registry this plugin owns outright — label, URL, encrypted token, one active —
because more than one Jellyfin is a thing someone has, and more than one
Transmission is not.

Carries its own .prettierignore for the vendored hls.mjs, rather than leaving a
stale rule behind in the platform naming a path that no longer exists.
2026-08-19 03:17:32 +00:00

38 lines
1.5 KiB
Markdown

# Video (Jellyfin)
Films and shows from your own [Jellyfin](https://jellyfin.org) server, inside Officer — with a player
that handles direct play, HLS and progressive, and an access token that never leaves the server.
## What you get
- **Home** — resume, next up, recently added
- **Libraries** — browse films, shows, seasons and episodes
- **Search** across the library
- **A real player** — direct play where the file allows it, HLS where it doesn't, progressive as the
fallback, with playback reported back to Jellyfin so resume works everywhere
- **Multiple servers** — add several and switch between them
## Requirements
A running Jellyfin server Officer can reach, and an access token.
## Setup
Install the plugin, open **/jellyfin**, and add a server: a label, the URL, and the token. The token is
encrypted at rest and never sent to the browser.
Unlike Transmission and Soulseek, this plugin keeps its own registry — `jellyfin_servers` — because
having more than one Jellyfin is a real thing (a home server and a friend's). One is marked active.
The plugin does **not** install or supervise Jellyfin. Point it at one you already run.
## Permissions
One permission, `jellyfin`, grantable per role like any other app permission.
## Notes
- `web/vendor/hls.mjs` is a checked-in third-party build (~1.3 MB), deliberately excluded from
formatting so the diff against upstream stays readable.
- Transcoding is the Jellyfin server's job. This plugin asks for a stream and plays what it gets.