40347d8c

Author: Michael Lynch <git@mtlynch.io>

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

Replace filename/thumbnail_filename with file_id + original_filename (#85)

- Add FileID type and OriginalFilename to MediaItem; drop Filename and
  ThumbnailFilename
- Add MediaTypePhotoAnimated; GIF photo imports become photo-animated entries
- Update migration SQL: file_id + original_filename columns, add
  photo-animated to CHECK constraint
- Update store queries and InsertEntry signature accordingly
- Import CLI now writes {fileID}-o.ext originals plus multi-size variants:
  850px (aspect-ratio resize) and 250px/150px (square crops) for photos;
  thumb-250px/thumb-150px for videos
- Browse handler builds ThumbnailSrc + ThumbnailSrcset from FileID
- Media detail handler builds MediaSrc (850px), OriginalPath, MediaPath
  from FileID + OriginalExt()
- Templates: add srcset/sizes to browse thumbnails; wrap photo img in
  link to original on media detail page
- Add tests for ResizedWidths() and OriginalExt()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Reviewed-on: https://codeberg.org/mtlynch/little-moments/pulls/85
Co-authored-by: Michael Lynch <git@mtlynch.io>
Co-committed-by: Michael Lynch <git@mtlynch.io>

Suite timing

Time to Start Worker time Duration Time to finish
Config 0s 1s 1s 1s
Eval 1s 1m33s 1m33s 1m35s
Build 24s 3m01s 1m10s 1m34s
Test - - - -
Deploy - - - -
Suite 0s 4m36s 1m34s 1m35s

Timeline

0s10s20s30s40s50s1m1m10s1m20s1m30s