mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-09-26 19:31:45 +02:00
fix(reenrich): allow correcting stale release metadata
This commit is contained in:
@@ -43,6 +43,10 @@ type reEnrichRequest struct {
|
|||||||
DurationMs int64 `json:"duration_ms"`
|
DurationMs int64 `json:"duration_ms"`
|
||||||
SearchOnline bool `json:"search_online"`
|
SearchOnline bool `json:"search_online"`
|
||||||
UpdateFields []string `json:"update_fields,omitempty"`
|
UpdateFields []string `json:"update_fields,omitempty"`
|
||||||
|
// ReplaceReleaseMetadata lets an explicit user re-enrich action repair a
|
||||||
|
// stale album identity (for example, a playlist name stored as ALBUM).
|
||||||
|
// Older callers keep the conservative mismatch-preservation behavior.
|
||||||
|
ReplaceReleaseMetadata bool `json:"replace_release_metadata,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// shouldUpdateField returns true if the given field group should be updated.
|
// shouldUpdateField returns true if the given field group should be updated.
|
||||||
@@ -92,10 +96,14 @@ func applyReEnrichTrackMetadata(req *reEnrichRequest, track ExtTrackMetadata) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sameRelease := reEnrichSameRelease(req.AlbumName, track.AlbumName)
|
albumMatches := reEnrichSameRelease(req.AlbumName, track.AlbumName)
|
||||||
|
sameRelease := req.ReplaceReleaseMetadata || albumMatches
|
||||||
if !sameRelease {
|
if !sameRelease {
|
||||||
GoLog("[ReEnrich] Candidate album %q differs from file album %q; keeping release identity (album, cover, positions, date)\n",
|
GoLog("[ReEnrich] Candidate album %q differs from file album %q; keeping release identity (album, cover, positions, date)\n",
|
||||||
track.AlbumName, req.AlbumName)
|
track.AlbumName, req.AlbumName)
|
||||||
|
} else if req.ReplaceReleaseMetadata && !albumMatches {
|
||||||
|
GoLog("[ReEnrich] Candidate album %q differs from file album %q; replacing release identity as requested\n",
|
||||||
|
track.AlbumName, req.AlbumName)
|
||||||
}
|
}
|
||||||
|
|
||||||
if track.SpotifyID != "" {
|
if track.SpotifyID != "" {
|
||||||
|
|||||||
@@ -405,6 +405,44 @@ func TestApplyReEnrichTrackMetadataKeepsReleaseIdentityOnAlbumMismatch(t *testin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestApplyReEnrichTrackMetadataReplacesStalePlaylistAlbumWhenRequested(t *testing.T) {
|
||||||
|
req := reEnrichRequest{
|
||||||
|
TrackName: "Song",
|
||||||
|
ArtistName: "Artist",
|
||||||
|
AlbumName: "Road Trip Playlist",
|
||||||
|
CoverURL: "https://covers/playlist.jpg",
|
||||||
|
TrackNumber: 42,
|
||||||
|
ReleaseDate: "",
|
||||||
|
ReplaceReleaseMetadata: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
applyReEnrichTrackMetadata(&req, ExtTrackMetadata{
|
||||||
|
Name: "Song",
|
||||||
|
Artists: "Artist",
|
||||||
|
AlbumName: "Actual Album",
|
||||||
|
AlbumArtist: "Artist",
|
||||||
|
CoverURL: "https://covers/album.jpg",
|
||||||
|
TrackNumber: 3,
|
||||||
|
ReleaseDate: "2024-01-01",
|
||||||
|
})
|
||||||
|
|
||||||
|
if req.AlbumName != "Actual Album" {
|
||||||
|
t.Fatalf("album = %q, want actual album", req.AlbumName)
|
||||||
|
}
|
||||||
|
if req.AlbumArtist != "Artist" {
|
||||||
|
t.Fatalf("album artist = %q", req.AlbumArtist)
|
||||||
|
}
|
||||||
|
if req.CoverURL != "https://covers/album.jpg" {
|
||||||
|
t.Fatalf("cover = %q", req.CoverURL)
|
||||||
|
}
|
||||||
|
if req.TrackNumber != 3 {
|
||||||
|
t.Fatalf("track number = %d", req.TrackNumber)
|
||||||
|
}
|
||||||
|
if req.ReleaseDate != "2024-01-01" {
|
||||||
|
t.Fatalf("release date = %q", req.ReleaseDate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSelectBestReEnrichTrackPrefersCandidateWithReleaseDate(t *testing.T) {
|
func TestSelectBestReEnrichTrackPrefersCandidateWithReleaseDate(t *testing.T) {
|
||||||
req := reEnrichRequest{
|
req := reEnrichRequest{
|
||||||
TrackName: "Song Title",
|
TrackName: "Song Title",
|
||||||
|
|||||||
@@ -454,6 +454,7 @@ class _LocalAlbumScreenState extends ConsumerState<LocalAlbumScreen>
|
|||||||
'copyright': '',
|
'copyright': '',
|
||||||
'duration_ms': durationMs,
|
'duration_ms': durationMs,
|
||||||
'search_online': true,
|
'search_online': true,
|
||||||
|
'replace_release_metadata': true,
|
||||||
// ignore: use_null_aware_elements
|
// ignore: use_null_aware_elements
|
||||||
if (updateFields != null) 'update_fields': updateFields,
|
if (updateFields != null) 'update_fields': updateFields,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ extension _QueueTabBatchActions on _QueueTabState {
|
|||||||
'copyright': '',
|
'copyright': '',
|
||||||
'duration_ms': durationMs,
|
'duration_ms': durationMs,
|
||||||
'search_online': true,
|
'search_online': true,
|
||||||
|
'replace_release_metadata': true,
|
||||||
// ignore: use_null_aware_elements
|
// ignore: use_null_aware_elements
|
||||||
if (updateFields != null) 'update_fields': updateFields,
|
if (updateFields != null) 'update_fields': updateFields,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -970,6 +970,7 @@ extension _TrackMetadataLyricsAndSaving on _TrackMetadataScreenState {
|
|||||||
'composer': composer ?? '',
|
'composer': composer ?? '',
|
||||||
'duration_ms': durationMs,
|
'duration_ms': durationMs,
|
||||||
'search_online': true,
|
'search_online': true,
|
||||||
|
'replace_release_metadata': true,
|
||||||
};
|
};
|
||||||
|
|
||||||
final result = await PlatformBridge.reEnrichFile(request);
|
final result = await PlatformBridge.reEnrichFile(request);
|
||||||
|
|||||||
Reference in New Issue
Block a user