• v2.5.62
    All checks were successful
    Release / Test backend (push) Successful in 37s
    Release / Check ui (push) Successful in 44s
    Release / Docker / caddy (push) Successful in 48s
    Release / Docker / backend (push) Successful in 4m38s
    Release / Docker / runner (push) Successful in 2m49s
    Release / Docker / ui (push) Successful in 2m13s
    Release / Gitea Release (push) Successful in 57s
    Stable

    gitea-actions released this 2026-04-04 19:49:53 +05:00 | -365 commits to main since this release

    Previously all voices waited for full TTS generation before first byte
    reached the browser (POST → poll → presign flow). For long chapters this
    meant 2–5 minutes of silence.

    New flow for Kokoro and PocketTTS:

    • tryPresign fast path unchanged (audio in MinIO → seekable presigned URL)
    • On cache miss: set audioEl.src to /api/audio-stream/{slug}/{n} and mark
      status=ready immediately — audio starts playing within seconds
    • Backend streams bytes to browser while concurrently uploading to MinIO;
      subsequent plays use the fast path

    New SvelteKit route: GET /api/audio-stream/[slug]/[n]

    • Proxies backend handleAudioStream (already implemented in Go)
    • Same 3 chapters/day free paywall as POST route
    • HEAD handler for paywall pre-check (no side effects, no counter increment)
      so AudioPlayer can surface upgrade CTA before pointing at URL

    CF AI voices keep the old POST+poll flow (batch-only API, no real streaming
    benefit, preserves the generating progress bar UX).

    Downloads