Skip to content

Commit 32ba922

Browse files
committed
fix: split listenbrainz spotify artist credits
1 parent be92c4e commit 32ba922

4 files changed

Lines changed: 50 additions & 5 deletions

File tree

engine/handlers/lbz_submit_listen.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ type LbzAdditionalInfo struct {
6969
Duration int32 `json:"duration,omitempty"`
7070
Tags []string `json:"tags,omitempty"`
7171
AlbumArtist string `json:"albumartist,omitempty"`
72+
SpotifyArtistIDs []string `json:"spotify_artist_ids,omitempty"`
7273
}
7374

7475
const (
@@ -153,7 +154,7 @@ func LbzSubmitListenHandler(store submitListenHandlerStore, mbzc mbz.MusicBrainz
153154
}
154155
if len(artistMbzIDs) < 1 {
155156
l.Debug().AnErr("error", err).Msg("LbzSubmitListenHandler: Attempting to parse artist UUIDs from mbid_mapping")
156-
utils.ParseUUIDSlice(payload.TrackMeta.MBIDMapping.ArtistMBIDs)
157+
artistMbzIDs, err = utils.ParseUUIDSlice(payload.TrackMeta.MBIDMapping.ArtistMBIDs)
157158
if err != nil {
158159
l.Debug().AnErr("error", err).Msg("LbzSubmitListenHandler: Failed to parse one or more UUIDs")
159160
}
@@ -208,9 +209,14 @@ func LbzSubmitListenHandler(store submitListenHandlerStore, mbzc mbz.MusicBrainz
208209
artistMbidMap = append(artistMbidMap, catalog.ArtistMbidMap{Artist: a.ArtistName, Mbid: mbid})
209210
}
210211

212+
artistNames := payload.TrackMeta.AdditionalInfo.ArtistNames
213+
if len(artistNames) < 1 {
214+
artistNames = catalog.InferArtistNamesFromSourceIDs(payload.TrackMeta.ArtistName, payload.TrackMeta.AdditionalInfo.SpotifyArtistIDs)
215+
}
216+
211217
opts := catalog.SubmitListenOpts{
212218
MbzCaller: mbzc,
213-
ArtistNames: payload.TrackMeta.AdditionalInfo.ArtistNames,
219+
ArtistNames: artistNames,
214220
Artist: payload.TrackMeta.ArtistName,
215221
ArtistMbzIDs: artistMbzIDs,
216222
TrackTitle: payload.TrackMeta.TrackName,

internal/catalog/catalog.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,34 @@ var (
215215
inlineFeatPattern = regexp.MustCompile(`(?i)[fF]eat\. ([^()\[\]]+)$`)
216216

217217
// Delimiters only used inside feat. sections
218-
featSplitDelimiters = regexp.MustCompile(`(?i)\s*(?:,|&|and|·)\s*`)
218+
featSplitDelimiters = regexp.MustCompile(`(?i)\s*(?:,|&|and|·)\s*`)
219+
commaArtistDelimiter = regexp.MustCompile(`\s*,\s*`)
219220
)
220221

222+
// InferArtistNamesFromSourceIDs splits artist credits when a source gives one
223+
// external artist ID per comma-delimited name but no explicit artist_names list.
224+
func InferArtistNamesFromSourceIDs(artist string, sourceIDs []string) []string {
225+
if len(sourceIDs) < 2 {
226+
return nil
227+
}
228+
229+
parts := commaArtistDelimiter.Split(artist, -1)
230+
if len(parts) != len(sourceIDs) {
231+
return nil
232+
}
233+
234+
artists := make([]string, 0, len(parts))
235+
for _, part := range parts {
236+
part = strings.TrimSpace(part)
237+
if part == "" {
238+
return nil
239+
}
240+
artists = append(artists, part)
241+
}
242+
243+
return artists
244+
}
245+
221246
// ParseArtists extracts all contributing artist names from the artist and title strings
222247
func ParseArtists(artist string, title string, addlSeparators []*regexp.Regexp) []string {
223248
seen := make(map[string]struct{})

internal/catalog/catalog_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,3 +379,12 @@ func TestArtistStringParse(t *testing.T) {
379379
assert.ElementsMatch(t, out, artists)
380380
}
381381
}
382+
383+
func TestInferArtistNamesFromSourceIDs(t *testing.T) {
384+
assert.Equal(t,
385+
[]string{"Pineapple StormTv", "Sant", "Tiago Mac"},
386+
catalog.InferArtistNamesFromSourceIDs("Pineapple StormTv, Sant, Tiago Mac", []string{"spotify:1", "spotify:2", "spotify:3"}),
387+
)
388+
assert.Nil(t, catalog.InferArtistNamesFromSourceIDs("Tyler, The Creator", []string{"spotify:1"}))
389+
assert.Nil(t, catalog.InferArtistNamesFromSourceIDs("Earth, Wind & Fire, Foo", []string{"spotify:1", "spotify:2"}))
390+
}

internal/importer/listenbrainz.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func ImportListenBrainzFile(ctx context.Context, store importStore, mbzc mbz.Mus
8888
}
8989
if len(artistMbzIDs) < 1 {
9090
l.Debug().AnErr("error", err).Msg("ImportListenBrainzFile: Attempting to parse artist UUIDs from mbid_mapping")
91-
utils.ParseUUIDSlice(payload.TrackMeta.MBIDMapping.ArtistMBIDs)
91+
artistMbzIDs, err = utils.ParseUUIDSlice(payload.TrackMeta.MBIDMapping.ArtistMBIDs)
9292
if err != nil {
9393
l.Debug().AnErr("error", err).Msg("ImportListenBrainzFile: Failed to parse one or more UUIDs")
9494
}
@@ -138,9 +138,14 @@ func ImportListenBrainzFile(ctx context.Context, store importStore, mbzc mbz.Mus
138138
artistMbidMap = append(artistMbidMap, catalog.ArtistMbidMap{Artist: a.ArtistName, Mbid: mbid})
139139
}
140140

141+
artistNames := payload.TrackMeta.AdditionalInfo.ArtistNames
142+
if len(artistNames) < 1 {
143+
artistNames = catalog.InferArtistNamesFromSourceIDs(payload.TrackMeta.ArtistName, payload.TrackMeta.AdditionalInfo.SpotifyArtistIDs)
144+
}
145+
141146
opts := catalog.SubmitListenOpts{
142147
MbzCaller: mbzc,
143-
ArtistNames: payload.TrackMeta.AdditionalInfo.ArtistNames,
148+
ArtistNames: artistNames,
144149
Artist: payload.TrackMeta.ArtistName,
145150
ArtistMbzIDs: artistMbzIDs,
146151
TrackTitle: payload.TrackMeta.TrackName,

0 commit comments

Comments
 (0)