{pageTitle('Admin · Duplicates')}

Duplicates

{#if total > 0} {total} {/if}

Tracks that hold the same recording more than once. Review each group; nothing is merged or removed from here.

{#if sweep}

{#if sweep.state === 'never'} The duplicate sweep hasn't run yet. {:else if sweep.state === 'running'} Sweeping now — started {relativeTime(sweep.started_at ?? '')}. {:else} Last swept {relativeTime(sweep.finished_at ?? '')}, comparing {(sweep.candidates ?? 0).toLocaleString()} tracks. {#if sweep.error_message} It stopped early: {sweep.error_message} {/if} {/if} {#if prints && prints.pending > 0} {#if prints.enabled === false} Fingerprinting is off, so {prints.pending.toLocaleString()} tracks without a current fingerprint aren't compared. {:else} {prints.pending.toLocaleString()} tracks are still waiting for a fingerprint and join the comparison once they have one. {/if} {/if}

{/if} {#if query.isPending}

Loading duplicates…

{:else if query.isError}

Couldn't load the duplicates report.

{:else if groups.length === 0}
{#if prints && prints.total > 0 && prints.fingerprinted === 0}

Nothing to compare yet.

{#if prints.enabled === false} Fingerprinting is off, so no track has a fingerprint to compare. Turn it on in the settings below. {:else} The library is still being fingerprinted — {prints.pending.toLocaleString()} tracks to go. Duplicates appear here as the sweep finds them. {/if}

{:else if sweep?.state === 'never'}

The sweep hasn't run yet.

It runs on its own whenever new fingerprints arrive, or now if you start it.

{:else if sweep?.state === 'running'}

Sweeping…

Anything it finds will appear here.

{:else}

No duplicates found.

A group appears when two tracks hold identical audio, or the same recording in a different encoding. Groups you dismiss don't come back.

{/if}
{:else} {#if hasMore || offset > 0} {/if} {/if} query.refetch()} />