mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-08-26 12:52:40 +02:00
fix(metadata): preserve source release fields across providers
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user