diff --git a/go_backend/exports.go b/go_backend/exports.go index 32717325..e9d63ea8 100644 --- a/go_backend/exports.go +++ b/go_backend/exports.go @@ -594,6 +594,14 @@ func selectBestReEnrichTrack(req reEnrichRequest, tracks []ExtTrackMetadata) *Ex downloadReq := reEnrichDownloadRequest(req) currentISRC := strings.TrimSpace(req.ISRC) currentAlbum := strings.TrimSpace(req.AlbumName) + effectiveTrackName := req.TrackName + if isPlaceholderReEnrichValue(effectiveTrackName) { + effectiveTrackName = "" + } + effectiveArtistName := req.ArtistName + if isPlaceholderReEnrichValue(effectiveArtistName) { + effectiveArtistName = "" + } var best *ExtTrackMetadata bestScore := -1 << 30 @@ -601,8 +609,8 @@ func selectBestReEnrichTrack(req reEnrichRequest, tracks []ExtTrackMetadata) *Ex track := &tracks[i] score := 0 exactISRCMatch := currentISRC != "" && strings.EqualFold(currentISRC, strings.TrimSpace(track.ISRC)) - titleMatches := req.TrackName != "" && track.Name != "" && titlesMatch(req.TrackName, track.Name) - artistMatches := req.ArtistName != "" && track.Artists != "" && artistsMatch(req.ArtistName, track.Artists) + titleMatches := effectiveTrackName != "" && track.Name != "" && titlesMatch(effectiveTrackName, track.Name) + artistMatches := effectiveArtistName != "" && track.Artists != "" && artistsMatch(effectiveArtistName, track.Artists) albumMatches := currentAlbum != "" && track.AlbumName != "" && titlesMatch(currentAlbum, track.AlbumName) resolved := resolvedTrackInfo{ @@ -614,16 +622,16 @@ func selectBestReEnrichTrack(req reEnrichRequest, tracks []ExtTrackMetadata) *Ex verified := trackMatchesRequest(downloadReq, resolved, "ReEnrich") if !exactISRCMatch { - if req.TrackName != "" && !titleMatches { + if effectiveTrackName != "" && !titleMatches { continue } - if req.ArtistName != "" && !artistMatches { + if effectiveArtistName != "" && !artistMatches { continue } - if req.TrackName == "" && req.ArtistName == "" && currentAlbum != "" && !albumMatches { + if effectiveTrackName == "" && effectiveArtistName == "" && currentAlbum != "" && !albumMatches { continue } - if req.TrackName == "" && req.ArtistName == "" && currentAlbum == "" && !verified { + if effectiveTrackName == "" && effectiveArtistName == "" && currentAlbum == "" && !verified { continue } } diff --git a/go_backend/exports_test.go b/go_backend/exports_test.go index 7ca487a5..dc0a8ccb 100644 --- a/go_backend/exports_test.go +++ b/go_backend/exports_test.go @@ -463,6 +463,34 @@ func TestSelectBestReEnrichTrackAllowsExactISRCDespiteMetadataMismatch(t *testin } } +func TestSelectBestReEnrichTrackPlaceholderFallsBackToAlbum(t *testing.T) { + req := reEnrichRequest{ + TrackName: "Unknown Title", + ArtistName: "Unknown Artist", + AlbumName: "Harry Styles", + DurationMs: 180000, + } + + tracks := []ExtTrackMetadata{ + { + ID: "album-match", + Name: "Sign of the Times", + Artists: "Harry Styles", + AlbumName: "Harry Styles", + DurationMS: 180000, + ProviderID: "deezer", + }, + } + + best := selectBestReEnrichTrack(req, tracks) + if best == nil { + t.Fatal("expected album-matching candidate to be selected when title/artist are placeholders") + } + if best.ID != "album-match" { + t.Fatalf("selected track = %q, want album-match", best.ID) + } +} + func TestBuildReEnrichFFmpegMetadataOmitsEmptyFields(t *testing.T) { req := reEnrichRequest{ TrackName: "Song", diff --git a/lib/screens/track_metadata_edit_sheet.dart b/lib/screens/track_metadata_edit_sheet.dart index d22e77ec..8593bb12 100644 --- a/lib/screens/track_metadata_edit_sheet.dart +++ b/lib/screens/track_metadata_edit_sheet.dart @@ -643,6 +643,9 @@ class _EditMetadataSheetState extends State<_EditMetadataSheet> { if (currentTitle.isNotEmpty) { return titleMatches; } + if (currentAlbum.isNotEmpty) { + return albumMatches; + } return false; }