fix(metadata): preserve the selected recording during download enrichment

This commit is contained in:
zarzet committed 2026-09-30 20:58:18 +07:00
1 parent 88508c806a
commit 2538cdffe1
2 files changed
+70 -4

No files matched your search

+19 -4
View File
@@ -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<Track> enrichIncompleteDownloadTrack(
final data = response['track'];
if (data is! Map<String, dynamic>) 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,
+51
View File
@@ -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 {