DigDeeper · experimentsall projects

Resolving credits — artists & labels

Given a canonical track's stored fields — title, the single artist string, and the Bandcamp label.name (og:site_name) — decide the real artist(s) and label(s). No re-fetching: this is exactly what a backfill would see. Inputs on the left, what the resolver produces on the right — judge it yourself.

180 random tracks 11-track labelled check-set stored data only — no re-fetch prod DB · 2026-06-05
From stored fields alone the resolver gets 10/11 artists and 8/11 full credits on the check-set (the misses are label-side: a placeholder page name, and one track where label.name was never captured). On 180 random tracks, 49% resolve high-confidence (artist ≠ page → clean split) and 48% land low-confidence — where the artist is just the page name, which is correct for a solo act but hides a collapsed label. That low bucket is the honest boundary of what one track can tell you.
10/11artists correct on the labelled check-set (only a reversed "Title - Artist" fails)
8/11full artist + label correct — label gaps are missing/placeholder page names
49 / 2 / 48% of 180 random tracks at high / med / low confidence

How one track is resolved

label = stored label.name — when it differs from the artist (else: self-released, no label)
artist = the artist field — unless it equals the page name (collapsed) …
    … and the page looks like a compilation (most titles "Artist - Title") → parse artist from the title
    then split feat. / & / , into primary + featured

high = artist ≠ page (clean).  med = artist parsed from a compilation title (watch title order).  low = artist is the page name (right iff it's a solo act; a self-crediting label hides here).

Labelled check-set — 11 tracks with known answers

180 random tracks — input → output

Method

Inputs (all stored). canonical_tracks.title, canonical_tracks.artist (the single free-text field), and track_sources.metadata_json.label.name / .id (the Bandcamp og:site_name + band_id). Page context = a one-pass aggregate per band_id: track count, fraction of titles shaped "Artist - Title", distinct primary artists, and the Various-Artists flag.

Resolver. Label from label.name when it differs from the artist; artist from the artist field unless it has collapsed to the page name, in which case the artist is parsed from the title on pages that look like compilations. feat./&/, split into primary + featured.

Caveats — this is eyeball-grade. The 180 random tracks have no ground truth; only the 11-track check-set is hand-labelled, so 8/11 is indicative, not a calibrated accuracy. The low bucket conflates genuine solo artists (correct) with self-crediting labels (wrong) — splitting them needs the page-level classifier or a corroboration pass (Discogs / cross-catalog artist recurrence). Title order is unsolvable from one page (Bandcamp enforces no "Artist - Title" convention). Some tracks have a null label.name (band_id present, og:site_name never captured) — a data-completeness gap, not a resolver error. Generator lives in digdeeper-similarity/scripts.