diff --git a/go_backend/extension_fallback.go b/go_backend/extension_fallback.go index 82584ed4..7022d819 100644 --- a/go_backend/extension_fallback.go +++ b/go_backend/extension_fallback.go @@ -428,7 +428,9 @@ func DownloadWithExtensionFallback(req DownloadRequest) (*DownloadResponse, erro Name: req.TrackName, Artists: req.ArtistName, AlbumName: req.AlbumName, + AlbumArtist: req.AlbumArtist, DurationMS: req.DurationMS, + CoverURL: req.CoverURL, ISRC: req.ISRC, ReleaseDate: req.ReleaseDate, TrackNumber: req.TrackNumber, @@ -436,7 +438,14 @@ func DownloadWithExtensionFallback(req DownloadRequest) (*DownloadResponse, erro DiscNumber: req.DiscNumber, TotalDiscs: req.TotalDiscs, ProviderID: req.Source, + AlbumType: req.AlbumType, + Explicit: req.Explicit, + UPC: req.UPC, + Label: req.Label, + Copyright: req.Copyright, + Genre: req.Genre, Composer: req.Composer, + Comment: req.Comment, } enrichedTrack, err := provider.EnrichTrackForItemID(trackMeta, req.ItemID) @@ -480,6 +489,7 @@ func DownloadWithExtensionFallback(req DownloadRequest) (*DownloadResponse, erro overlayInt(&req.DiscNumber, enrichedTrack.DiscNumber, "DiscNumber") overlayInt(&req.TotalDiscs, enrichedTrack.TotalDiscs, "TotalDiscs") overlayStr(&req.Composer, enrichedTrack.Composer, "Composer") + overlayExtensionReleaseMetadata(&req, *enrichedTrack) } } } @@ -516,6 +526,7 @@ func DownloadWithExtensionFallback(req DownloadRequest) (*DownloadResponse, erro overlayStr(&req.Genre, track.Genre, "") overlayStr(&req.Label, track.Label, "") overlayStr(&req.Copyright, track.Copyright, "") + overlayExtensionReleaseMetadata(&req, track) } else if searchErr != nil { GoLog("[DownloadWithExtensionFallback] Metadata provider search failed (non-fatal): %v\n", searchErr) } diff --git a/go_backend/extension_fallback_helpers.go b/go_backend/extension_fallback_helpers.go index 9becd48f..9e6f8086 100644 --- a/go_backend/extension_fallback_helpers.go +++ b/go_backend/extension_fallback_helpers.go @@ -225,6 +225,22 @@ func overlayStr(dst *string, src, field string) { } } +// overlayExtensionReleaseMetadata carries release-level metadata discovered by +// the source catalog into a provider-agnostic download request. Existing +// source values always win; enrichment only fills fields that were missing. +func overlayExtensionReleaseMetadata(req *DownloadRequest, track ExtTrackMetadata) { + if req == nil { + return + } + overlayStr(&req.AlbumType, track.AlbumType, "AlbumType") + overlayStr(&req.UPC, track.UPC, "UPC") + overlayStr(&req.Comment, track.Comment, "Comment") + if !req.Explicit && track.Explicit { + req.Explicit = true + GoLog("[DownloadWithExtensionFallback] Explicit flag from enrichment\n") + } +} + // overlayStrTrim is overlayStr but treats a whitespace-only dst as empty too. func overlayStrTrim(dst *string, src string) { if src == "" || strings.TrimSpace(*dst) != "" { diff --git a/go_backend/extension_fallback_metadata_test.go b/go_backend/extension_fallback_metadata_test.go new file mode 100644 index 00000000..7b978c25 --- /dev/null +++ b/go_backend/extension_fallback_metadata_test.go @@ -0,0 +1,57 @@ +package gobackend + +import "testing" + +func TestOverlayExtensionReleaseMetadataFillsMissingRequestFields(t *testing.T) { + req := DownloadRequest{AlbumType: "single"} + track := ExtTrackMetadata{ + AlbumType: "album", + Explicit: true, + UPC: "4006381333931", + Comment: "https://music.apple.com/jp/album/1532211596", + } + + overlayExtensionReleaseMetadata(&req, track) + + if req.AlbumType != "single" { + t.Fatalf("existing album type was overwritten: %q", req.AlbumType) + } + if !req.Explicit { + t.Fatal("explicit flag from source enrichment was not retained") + } + if req.UPC != track.UPC { + t.Fatalf("UPC = %q, want %q", req.UPC, track.UPC) + } + if req.Comment != track.Comment { + t.Fatalf("comment = %q, want %q", req.Comment, track.Comment) + } + + response := buildDownloadSuccessResponse( + req, + DownloadResult{}, + "amazon", + "downloaded", + "song.m4a", + false, + ) + if response.UPC != track.UPC || response.AlbumType != "single" || + !response.Explicit || response.Comment != track.Comment { + t.Fatalf("enriched metadata was lost in download response: %#v", response) + } +} + +func TestOverlayExtensionReleaseMetadataDoesNotEraseExistingValues(t *testing.T) { + req := DownloadRequest{ + AlbumType: "ep", + Explicit: true, + UPC: "existing-upc", + Comment: "existing-comment", + } + + overlayExtensionReleaseMetadata(&req, ExtTrackMetadata{}) + + if req.AlbumType != "ep" || !req.Explicit || + req.UPC != "existing-upc" || req.Comment != "existing-comment" { + t.Fatalf("existing release metadata changed: %#v", req) + } +} diff --git a/go_backend/extension_provider_wrapper.go b/go_backend/extension_provider_wrapper.go index 62c3bf3f..75d9219b 100644 --- a/go_backend/extension_provider_wrapper.go +++ b/go_backend/extension_provider_wrapper.go @@ -259,6 +259,7 @@ func extensionTrackInput(track *ExtTrackMetadata) map[string]any { "copyright": track.Copyright, "genre": track.Genre, "composer": track.Composer, + "comment": track.Comment, "audio_quality": track.AudioQuality, "audio_modes": track.AudioModes, "upc": track.UPC,