Vellum/internal
mithral 5ea7ffe6c6 Serve transcoded streams over HLS
Third step of ADR-008. Two routes inside the item family: the playlist starts
the session lazily and serves what ffmpeg has written so far, so playback can
begin while the rest still encodes; the segment route serves one .ts.

Segment names are validated against the exact shape ffmpeg writes before being
used as a path. Verified red-green: removing the check serves a file from
outside the session directory with a 200.

Two corrections made in review.

1. The manager was being built inside NewHandlers, which meant nothing could
   ever shut it down. Its reaper would run for the process lifetime and a
   running ffmpeg would outlive the server that started it. It is now created
   in main.go beside the job queue and deferred, and passed in - the same
   ownership the queue already has.

2. A playlist request could 404 before ffmpeg wrote the file, which a native
   HLS player treats as fatal rather than retrying. The playlist handler now
   waits up to four seconds for the first write. Segments are never waited for.

Verified end-to-end against a running server with real hardware: a 30-second
file produced a valid EVENT playlist in about a second (the wait doing its
job - no 404), a 658 KB segment with Content-Type video/mp2t, a 404 for a
traversal attempt, and a 401 unauthenticated.

Also confirmed at boot: all four metadata providers report their disabled
state and name their env var, including the new adult one.
2026-10-12 12:00:20 -04:00
..
apitoken Waves 9-10: Jellyfin and Subsonic clients can browse and play 2026-10-11 15:05:43 -04:00
arch Detect transcode hardware, and prove it can actually encode 2026-10-12 11:49:05 -04:00
auth Rate limit every surface that checks a password 2026-10-12 00:57:56 -04:00
catalog Expose the television tree: catalog reads, API routes, Jellyfin shapes 2026-10-12 01:41:05 -04:00
cli Documentation, and make a fresh clone actually work 2026-10-12 00:18:11 -04:00
core Add a ThePornDB provider for the adult kind 2026-10-12 11:30:58 -04:00
discovery Advertise Vellum over mDNS so clients find it without a typed URL 2026-10-12 01:04:33 -04:00
engine Waves 7-8: playback engine selection, and missing files you can see 2026-10-11 14:36:55 -04:00
home Phase 2: split the fat packages along real boundaries 2026-10-11 16:03:10 -04:00
httpapi Documentation, and make a fresh clone actually work 2026-10-12 00:18:11 -04:00
httpx
jellyfin Expose the television tree: catalog reads, API routes, Jellyfin shapes 2026-10-12 01:41:05 -04:00
jobs Wave 1: survive a real library 2026-10-11 13:10:34 -04:00
library Separate video libraries by kind: movies, TV, adult, hentai 2026-10-12 11:20:51 -04:00
media Serve transcoded streams over HLS 2026-10-12 12:00:20 -04:00
metadata Separate video libraries by kind: movies, TV, adult, hentai 2026-10-12 11:20:51 -04:00
modules Phase 1: one item-access seam, and architecture rules that fail the build 2026-10-11 15:47:18 -04:00
natsort
playback Phase 3: a storage seam behind catalog, and one consumer threaded onto it 2026-10-11 16:16:07 -04:00
probe Waves 4-6: audio depth, ffprobe facts, and direct-play video 2026-10-11 14:14:32 -04:00
progress Wave 1: survive a real library 2026-10-11 13:10:34 -04:00
providers Add a ThePornDB provider for the adult kind 2026-10-12 11:30:58 -04:00
scanner Discover and serve subtitle tracks 2026-10-12 11:42:51 -04:00
search Wave 3: search depth, transfer size, and the Home screen's tests 2026-10-11 13:46:18 -04:00
stream Discover and serve subtitle tracks 2026-10-12 11:42:51 -04:00
subsonic Rate limit every surface that checks a password 2026-10-12 00:57:56 -04:00
transcode Add the transcode session manager 2026-10-12 11:54:20 -04:00