import type { PluginManifest } from '@@/plugins/manifest'; /** * Jellyfin — films and shows from your own server, with a player that handles direct, HLS and * progressive playback. * * ── What this plugin is, and what it is not ── * * It does not install or supervise Jellyfin, and it stores no media. You point it at a server and it * speaks Jellyfin's API on your behalf, holding the access token server-side so no device carries it. * * ── Where the connection lives ── * * In this plugin's OWN table, unlike transmission and soulseek. `jellyfin_servers` is a registry — label, * URL, encrypted token, one active — because more than one Jellyfin really is a thing someone has (a * home server and a friend's, say). That is the same reason `photos_config` is plural and * `service_connections` is not. * * ── The vendored player ── * * `web/vendor/hls.mjs` is a checked-in third-party build, ~1.3 MB. It is deliberately excluded from * formatting and lint: reformatting it would destroy the diff against upstream, which is the only thing * that makes a vendored library reviewable. See the README beside it. * * ── No `osDependencies` ── * * Nothing shells out. The sidecar speaks Jellyfin's HTTP API over `fetch`, and transcoding is the * server's job, not ours. */ export const manifest: PluginManifest = { publisher: 'officerdev', version: '2026.08.27.01', platform: '>=1.0.0', label: 'Video', summary: 'Films and shows, with a player that handles direct, HLS and progressive', /** the classic self-hosted media case. */ tags: ['Homelab', 'Personal'], icon: 'Clapperboard', color: '#a855f7', // Jellyfin accounts are created one per Officer account. Declared here so the owner sees it on the // install screen beside the permissions — "this plugin will be told who your users are" belongs where a // person decides, not in a log afterwards. // // What it turns on: the sidecar receives `users:list` when it registers and whenever an account is // created or removed. See src/servers/plugins/user-provisioning.ts and plugins/USER_PROVISIONING.md. userProvisioning: true, permissions: [ { key: 'jellyfin', label: 'Video', description: 'Browse and play the Jellyfin library', }, ], };