From acbfafb8cdb5a1a4af3e8228309271c6a270bde1 Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 4 Mar 2026 19:30:46 +0500 Subject: [PATCH] fix(audio): remove speed from TTS/cache/MinIO keys; fix presigned URL host rewrite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Speed is no longer part of Kokoro generation, in-memory cache keys, or MinIO object keys — audio is always generated at 1.0 and playback speed is applied client-side via audioEl.playbackRate - presignAudio() now calls rewriteHost() so chapter audio URLs use the public MinIO endpoint (same as presignVoiceSample already did) - docker-compose.yml: rename MINIO_PUBLIC_ENDPOINT → PUBLIC_MINIO_PUBLIC_URL for the ui service so SvelteKit's $env/dynamic/public picks it up --- docker-compose.yml | 2 +- scraper/internal/server/server.go | 56 +++++++------------ scraper/internal/storage/hybrid.go | 4 +- scraper/internal/storage/minio.go | 6 +- scraper/internal/storage/store.go | 2 +- ui/src/lib/components/AudioPlayer.svelte | 20 +++---- ui/src/lib/server/minio.ts | 10 +--- ui/src/routes/api/audio/[slug]/[n]/+server.ts | 12 ++-- ui/src/routes/api/presign/audio/+server.ts | 5 +- 9 files changed, 45 insertions(+), 72 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7251ab2..9062006 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -175,7 +175,7 @@ services: POCKETBASE_URL: "http://pocketbase:8090" POCKETBASE_ADMIN_EMAIL: "${POCKETBASE_ADMIN_EMAIL:-admin@libnovel.local}" POCKETBASE_ADMIN_PASSWORD: "${POCKETBASE_ADMIN_PASSWORD:-changeme123}" - MINIO_PUBLIC_ENDPOINT: "${MINIO_PUBLIC_ENDPOINT:-http://localhost:9000}" + PUBLIC_MINIO_PUBLIC_URL: "${MINIO_PUBLIC_ENDPOINT:-http://localhost:9000}" ports: - "${UI_PORT:-5252}:3000" healthcheck: diff --git a/scraper/internal/server/server.go b/scraper/internal/server/server.go index c466c77..946b804 100644 --- a/scraper/internal/server/server.go +++ b/scraper/internal/server/server.go @@ -425,9 +425,12 @@ func (s *Server) handleChapterText(w http.ResponseWriter, r *http.Request) { // It calls Kokoro's POST /v1/audio/speech with return_download_link=true. // Kokoro generates the audio, saves it to its own temp storage, and returns // the download filename in the X-Download-Path response header. -// We cache that filename (in memory, keyed by slug/chapter/voice/speed) and +// We cache that filename (in memory, keyed by slug/chapter/voice) and // return a proxy URL that the browser sets as audio.src. // +// TTS is always generated at speed 1.0; playback speed is controlled +// client-side via the