Artwork
{#if !idn || idn.state === "loading"}looking the record up…
{:else if idn.state === "error"}the lookup failed
{:else if measuring}found it — measuring what each service has…
{:else if allDead}found it, but no service has a cover for it
{:else if measureFailed}found it, but the sizes could not be measured
{:else if matchHasNoArt}the matching release carries no artwork
{:else if !covers.length}no service has this record
{:else}{@const best = Math.max(...covers.map((x) => x.px || 0))}
{covers.length} service{covers.length === 1 ? "" : "s"} answered{#if !yours} — you have none{:else if (yours?.w ?? 0) >= best}, and none beats your {yours.w}px — nothing to gain here{:else} — yours is {yours.w}px, the best of these is {best}px{/if}
{/if}
{matchHasNoArt
? "the matching release has no artwork on file"
: "no service has this record,"}{#if !matchHasNoArt} so there is nothing to compare{/if}
Deezer · Apple · Cover Art Archive
{:else if !idn || idn.state === "loading"}
looking this record up…
Deezer · Apple · Cover Art Archive
{/if}
Is this the same record?
{#if !idn || idn.state === "loading"}
Asking Deezer, then MusicBrainz when it has no answer…
Audio — the version you keep
{#if !audition}whole album · one choice, like the artwork
{:else if audition.status === "searching"}searching the network…
{:else if audition.status === "none"}nothing on the network answered
{:else if audition.status === "failed"}the transfer failed{audition.error ? ` — ${audition.error}` : ""}
{:else if audition.status === "downloading"}{live?.stalled
? "the transfer went quiet"
: "found a copy — fetching track 1 first, so the comparison can start"}
{:else if audition.status === "complete"}the whole copy is cached — keeping it is instant
{:else}{audition.arrived ?? 1} of {audition.expected ?? audition.ids?.length ?? "…"} tracks cached · the rest keep arriving
{/if}the lit version is what gets imported
{audition?.status === "none"
? audition.silent
? "Soulseek answered nothing at all — the server refuses some queries outright, and quiet spells happen. Worth asking again."
: "No peer offered this album just now — worth asking again another day."
: audition?.status === "failed"
? "The peer stopped answering — try the search again."
: "Searches Soulseek for this whole album; the best copy found downloads into the cache so you hear and compare the real thing before choosing."}
{:else if audition.status === "searching"}
Searching…asking the network for this album
{#each waveFloor() as b (b.i)}{/each}
—
{:else}
{@const au = audition}
{@const theirsReady = !!au.track1Path}
{#if !theirsReady && live?.stalled}
Nothing has arrived for {Math.round(live.quietMs / 1000)}s.
The peer may have gone offline or dropped the queue. You can wait, try
another peer, or keep your own copy — nothing is lost either way.
{:else if !theirsReady}
Track 1 is asked for on its own, so it is not queued behind the other
{au.candidate.trackCount - 1} files of its own album.{#if au.switchedFrom}
· Moved on from {au.switchedFrom}{au.reason ? ` — ${au.reason}` : ""}.
{/if}
{:else if au.probe?.seconds && a.tracks[0]?.seconds}
{@const d = Math.abs(a.tracks[0].seconds - au.probe.seconds)}
{#if d <= 2}
Ready to compare.
Track 1 is the same length in both ({mmss(au.probe.seconds)}) — the strongest signal it is the same recording. The waveforms share one scale, so shape and loudness compare honestly.{#if au.status !== "complete"} The other {Math.max(0, (au.expected ?? au.ids?.length ?? 0) - (au.arrived ?? 0))} tracks are still coming; keeping this version waits for them.{/if}
{:else}
Track 1 differs by {d}s — different recording, different edit, or a different record. Listen before keeping it.
{/if}
{:else if au.candidate.countMatch === false}
{au.candidate.trackCount} tracks against your {a.tracks.length} — this copy may be a different edition or incomplete.
{:else}
The whole album downloads into the cache — if you keep it, nothing is fetched twice; if you keep yours, the sweep reclaims it in a week.
{/if}
{alts
? `${alts} more ${alts === 1 ? "copy" : "copies"} ranked behind this one${au.candidate.queue ? ` — this peer has ${au.candidate.queue} ahead of you` : ""}. Switching cancels this download; nothing already cached is lost.`
: "No ranked alternates left for this copy — this asks the network again."}
{/if}
{/if}
{#if candidate}
Track titles {a.tracks.length} yours · {candidate.tracklist.length} theirspick a side per track
{#if a.tracks.length !== candidate.tracklist.length}Different track counts — {a.tracks.length} against {candidate.tracklist.length}.{/if}
{#if slipped}{slipped} track{slipped === 1 ? "" : "s"} {slipped === 1 ? "does" : "do"} not match on length.{/if}
These are paired by position because the provider sends no track
numbers, so the rows below may be lined up against the wrong songs.
{:else}
Every track pairs with one of the same length, so the rows below line up.
{#if trackChanges}{trackChanges} title{trackChanges === 1 ? "" : "s"} will be replaced.
{:else}Keeping all of your titles.{/if}
Tags pick a side per fieldthe lit one is what gets written
yours
{candidate.source}
{#each tagPairs as [k, mine, theirs] (k)}
{@const same = mine && theirs && norm2(mine) === norm2(theirs)}
{k}
{/each}
{:else if idn?.state === "done"}
Tags
This record has not been matched, so there is nothing to choose
between. What your files say is in the summary below.
{/if}
What gets imported
{changeCount ? `${changeCount} change${changeCount === 1 ? "" : "s"} from what you have` : "everything of yours, unchanged"}
{#if choice?.seen}{/if}
Artwork
{resolvedArt === "yours"
? (yours ? `yours · ${yours.w} × ${yours.h}` : "none — a cover will be generated")
: `${resolvedArt} · ${covers.find((c) => c.provider === resolvedArt)?.px ?? "?"}px`}
{#each tagPairs as [k, mine, theirs] (k)}
{@const side = resolvedTag(k)}
{@const v = side === "theirs" ? theirs : mine}
{#if v}
{k}
{v}
{/if}
{/each}
Track titles
0}>
{trackChanges ? `${trackChanges} of ${a.tracks.length} replaced` : `all ${a.tracks.length} kept as yours`}
{yoursSrc
? `yours · ${yours?.w} × ${yours?.h}${yours?.kind === "embedded" ? " · embedded" : ""}`
: `${right?.provider} · ${right?.px ? `${right.px} × ${right.realH ?? right.px}` : "size not measured yet"}`}
{#if yoursSrc && !covers.length} · no service has this record — nothing to compare against
{:else if !yoursSrc} · you have no artwork for this record{/if}