fix(metadata): preserve source release fields across providers

This commit is contained in:
zarzet
2026-08-18 20:57:11 +07:00
parent 8b231be19a
commit fd12ad2dbe
4 changed files with 85 additions and 0 deletions
+11
View File
@@ -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)
}
+16
View File
@@ -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) != "" {
@@ -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)
}
}
+1
View File
@@ -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,