diff --git a/go_backend/deezer.go b/go_backend/deezer.go index cb82a7f4..2fb92c58 100644 --- a/go_backend/deezer.go +++ b/go_backend/deezer.go @@ -766,6 +766,32 @@ func (c *DeezerClient) GetExtendedMetadataByTrackID(ctx context.Context, trackID return c.GetAlbumExtendedMetadata(ctx, albumID) } +// GetExtendedMetadataByISRC searches for a track by ISRC and fetches extended metadata (genre, label) +func (c *DeezerClient) GetExtendedMetadataByISRC(ctx context.Context, isrc string) (*AlbumExtendedMetadata, error) { + if isrc == "" { + return nil, fmt.Errorf("empty ISRC") + } + + // First, search for track by ISRC + track, err := c.SearchByISRC(ctx, isrc) + if err != nil { + return nil, fmt.Errorf("failed to find track by ISRC: %w", err) + } + + // SpotifyID contains "deezer:123" format, extract the ID + deezerID := track.SpotifyID + if strings.HasPrefix(deezerID, "deezer:") { + deezerID = strings.TrimPrefix(deezerID, "deezer:") + } + + if deezerID == "" { + return nil, fmt.Errorf("track found but no Deezer ID") + } + + // Then fetch extended metadata using the Deezer track ID + return c.GetExtendedMetadataByTrackID(ctx, deezerID) +} + func (c *DeezerClient) getJSON(ctx context.Context, endpoint string, dst interface{}) error { req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil) if err != nil { diff --git a/go_backend/extension_providers.go b/go_backend/extension_providers.go index 6c202583..672a06c9 100644 --- a/go_backend/extension_providers.go +++ b/go_backend/extension_providers.go @@ -2,6 +2,7 @@ package gobackend import ( + "context" "encoding/json" "errors" "fmt" @@ -943,6 +944,27 @@ func DownloadWithExtensionFallback(req DownloadRequest) (*DownloadResponse, erro GoLog("[DownloadWithExtensionFallback] Trying provider: %s\n", providerID) if isBuiltInProvider(providerID) { + // For built-in providers, enrich with Deezer metadata if not already present + if (req.Genre == "" || req.Label == "") && req.ISRC != "" { + GoLog("[DownloadWithExtensionFallback] Enriching extended metadata from Deezer for ISRC: %s\n", req.ISRC) + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + deezerClient := GetDeezerClient() + extMeta, err := deezerClient.GetExtendedMetadataByISRC(ctx, req.ISRC) + cancel() + if err == nil && extMeta != nil { + if req.Genre == "" && extMeta.Genre != "" { + req.Genre = extMeta.Genre + GoLog("[DownloadWithExtensionFallback] Genre from Deezer: %s\n", req.Genre) + } + if req.Label == "" && extMeta.Label != "" { + req.Label = extMeta.Label + GoLog("[DownloadWithExtensionFallback] Label from Deezer: %s\n", req.Label) + } + } else if err != nil { + GoLog("[DownloadWithExtensionFallback] Failed to get extended metadata from Deezer: %v\n", err) + } + } + // Use built-in provider result, err := tryBuiltInProvider(providerID, req) if err == nil && result.Success {