Plugin framework for photo source backends:
- PhotoProvider ABC with lifecycle hooks, auth flow, cache control
- @register_provider decorator + registry for auto-discovery
- ProviderManager handles instance lifecycle, config persistence,
aggregated photo pool with weighted random selection
- ProviderCache: in-memory list cache (per-provider TTL), disk-based
thumbnail cache, optional full image cache for remote providers
- Per-image settings migrated from bare filenames to composite keys
(provider_id:photo_id) with automatic one-time migration + backup
Local directory provider included as reference implementation — wraps
the existing filesystem logic into the provider interface with upload
and delete support.
All existing endpoints preserved with composite key routing. ESP32
firmware unchanged — still hits GET /photo, gets a JPEG.
New API: /api/providers/* for managing provider instances, auth flows,
and cache control.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ESP32-S3 firmware (PlatformIO) that fetches JPEGs from a photo server,
decodes on-device with PSRAM, Floyd-Steinberg dithers to the Spectra 6
6-color palette, and displays on a 7.3" GDEP073E01 e-paper panel.
Deep sleeps 1 hour between updates.
Photo server (Python/Flask) with web UI for photo management, Traefik
routing at photos.haunt.house with Google OAuth, and Home Assistant
REST sensor integration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>