A Bandcamp URL doesn't tell you whether x.bandcamp.com is a solo artist or a
record label — both live at the same address and expose the same /music grid. But
Dig Artist and Dig Label need to know the difference. This is a test of whether we can
recover it from data we already store, run against the full production catalog.
artist field
we store is unreliable. It collapses to the storefront name on self-uploaded label catalogs, and inflates on
solo artists who use “feat.” / “&”. Fix that one field and the rule becomes solid.Every Bandcamp track carries a metadata_json.label object. The name is a
misnomer: it's the page owner (band_id + the og:site_name +
subdomain), which is identical whether the page is an artist or a label. Three real rows, untouched:
Same shape, three different meanings. There is no is_label / entity_type
anywhere in the schema, and band_id only lives inside the JSON blob (no column, no index).
Classify each page (grouped by band_id) using only fields we already have —
no re-scraping. One function; the same call backfills the 127k existing pages and runs at ingest for new ones.
Where the 32,000 “label” calls come from — the VA flag is high-precision but rare; the distinct-artist count does the heavy lifting (and, as we'll see, carries the noise):
Split of the 32,000 label calls. VA-driven calls are a clean subset; the rest rely entirely on the artist count.
| page | truth | releases | distinct artists | VA flag | predicted | verdict |
|---|---|---|---|---|---|---|
junglecakes | label | 1362 | 791 | yes | label | ✓ correct |
hospitalrecords | label | 1156 | 656 | yes | label | ✓ correct |
chillhop | label | 1644 | 549 | yes | label | ✓ correct |
themidnight | artist | 864 | 1 | no | artist | ✓ correct |
jibbzeon | artist | 2980 | 1 | no | artist | ✓ correct |
boogiemaster | artist | 1057 | 1 | no | artist | ✓ correct |
jammmer | artist | 1004 | 1 | no | artist | ✓ correct |
diffusereality | label | 1708 | 1 | no | artist | ✗ false neg |
enderecords | label | 2513 | 1 | no | artist | ✗ false neg |
durante | artist | 99 | 20 | no | label | ✗ false pos |
7 / 10 correct. All 3 errors come from the distinct_artists count being wrong,
not from the rule's logic. Both failure modes below trace back to the stored artist field.
Labels that upload releases under their own name set every track's artist to the
label. The page shows 1 distinct artist, so the rule calls it an artist. The real artists are lost — sometimes
stranded in the title.
A solo artist who collaborates a lot produces many distinct artist strings —
“X”, “X feat. Y”, “X & Z” all count separately — tripping the ≥ 3 threshold. Durante alone yields
20 “artists”.
Both are the artist field's fault. It's populated from Bandcamp's top-level
tralbum.artist (the storefront name) instead of the per-track artist, and it's stored raw, with
the “feat./&” credits unnormalised. The classifier inherits both flaws.
“Dig this page's catalog” (group by band_id) works today with zero new data. The only
missing bit is a one-field entity_type to decide which button to show.
When is_various_artists is set it's a label almost every time — but it only covers 5,427
pages. The distinct-artist count reaches the rest, but is noisy in both directions until the artist field is clean.
Per-track artist extraction — stop defaulting to the storefront name; normalise
feat./&/x/vs/pres. to the primary artist — fixes Dig Artist and de-noises the
label classifier. It's the prerequisite, not a nice-to-have.
Bandcamp's page JSON may carry an explicit label marker we don't parse (we only read
data-tralbum). The proxy pool was 403-blocked on these pages during this run, so it's still
an open lead — if it exists, classification becomes “read one field”.
Data. Production Postgres (digdeeper), read over the SSH tunnel on 2026-06-05.
4,777,654 track_sources rows where platform='bandcamp'; 4,580,042 carry a
metadata_json.label.id. Pages = distinct band_id (≈ subdomain): 127,840.
Aggregation. Per page we computed release count, count(distinct lower(artist)) from
the joined canonical_tracks, and bool_or(is_various_artists). The rule
label = VA-ever OR distinct_artists ≥ 3 was applied to all 127,840 pages: 32,000 label / 95,840
artist. “Zero artist signal” = pages with 1 distinct artist whose value equals the page name (75,752; 59.3%).
Validation. 10 pages with author-known ground truth (5 labels, 5 artists), chosen to include the hard cases (a self-uploaded label, a collab-heavy solo artist). 7/10 correct. This is a smoke test, not a calibrated accuracy figure — a real precision/recall number needs a larger random labelled sample. The ≥ 3 threshold is untuned.
Caveats. No native Bandcamp label flag was confirmed (proxy 403s). The artist-collapse and feat-inflation
issues are properties of the current ingest, so any backfill is bounded by them until the artist
field is reprocessed. Generators + queries live in digdeeper-similarity/scripts, not here.