From c8a11ef018461f14a5e7c9fcf8fb69cfed0d7d0f Mon Sep 17 00:00:00 2001 From: Gabe Farrell <90876006+gabehf@users.noreply.github.com> Date: Sun, 25 Jan 2026 15:51:07 -0500 Subject: [PATCH] fix: ensure mbids in mbidmapping are discovered (#180) --- engine/import_test.go | 28 ++++++++++++++++++ internal/importer/listenbrainz.go | 19 ++++++++++-- test_assets/listenbrainz_shoko1_123456789.zip | Bin 0 -> 3184 bytes 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 test_assets/listenbrainz_shoko1_123456789.zip diff --git a/engine/import_test.go b/engine/import_test.go index bb5c18e..fa69e73 100644 --- a/engine/import_test.go +++ b/engine/import_test.go @@ -264,6 +264,34 @@ func TestImportListenBrainz_MbzDisabled(t *testing.T) { truncateTestData(t) } +func TestImportListenBrainz_MBIDMapping(t *testing.T) { + + src := path.Join("..", "test_assets", "listenbrainz_shoko1_123456789.zip") + destDir := filepath.Join(cfg.ConfigDir(), "import") + dest := filepath.Join(destDir, "listenbrainz_shoko1_123456789.zip") + + // not going to make the dest dir because engine should make it already + + input, err := os.ReadFile(src) + require.NoError(t, err) + + require.NoError(t, os.WriteFile(dest, input, os.ModePerm)) + + engine.RunImporter(logger.Get(), store, &mbz.MbzErrorCaller{}) + + album, err := store.GetAlbum(context.Background(), db.GetAlbumOpts{MusicBrainzID: uuid.MustParse("177ebc28-0115-3897-8eb3-ebf74ce23790")}) + require.NoError(t, err) + assert.Equal(t, "Zombie", album.Title) + artist, err := store.GetArtist(context.Background(), db.GetArtistOpts{MusicBrainzID: uuid.MustParse("c98d40fd-f6cf-4b26-883e-eaa515ee2851")}) + require.NoError(t, err) + assert.Equal(t, "The Cranberries", artist.Name) + track, err := store.GetTrack(context.Background(), db.GetTrackOpts{MusicBrainzID: uuid.MustParse("3bbeb4e3-ab6d-460d-bfc5-de49e4251061")}) + require.NoError(t, err) + assert.Equal(t, "Zombie", track.Title) + + truncateTestData(t) +} + func TestImportKoito(t *testing.T) { src := path.Join("..", "test_assets", "koito_export_test.json") diff --git a/internal/importer/listenbrainz.go b/internal/importer/listenbrainz.go index 4187bbb..7c1a8bb 100644 --- a/internal/importer/listenbrainz.go +++ b/internal/importer/listenbrainz.go @@ -85,7 +85,14 @@ func ImportListenBrainzFile(ctx context.Context, store db.DB, mbzc mbz.MusicBrai } artistMbzIDs, err := utils.ParseUUIDSlice(payload.TrackMeta.AdditionalInfo.ArtistMBIDs) if err != nil { - l.Debug().Err(err).Msg("Failed to parse one or more uuids") + l.Debug().AnErr("error", err).Msg("ImportListenBrainzFile: Failed to parse one or more UUIDs") + } + if len(artistMbzIDs) < 1 { + l.Debug().AnErr("error", err).Msg("ImportListenBrainzFile: Attempting to parse artist UUIDs from mbid_mapping") + utils.ParseUUIDSlice(payload.TrackMeta.MBIDMapping.ArtistMBIDs) + if err != nil { + l.Debug().AnErr("error", err).Msg("ImportListenBrainzFile: Failed to parse one or more UUIDs") + } } rgMbzID, err := uuid.Parse(payload.TrackMeta.AdditionalInfo.ReleaseGroupMBID) if err != nil { @@ -93,11 +100,17 @@ func ImportListenBrainzFile(ctx context.Context, store db.DB, mbzc mbz.MusicBrai } releaseMbzID, err := uuid.Parse(payload.TrackMeta.AdditionalInfo.ReleaseMBID) if err != nil { - releaseMbzID = uuid.Nil + releaseMbzID, err = uuid.Parse(payload.TrackMeta.MBIDMapping.ReleaseMBID) + if err != nil { + releaseMbzID = uuid.Nil + } } recordingMbzID, err := uuid.Parse(payload.TrackMeta.AdditionalInfo.RecordingMBID) if err != nil { - recordingMbzID = uuid.Nil + recordingMbzID, err = uuid.Parse(payload.TrackMeta.MBIDMapping.RecordingMBID) + if err != nil { + recordingMbzID = uuid.Nil + } } var client string diff --git a/test_assets/listenbrainz_shoko1_123456789.zip b/test_assets/listenbrainz_shoko1_123456789.zip new file mode 100644 index 0000000000000000000000000000000000000000..14c97a2a104dca68ccb2e810fe24cd5039754322 GIT binary patch literal 3184 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 INq@fm2g3obEdT%j literal 0 HcmV?d00001