fa6019ef

By: Michael Lynch <git@mtlynch.io>

Collapse duplicated animated-photo upload path

ProcessableAnimatedPhoto was identical to ProcessablePhoto and built by the
same resolution check, so the separate type, constructor, handler case, and
process method only duplicated code. Use ProcessablePhoto for both kinds,
select the converter by media type in the handler, and share the full-size
write between ProcessPhoto and ProcessAnimatedPhoto.

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

Suite timing

Time to Start Worker time Duration Time to finish
Config 2s 10s 10s 13s
Eval 10s 52s 52s 1m03s
Build 17s 7m10s 1m18s 1m35s
Suite 2s 8m14s 1m33s 1m35s

Timeline

0s10s20s30s40s50s1m1m10s1m20s1m30s