5e50d0e1

Author: Michael Lynch <git@mtlynch.io>

Committer: Michael Lynch <mtlynch@noreply.codeberg.org>

Split convert package by abstraction level (#231)

The convert package mixed four altitudes: a storage abstraction, image
primitives, fs-to-storage transform pipelines, and ffmpeg primitives.
Separate them to match the layout the upload work (slice-3) builds on:

- mediastore: MediaWriter/LocalWriter/WriteFile plus a generic
  WriteConverted helper that consolidates the temp-file-and-write pipeline
  previously duplicated in convert and importers.
- images: pure image primitives (GenerateSquareThumbnail, ResizeToWidth).
- imagepipe: GenerateAndWriteSquareThumbnail/GenerateAndWriteResized,
  rebuilt on mediastore.WriteConverted + images primitives.
- convert: now only ffmpeg primitives (video, avif); stdlib-only imports.

Migrate all call sites (importers, the import-from-tinybeans main)
accordingly. s3.Writer needs no change since it satisfies the interface
implicitly.

This is the layout half of the slice-3 refactoring, applied to master in
isolation. The slice-3-only helpers that serve upload functionality
(mediastore.WriteProduced, images.Dimensions, images.Reencode) are
intentionally deferred to slice-3.

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

Reviewed-on: https://codeberg.org/mtlynch/little-moments/pulls/231

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 1s 6s 6s 7s 1s
Eval 6s 45s 45s 51s 0s
Build 11s 5m34s 1m04s 1m15s 0s
Suite 1s 6m26s 1m13s 1m15s 1s

Timeline

0s10s20s30s40s50s1m1m10s