By: Michael Lynch <git@mtlynch.io>
Replace filename/thumbnail_filename with file_id + original_filename
- 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>