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.
48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
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: '1.0.0',
|
|
platform: '>=1.0.0',
|
|
|
|
label: 'Video',
|
|
summary: 'Films and shows, with a player that handles direct, HLS and progressive',
|
|
icon: 'Clapperboard',
|
|
color: '#a855f7',
|
|
|
|
permissions: [
|
|
{
|
|
key: 'jellyfin',
|
|
label: 'Video',
|
|
description: 'Browse and play the Jellyfin library',
|
|
},
|
|
],
|
|
};
|