• v0.9.0 258e2bd84d

    feat: implement export engine

    fabi released this 2026-04-02 18:56:21 +00:00 | 35 commits to main since this release

    Add async ZIP and HTML offline viewer export workers, download endpoints,
    and a guest-facing /export page.

    Backend — export workers (tokio::spawn, run after gallery release):

    • ZIP worker: streams all non-deleted originals into Gallery.zip via
      async_zip (Stored compression), organised into Photos/ and Videos/
      with {date}{uploader}{id}.{ext} filenames; updates progress_pct in DB
    • HTML worker: renders Memories.html via minijinja template (self-contained:
      inlined CSS + JS, relative media paths); packs it with README.txt and
      all media into Memories.zip (Deflate for text, Stored for media)
    • Both workers mark export_job status (running → done/failed), update
      export_zip_ready / export_html_ready on the event, and broadcast SSE
      export-progress + export-available when both complete

    Backend — new endpoints (AuthUser):

    • GET /export/zip → streams Gallery.zip if export_zip_ready
    • GET /export/html → streams Memories.zip if export_html_ready
    • GET /export/status → released flag + per-type status/progress (moved from admin)

    Memories.html features: warm keepsake aesthetic, responsive grid, fullscreen
    lightbox with captions/comments/likes, client-side hashtag filter chips,
    XSS-safe JS, fully offline (no external deps)

    Frontend — /export page:

    • Locked state: padlock illustration + message
    • Released state: ZIP and HTML cards with progress bars (SSE-driven),
      download buttons enabled only when ready
    • HTML guide modal (unzip instructions + Wi-Fi tip) before download begins

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

    Downloads