mirror of
https://git.sr.ht/~joren/streamrip-go
synced 2026-07-27 23:42:28 +02:00
feat: infer beatport release artist
This commit is contained in:
@@ -480,14 +480,16 @@ func (c *Client) rawRequest(ctx context.Context, method, endpoint string, params
|
||||
|
||||
func (c *Client) normalizeRelease(raw map[string]any, tracks []any) map[string]any {
|
||||
id := jsonutil.StringFromAny(raw["id"])
|
||||
artist := c.releaseArtistName(raw["artists"])
|
||||
artist := c.releaseArtistNameForTracks(raw["artists"], tracks)
|
||||
trackRelease := cloneMap(raw)
|
||||
trackRelease["album_artist_name"] = artist
|
||||
items := make([]any, 0, len(tracks))
|
||||
for _, entry := range tracks {
|
||||
track, ok := entry.(map[string]any)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
track["release"] = raw
|
||||
track["release"] = trackRelease
|
||||
items = append(items, c.normalizeTrack(track))
|
||||
}
|
||||
return map[string]any{
|
||||
@@ -510,7 +512,10 @@ func (c *Client) normalizeTrack(raw map[string]any) map[string]any {
|
||||
trackArtistNames := artistNames(raw["artists"])
|
||||
artistName := displayArtistNames(trackArtistNames)
|
||||
artistID := firstArtistID(raw["artists"])
|
||||
albumArtist := c.releaseArtistName(release["artists"])
|
||||
albumArtist := strings.TrimSpace(jsonutil.StringFromAny(release["album_artist_name"]))
|
||||
if albumArtist == "" {
|
||||
albumArtist = c.releaseArtistName(release["artists"])
|
||||
}
|
||||
if albumArtist == "" {
|
||||
albumArtist = artistName
|
||||
}
|
||||
@@ -693,6 +698,71 @@ func (c *Client) releaseArtistName(v any) string {
|
||||
return displayArtistNames(artistNames(v))
|
||||
}
|
||||
|
||||
func (c *Client) releaseArtistNameForTracks(releaseArtists any, tracks []any) string {
|
||||
common := commonReleaseArtists(releaseArtists, tracks)
|
||||
if len(common) > 0 {
|
||||
return displayArtistNames(artistNames(common))
|
||||
}
|
||||
return c.releaseArtistName(releaseArtists)
|
||||
}
|
||||
|
||||
func commonReleaseArtists(releaseArtists any, tracks []any) []any {
|
||||
items := sliceAny(releaseArtists)
|
||||
if len(items) == 0 || len(tracks) == 0 {
|
||||
return nil
|
||||
}
|
||||
counts := map[string]int{}
|
||||
trackCount := 0
|
||||
for _, rawTrack := range tracks {
|
||||
track, ok := rawTrack.(map[string]any)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
trackCount++
|
||||
seen := map[string]bool{}
|
||||
for _, rawArtist := range sliceAny(track["artists"]) {
|
||||
if key := artistIdentity(rawArtist); key != "" {
|
||||
seen[key] = true
|
||||
}
|
||||
}
|
||||
for key := range seen {
|
||||
counts[key]++
|
||||
}
|
||||
}
|
||||
if trackCount == 0 {
|
||||
return nil
|
||||
}
|
||||
common := make([]any, 0)
|
||||
for _, rawArtist := range items {
|
||||
if key := artistIdentity(rawArtist); key != "" && counts[key] == trackCount {
|
||||
common = append(common, rawArtist)
|
||||
}
|
||||
}
|
||||
return common
|
||||
}
|
||||
|
||||
func artistIdentity(raw any) string {
|
||||
m, ok := raw.(map[string]any)
|
||||
if !ok {
|
||||
return ""
|
||||
}
|
||||
if id := strings.TrimSpace(jsonutil.StringFromAny(m["id"])); id != "" {
|
||||
return "id:" + id
|
||||
}
|
||||
if name := strings.TrimSpace(jsonutil.StringFromAny(m["name"])); name != "" {
|
||||
return "name:" + strings.ToLower(name)
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func cloneMap(in map[string]any) map[string]any {
|
||||
out := make(map[string]any, len(in))
|
||||
for k, v := range in {
|
||||
out[k] = v
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func firstArtistID(v any) string {
|
||||
items := sliceAny(v)
|
||||
if len(items) == 0 {
|
||||
|
||||
Reference in New Issue
Block a user