From 62af3683a4981df48ee6231c590ca320d19d94ad Mon Sep 17 00:00:00 2001 From: apt-get Date: Wed, 2 Sep 2026 14:25:16 +0200 Subject: [PATCH] Put stream in downloading map on click rather than on dl start prevents network issue race conditions --- src/lib/streamCache.svelte.ts | 50 +++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/lib/streamCache.svelte.ts b/src/lib/streamCache.svelte.ts index bd7ddb5..a5850f1 100644 --- a/src/lib/streamCache.svelte.ts +++ b/src/lib/streamCache.svelte.ts @@ -18,32 +18,36 @@ if (browser) { } export async function download(stream: StreamSummary) { - const res = await fetch(`/media/tracks/${stream.filename}`); - if (!res.ok || !res.body) throw new Error('Download failed'); - - const total = Number(res.headers.get('content-length') || 0); - const reader = res.body.getReader(); - const chunks: Uint8Array[] = []; - let received = 0; - + if (downloading.has(stream.id) || cached.has(stream.id)) return; downloading.set(stream.id, 0); - while (true) { - const { done, value } = await reader.read(); - if (done) break; - chunks.push(value); - received += value.length; - if (total) downloading.set(stream.id, Math.round((received / total) * 100)); + try { + const res = await fetch(`/media/tracks/${stream.filename}`); + if (!res.ok || !res.body) throw new Error('Download failed'); + + const total = Number(res.headers.get('content-length') || 0); + const reader = res.body.getReader(); + const chunks: Uint8Array[] = []; + let received = 0; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + chunks.push(value); + received += value.length; + if (total) downloading.set(stream.id, Math.round((received / total) * 100)); + } + + const root = await navigator.storage.getDirectory(); + const handle = await root.getFileHandle(stream.id, { create: true }); + const writable = await handle.createWritable(); + await writable.write(new Blob(chunks)); + await writable.close(); + + cached.add(stream.id); + } finally { + downloading.delete(stream.id); } - - const root = await navigator.storage.getDirectory(); - const handle = await root.getFileHandle(stream.id, { create: true }); - const writable = await handle.createWritable(); - await writable.write(new Blob(chunks)); - await writable.close(); - - downloading.delete(stream.id); - cached.add(stream.id); } export async function remove(streamId: string) {