From 2538cdffe1361ff30ef86fe9f0bdc186006db395 Mon Sep 17 00:00:00 2001 From: zarzet <42882290+zarzet@users.noreply.github.com> Date: Wed, 30 Sep 2026 20:58:18 +0700 Subject: [PATCH] fix(metadata): preserve the selected recording during download enrichment --- lib/services/download_track_metadata.dart | 23 ++++++++-- test/download_track_metadata_test.dart | 51 +++++++++++++++++++++++ 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/lib/services/download_track_metadata.dart b/lib/services/download_track_metadata.dart index 4889bb4f..80c710b6 100644 --- a/lib/services/download_track_metadata.dart +++ b/lib/services/download_track_metadata.dart @@ -1,6 +1,7 @@ import 'package:spotiflac_android/models/track.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; import 'package:spotiflac_android/utils/int_utils.dart'; +import 'package:spotiflac_android/utils/isrc_utils.dart'; import 'package:spotiflac_android/utils/logger.dart'; import 'package:spotiflac_android/utils/string_utils.dart'; @@ -26,18 +27,32 @@ Future enrichIncompleteDownloadTrack( final data = response['track']; if (data is! Map) return track; String? text(String key) => normalizeOptionalString(data[key]?.toString()); + final selectedIsrc = normalizeIsrc(track.isrc); + final resolvedIsrc = normalizeIsrc(text('isrc')); + if (selectedIsrc.isNotEmpty && + resolvedIsrc.isNotEmpty && + selectedIsrc != resolvedIsrc) { + AppLogger( + 'DownloadMetadata', + ).w('Ignoring supplemental metadata for a different recording'); + return track; + } final durationMs = readPositiveInt(data['duration_ms']); return track.copyWith( - id: text('spotify_id') ?? track.id, - name: text('name') ?? track.name, - artistName: text('artists') ?? track.artistName, + // This lookup fills missing credits; the selected track still determines + // which recording is downloaded and named (including remix qualifiers). + name: normalizeOptionalString(track.name) ?? text('name') ?? track.name, + artistName: + normalizeOptionalString(track.artistName) ?? + text('artists') ?? + track.artistName, albumName: text('album_name') ?? track.albumName, albumArtist: text('album_artist') ?? track.albumArtist, artistId: text('artist_id') ?? text('artistId') ?? track.artistId, albumId: text('album_id') ?? track.albumId, coverUrl: text('images') ?? track.coverUrl, duration: durationMs == null ? track.duration : durationMs ~/ 1000, - isrc: text('isrc') ?? track.isrc, + isrc: normalizeOptionalString(track.isrc) ?? text('isrc'), trackNumber: readPositiveInt(data['track_number']) ?? track.trackNumber, discNumber: readPositiveInt(data['disc_number']) ?? track.discNumber, totalDiscs: readPositiveInt(data['total_discs']) ?? track.totalDiscs, diff --git a/test/download_track_metadata_test.dart b/test/download_track_metadata_test.dart index 1afe90d7..6b18f1d7 100644 --- a/test/download_track_metadata_test.dart +++ b/test/download_track_metadata_test.dart @@ -78,6 +78,57 @@ void main() { expect(enriched.toJson(), original.toJson()); }); + for (final remix in [false, true]) { + test( + 'supplemental credits cannot rename the selected recording (remix=$remix)', + () async { + final selected = original.copyWith( + name: remix ? 'Song (Club Remix)' : 'Song', + isrc: 'USAAA2400001', + ); + final enriched = await enrichIncompleteDownloadTrack( + selected, + 'example', + 'track', + loadMetadata: (_, _, _) async => { + 'track': { + 'spotify_id': 'example:other-recording', + 'name': remix ? 'Song' : 'Song (Club Remix)', + 'artists': 'Another artist', + 'composer': 'Composer', + }, + }, + ); + expect(enriched.id, selected.id); + expect(enriched.name, selected.name); + expect(enriched.artistName, selected.artistName); + expect(enriched.isrc, selected.isrc); + expect(enriched.composer, 'Composer'); + }, + ); + } + + test( + 'conflicting ISRC rejects all supplemental recording metadata', + () async { + final selected = original.copyWith(isrc: 'US-AAA-24-00001'); + final enriched = await enrichIncompleteDownloadTrack( + selected, + 'example', + 'track', + loadMetadata: (_, _, _) async => { + 'track': { + 'isrc': 'USAAA2400002', + 'album_name': 'Another Album', + 'images': 'https://example.test/another-cover', + 'composer': 'Another Composer', + }, + }, + ); + expect(enriched, same(selected)); + }, + ); + test( 'complete tracks avoid an extra lookup and failed lookups keep source metadata', () async {