Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions engine/handlers/lbz_submit_listen.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ type LbzAdditionalInfo struct {
Duration int32 `json:"duration,omitempty"`
Tags []string `json:"tags,omitempty"`
AlbumArtist string `json:"albumartist,omitempty"`
SpotifyArtistIDs []string `json:"spotify_artist_ids,omitempty"`
}

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

artistNames := payload.TrackMeta.AdditionalInfo.ArtistNames
if len(artistNames) < 1 {
artistNames = catalog.InferArtistNamesFromSourceIDs(payload.TrackMeta.ArtistName, payload.TrackMeta.AdditionalInfo.SpotifyArtistIDs)
}

opts := catalog.SubmitListenOpts{
MbzCaller: mbzc,
ArtistNames: payload.TrackMeta.AdditionalInfo.ArtistNames,
ArtistNames: artistNames,
Artist: payload.TrackMeta.ArtistName,
ArtistMbzIDs: artistMbzIDs,
TrackTitle: payload.TrackMeta.TrackName,
Expand Down
27 changes: 26 additions & 1 deletion internal/catalog/catalog.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,9 +215,34 @@ var (
inlineFeatPattern = regexp.MustCompile(`(?i)[fF]eat\. ([^()\[\]]+)$`)

// Delimiters only used inside feat. sections
featSplitDelimiters = regexp.MustCompile(`(?i)\s*(?:,|&|and|·)\s*`)
featSplitDelimiters = regexp.MustCompile(`(?i)\s*(?:,|&|and|·)\s*`)
commaArtistDelimiter = regexp.MustCompile(`\s*,\s*`)
)

// InferArtistNamesFromSourceIDs splits artist credits when a source gives one
// external artist ID per comma-delimited name but no explicit artist_names list.
func InferArtistNamesFromSourceIDs(artist string, sourceIDs []string) []string {
if len(sourceIDs) < 2 {
return nil
}

parts := commaArtistDelimiter.Split(artist, -1)
if len(parts) != len(sourceIDs) {
return nil
}

artists := make([]string, 0, len(parts))
for _, part := range parts {
part = strings.TrimSpace(part)
if part == "" {
return nil
}
artists = append(artists, part)
}

return artists
}

// ParseArtists extracts all contributing artist names from the artist and title strings
func ParseArtists(artist string, title string, addlSeparators []*regexp.Regexp) []string {
seen := make(map[string]struct{})
Expand Down
9 changes: 9 additions & 0 deletions internal/catalog/catalog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -379,3 +379,12 @@ func TestArtistStringParse(t *testing.T) {
assert.ElementsMatch(t, out, artists)
}
}

func TestInferArtistNamesFromSourceIDs(t *testing.T) {
assert.Equal(t,
[]string{"Pineapple StormTv", "Sant", "Tiago Mac"},
catalog.InferArtistNamesFromSourceIDs("Pineapple StormTv, Sant, Tiago Mac", []string{"spotify:1", "spotify:2", "spotify:3"}),
)
assert.Nil(t, catalog.InferArtistNamesFromSourceIDs("Tyler, The Creator", []string{"spotify:1"}))
assert.Nil(t, catalog.InferArtistNamesFromSourceIDs("Earth, Wind & Fire, Foo", []string{"spotify:1", "spotify:2"}))
}
9 changes: 7 additions & 2 deletions internal/importer/listenbrainz.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ func ImportListenBrainzFile(ctx context.Context, store importStore, mbzc mbz.Mus
}
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)
artistMbzIDs, err = utils.ParseUUIDSlice(payload.TrackMeta.MBIDMapping.ArtistMBIDs)
if err != nil {
l.Debug().AnErr("error", err).Msg("ImportListenBrainzFile: Failed to parse one or more UUIDs")
}
Expand Down Expand Up @@ -138,9 +138,14 @@ func ImportListenBrainzFile(ctx context.Context, store importStore, mbzc mbz.Mus
artistMbidMap = append(artistMbidMap, catalog.ArtistMbidMap{Artist: a.ArtistName, Mbid: mbid})
}

artistNames := payload.TrackMeta.AdditionalInfo.ArtistNames
if len(artistNames) < 1 {
artistNames = catalog.InferArtistNamesFromSourceIDs(payload.TrackMeta.ArtistName, payload.TrackMeta.AdditionalInfo.SpotifyArtistIDs)
}

opts := catalog.SubmitListenOpts{
MbzCaller: mbzc,
ArtistNames: payload.TrackMeta.AdditionalInfo.ArtistNames,
ArtistNames: artistNames,
Artist: payload.TrackMeta.ArtistName,
ArtistMbzIDs: artistMbzIDs,
TrackTitle: payload.TrackMeta.TrackName,
Expand Down