fix(quarantine): use name-based group key across batches/sources
Source-specific IDs (Spotify id, Qobuz id, URI) break sibling detection when the same song is imported from different playlists or sources, since each batch produces a different id: key. Siblings from a second batch were never recognised and stayed in quarantine after approving the first. Drop id:/uri: fallbacks; keep only ISRC (truly universal) and nm:artist|track (stable across all sources). This correctly groups all quarantine entries for the same intended target regardless of which batch or source produced them. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
842bc0ab34
commit
1770cae04f
1 changed files with 8 additions and 15 deletions
|
|
@ -168,16 +168,15 @@ def quarantine_group_key(
|
||||||
fetch — NOT the downloaded file's own tags. That matters: the file's
|
fetch — NOT the downloaded file's own tags. That matters: the file's
|
||||||
metadata is frequently *wrong* (that's why it failed acoustid /
|
metadata is frequently *wrong* (that's why it failed acoustid /
|
||||||
integrity), whereas the target is fixed and identical across every
|
integrity), whereas the target is fixed and identical across every
|
||||||
alternative for one song (they're all Soulseek uploads of the *same*
|
alternative for one song.
|
||||||
source track), so grouping by it is an exact relationship, not a fuzzy
|
|
||||||
metadata guess.
|
|
||||||
|
|
||||||
Prefers a stable target-track id from the sidecar `context.track_info`
|
Uses ISRC when available (truly universal across sources and batches).
|
||||||
when present — isrc, then source id, then uri — since those are exact
|
Falls back to normalized artist|track name, which is stable across
|
||||||
and constant across siblings. Falls back to the normalized
|
different batches and sources.
|
||||||
artist|track name only for legacy/thin sidecars that carry no context.
|
|
||||||
Keys are kind-prefixed so an id-based key never collides with a
|
Source-specific IDs (Spotify track id, Qobuz id, uri) are intentionally
|
||||||
name-based one.
|
NOT used: the same song imported from different playlists or sources gets
|
||||||
|
different source IDs, so id-based keys break cross-batch sibling matching.
|
||||||
|
|
||||||
Returns ``None`` when nothing identifies the target (no usable id and
|
Returns ``None`` when nothing identifies the target (no usable id and
|
||||||
both name fields empty). Callers treat a ``None`` key as "its own
|
both name fields empty). Callers treat a ``None`` key as "its own
|
||||||
|
|
@ -191,12 +190,6 @@ def quarantine_group_key(
|
||||||
isrc = str(ti.get("isrc") or "").strip().lower()
|
isrc = str(ti.get("isrc") or "").strip().lower()
|
||||||
if isrc:
|
if isrc:
|
||||||
return f"isrc:{isrc}"
|
return f"isrc:{isrc}"
|
||||||
tid = str(ti.get("id") or "").strip()
|
|
||||||
if tid:
|
|
||||||
return f"id:{tid}"
|
|
||||||
uri = str(ti.get("uri") or "").strip()
|
|
||||||
if uri:
|
|
||||||
return f"uri:{uri}"
|
|
||||||
artist = " ".join(str(expected_artist or "").split()).lower()
|
artist = " ".join(str(expected_artist or "").split()).lower()
|
||||||
track = " ".join(str(expected_track or "").split()).lower()
|
track = " ".join(str(expected_track or "").split()).lower()
|
||||||
if not artist and not track:
|
if not artist and not track:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue