dc12e08a

By: Michael Lynch <git@mtlynch.io>

Make video transcoding durable and tune the encoder

Rework background video transcoding so it survives restarts and fails
visibly, and tune ffmpeg for the resolutions we actually serve.

- Treat media_items 'processing' rows as a durable queue: the worker
  drains the DB (ReadNextProcessingVideo) and resumes any video left
  processing by a crash or restart. The HTTP handler no longer blocks
  on a full in-memory channel.
- Retain original video uploads under --originals-dir (defaults beside
  the DB) as both the worker's transcode source and the record DESIGN
  requires, instead of a deleted temp file.
- Add a 'failed' media status so a deterministic transcode error shows
  the uploader a re-upload notice rather than a perpetual "processing"
  one. Crash -> still processing (retried); error -> failed.
- Shut down gracefully: cancel the in-flight ffmpeg on SIGTERM via
  exec.CommandContext and an http.Server/Server.Shutdown handshake; the
  cancelled item stays processing and resumes next start.
- Cap served video to a 2560px box (no upscale), add VP9 speed flags,
  and seek past the blank opening frame for thumbnails. Missing ffmpeg
  or ffprobe surfaces at conversion time, not startup.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Suite timing

Time to Start Worker time Duration Time to finish
Config 1s 11s 11s 12s
Eval 10s 51s 51s 1m02s
Build 15s 5m34s 1m03s 1m19s
Suite 1s 6m36s 1m17s 1m19s

Timeline

0s10s20s30s40s50s1m1m10s