refactor(server/coverart): provider interface takes ArtistRef/AlbumRef
Changes the AlbumCoverProvider and ArtistArtProvider interfaces from MBID-only string parameters to ref-struct signatures so name-based providers (Deezer, Last.fm in upcoming tasks) can act on rows without MBIDs. Today, 53 of 213 artists in the dev DB have NULL MBIDs — featured artists, remixers, and compilation contributors created from track-tag splits where the primary-artist MBID is in the file but collaborator IDs aren't. These rows are unreachable by the current MBID-only chain. Refactoring the interface unblocks future name-based providers from acting on them. TheAudioDB and MBCAA keep MBID-only behavior internally: they return ErrNotFound when ref.MBID is empty rather than attempting a name-based fallback. The MBID guard inside EnrichAlbum/EnrichArtist is removed; providers receive the ref unconditionally and decide whether they can act on it. GetAlbumWithFirstTrackPath now JOINs artists to return artist_name alongside the existing fields, supporting AlbumRef construction. No behavioral change today (only TheAudioDB + MBCAA registered, both keep MBID-only behavior). The change unblocks T3 (Deezer) and T4 (Last.fm) which can now register and act on every artist/album regardless of MBID presence. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -89,18 +89,24 @@ func (e *Enricher) EnrichAlbum(ctx context.Context, albumID pgtype.UUID) error {
|
||||
}
|
||||
}
|
||||
|
||||
// MBID guard — providers can't fetch without one.
|
||||
if row.Mbid == nil || *row.Mbid == "" {
|
||||
return nil // leave NULL; mbid backfill or future scan can heal
|
||||
// Build the ref. Every provider receives it and decides whether it
|
||||
// can act on the fields available (MBID-only providers return
|
||||
// ErrNotFound when MBID is empty; name-based providers fall back to
|
||||
// ArtistName + AlbumTitle).
|
||||
ref := AlbumRef{
|
||||
ArtistName: row.ArtistName,
|
||||
AlbumTitle: row.Title,
|
||||
}
|
||||
if row.Mbid != nil {
|
||||
ref.MBID = *row.Mbid
|
||||
}
|
||||
mbid := *row.Mbid
|
||||
|
||||
// Provider chain. allWere404 tracks whether every provider
|
||||
// returned ErrNotFound — only then do we settle to 'none'. Any
|
||||
// transient failure leaves the row NULL for next-pass retry.
|
||||
allWere404 := true
|
||||
for _, provider := range e.settings.EnabledAlbumProviders() {
|
||||
body, perr := provider.FetchAlbumCover(ctx, mbid)
|
||||
body, perr := provider.FetchAlbumCover(ctx, ref)
|
||||
if perr == nil {
|
||||
if row.TrackFilePath == nil || *row.TrackFilePath == "" {
|
||||
// Defensive: shouldn't happen if MBID was set on an
|
||||
|
||||
Reference in New Issue
Block a user