v0.20.1: one fingerprint, six artists

trav's "Dionne Farris - I Know" kept identifying as Jay-Z, against ID3 tags
that plainly said otherwise. AcoustID was right; the ranking threw the answer
away.

The fingerprint matched one AcoustID result at 0.97, and six recordings hang
off it: Dionne Farris twice, plus Jay-Z, Marisela, New Atlantic and David
Essex, all of whom recorded a song called "I Know". A result's score belongs
to the *audio*, so every linked recording carries it however wrong the link
is. With the scores tied, ranking fell through to the duration bucket, where
Jay-Z's 222.7 s beat Dionne's 227.3 s against a 224 s file. The tags never got
a vote: the hint sat below duration in the sort key.

So the lookup now asks who submitted each link. `sources` joins LOOKUP_META —
475 people linked that audio to Dionne Farris, 6 to Jay-Z, 1 each to the rest
— and _link_tier sinks anything under a tenth of the strongest link in the
same result. The share is relative, never an absolute count, and a missing
count ranks as real: an obscure song's true link may have two submissions
against a stray's one, and rounds 45-46's payloads rank unchanged.

And it asks what the file already says. artist_hint_for gathers the artist
tag, the album artist and the artist in the filename; _artist_agreement counts
the words shared with a candidate's credit, placeholders dropped. Like every
hint since round 46 it only chooses among what AcoustID returned.

New key order: stray tier, artist agreement, duration bucket, hint overlap,
release rank — who, which take, which release. Artist above duration is the
whole fix; duration still separates two takes by one artist.

Verified live against the reported file: the proposal is now I Know — Dionne
Farris — Wild Seed - Wild Flower (1994), track 1, with all five mis-tagged
artists off the dropdown. The real response is pinned in tests/test_round52.py.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SKXUgsBBwe3qaHEjeV8ubP
This commit is contained in:
2026-09-11 20:41:33 -05:00
co-authored by Claude Opus 5
parent 81b7f6767c
commit c797cf570c
5 changed files with 383 additions and 13 deletions
+13 -1
View File
@@ -207,7 +207,19 @@ persistence) → GUI (Qt widgets that read the manager and connect to its signal
compilation as the album, because a 60s song must not sort by the year its CD
reissue came out. `_releasegroup_sort_key` separately ranks a plain studio
Album above EP/Single above anything with a Compilation/Live secondary type,
so the default proposal is the real album. `gui/identify_dialog.py` is passive
so the default proposal is the real album. **An AcoustID result's score
belongs to the *audio*, not to any one recording**: every recording linked to
it carries that score, mis-tags included, and a song whose title another
artist also used collects them (Round 52: trav's Dionne Farris "I Know" is
linked to Jay-Z's, Marisela's, David Essex's and New Atlantic's). What tells
a real link from a stray is `sources`, the submission count — 475 against 6
and three 1s — so the lookup asks for it and `_link_tier` sinks anything
under a tenth of the strongest link in that result. Hence the key order
*who*, then *which take*, then *which release*: stray tier, agreement with
the artist the file's own tags name (`artist_hint_for`), duration bucket,
hint overlap, release rank. Artist before duration is the point — Jay-Z's
take was 1.5 s closer to the file than Dionne's own, and that used to decide
it. `gui/identify_dialog.py` is passive
(the `AlbumArtDialog` contract — nothing written until accepted); the caller
applies `result_fields()` through `LibraryManager.edit_track_fields`, which is
what buys tag writes, undo and artist/album file relocation for free. A row is