Files
libnovel/ui/src/routes/api/audio/chapters/+server.ts
root 44f81bbf5c
All checks were successful
Release / Test backend (push) Successful in 1m1s
Release / Check ui (push) Successful in 1m42s
Release / Docker (push) Successful in 6m13s
Release / Gitea Release (push) Successful in 21s
surface audio-ready chapters: headphones badge on chapter list, instant-play prompt on reader
- getReadyChaptersForSlug(slug, preferredVoice) in pocketbase.ts: per-slug done jobs map, cached 60s, prefers user's voice
- GET /api/audio/chapters?slug=&voice= endpoint
- Chapter list (/books/[slug]/chapters): amber headphones icon on ready rows, play button for instant listen, banner showing ready count
- Chapter reader: audioReady + availableVoice from server load; 'Audio ready — Listen now' banner shown when audio exists and player is not yet active; sets voice preference before expanding player
2026-04-12 11:13:36 +05:00

19 lines
652 B
TypeScript

import { json, error } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { getReadyChaptersForSlug } from '$lib/server/pocketbase';
export const GET: RequestHandler = async ({ url }) => {
const slug = url.searchParams.get('slug') ?? '';
if (!slug) error(400, 'slug is required');
const voice = url.searchParams.get('voice') ?? '';
const readyMap = await getReadyChaptersForSlug(slug, voice);
// Return array of { chapter, voice } pairs
const chapters = [...readyMap.entries()].map(([chapter, v]) => ({ chapter, voice: v }));
return json({ chapters }, {
headers: { 'Cache-Control': 'public, max-age=60' }
});
};