diff --git a/web/src/routes/admin/+page.svelte b/web/src/routes/admin/+page.svelte index 09460146..129237c7 100644 --- a/web/src/routes/admin/+page.svelte +++ b/web/src/routes/admin/+page.svelte @@ -7,6 +7,7 @@ createLidarrConfigQuery, createAdminQuarantineQuery, createScanStatusQuery, + createCoverageQuery, approveRequest, rejectRequest, resolveQuarantine, @@ -186,6 +187,11 @@ const scan = $derived(scanStatusQ.data); const scanInFlight = $derived(scan?.in_flight === true); + // ---- Cover-art coverage gauge ---- + const coverageStore = $derived(createCoverageQuery()); + const coverageQ = $derived($coverageStore); + const coverage = $derived(coverageQ.data); + let triggering = $state(false); let triggerResult = $state(null); @@ -197,6 +203,7 @@ await triggerScan(); triggerResult = 'Scan started.'; await client.invalidateQueries({ queryKey: qk.scanStatus() }); + await client.invalidateQueries({ queryKey: qk.coverage() }); } catch (e) { const code = (e as { code?: string; status?: number })?.code ?? 'unknown'; const status = (e as { status?: number })?.status; @@ -226,6 +233,7 @@ try { const { queued } = await refetchMissingCovers(); bulkResult = `Queued ${queued} albums for cover refetch.`; + await client.invalidateQueries({ queryKey: qk.coverage() }); } catch (e) { bulkResult = `Failed: ${(e as { code?: string })?.code ?? 'unknown'}`; } finally { @@ -400,14 +408,37 @@

Refetch cover art for albums that are missing one or where the previous attempt failed.

- +
+ + + {#if coverage} + {#if coverage.total === 0} + Library is empty. + {:else} +
+ {coverage.with_art.toLocaleString()} with art + · + 0 ? 'cursor-help' : ''} + title={coverage.pending_no_mbid > 0 + ? `${coverage.pending_no_mbid.toLocaleString()} of these have no MBID and won't be helped by another scan — fix tags or merge duplicate albums.` + : undefined} + > + {coverage.pending.toLocaleString()} pending + + · + {coverage.settled.toLocaleString()} settled +
+ {/if} + {/if} +
{#if bulkResult}

{bulkResult}

{/if} diff --git a/web/src/routes/admin/admin.test.ts b/web/src/routes/admin/admin.test.ts index 90f34997..ea7a2949 100644 --- a/web/src/routes/admin/admin.test.ts +++ b/web/src/routes/admin/admin.test.ts @@ -28,6 +28,12 @@ vi.mock('$lib/api/admin', async () => { isPending: false, isError: false }), + createCoverageQuery: () => + readable({ + data: undefined, + isPending: false, + isError: false + }), approveRequest: vi.fn().mockResolvedValue({}), rejectRequest: vi.fn().mockResolvedValue({}), resolveQuarantine: vi.fn().mockResolvedValue({}),