mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-09-30 21:29:36 +02:00
fix(metadata): resolve album artist consistently across separate downloads
This commit is contained in:
1 parent
25c6292783
commit
fb13b87561
6 files changed
+206
No files matched your search
@@ -0,0 +1,42 @@
|
||||
import 'package:spotiflac_android/models/track.dart';
|
||||
import 'package:spotiflac_android/services/platform_bridge.dart';
|
||||
import 'package:spotiflac_android/utils/logger.dart';
|
||||
import 'package:spotiflac_android/utils/string_utils.dart';
|
||||
|
||||
final _log = AppLogger('DownloadAlbumMetadata');
|
||||
|
||||
/// Resolve the release credit independently of which tracks were selected.
|
||||
/// The bridge caches album responses and coalesces concurrent album lookups.
|
||||
Future<Track> resolveDownloadAlbumArtist(
|
||||
Track track,
|
||||
String providerId, {
|
||||
Future<Map<String, dynamic>> Function(String, String, String)? loadMetadata,
|
||||
}) async {
|
||||
final albumId = normalizeOptionalString(track.albumId);
|
||||
if (albumId == null || providerId.isEmpty) return track;
|
||||
try {
|
||||
final response = await (loadMetadata ?? PlatformBridge.getProviderMetadata)(
|
||||
providerId,
|
||||
'album',
|
||||
albumId,
|
||||
).timeout(const Duration(seconds: 8));
|
||||
final info = response['album_info'] ?? response['album'] ?? response;
|
||||
if (info is! Map<String, dynamic>) return track;
|
||||
final returnedId = normalizeOptionalString(info['id']?.toString());
|
||||
if (returnedId != null && returnedId != albumId) return track;
|
||||
// Only album-level credits are authoritative. Track artists may include
|
||||
// guests, and compilations/joint albums must retain their complete credit.
|
||||
String? artist;
|
||||
for (final key in ['album_artist', 'artists', 'artist']) {
|
||||
final value = info[key];
|
||||
if (value is String) artist = normalizeOptionalString(value);
|
||||
if (artist != null) break;
|
||||
}
|
||||
return artist == null || artist == track.albumArtist
|
||||
? track
|
||||
: track.copyWith(albumArtist: artist);
|
||||
} catch (error) {
|
||||
_log.w('Album credit lookup failed; keeping track metadata: $error');
|
||||
return track;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user