678b109d

By: Michael Lynch <git@mtlynch.io>

Support video uploads with background transcoding

Owners can now upload a video. The upload is recorded immediately as
"processing" and transcoded to WebM (plus a thumbnail extracted from a still
frame) by a background worker, so the request returns right away. A processing
item is visible only to its uploader until the transcode completes, at which
point it becomes visible to everyone.

This adds a media status model:
- a status column on media_items and a MediaStatus type
- ReadMediaItems is scoped to the viewer so it returns ready items plus the
  viewer's own in-flight uploads
- MarkMediaItemReady flips an item to ready when transcoding finishes
- the media page shows a "processing in progress" notice

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

Suite timing

Time to Start Worker time Duration Time to finish
Config 1s 5s 5s 6s
Eval 6s 2m00s 2m00s 2m06s
Build 7m22s 2m08s 2m31s 9m54s
Suite 1s 4m13s 9m53s 9m54s

Timeline

0s20s40s1m1m20s1m40s2m7m40s8m8m40s9m9m40s