From d7fa040e3cef20c5f172623163cd05e69141d408 Mon Sep 17 00:00:00 2001 From: zarzet Date: Wed, 7 Jan 2026 04:25:35 +0700 Subject: [PATCH] fix: Deezer artist/album screen improvements - Fix album_screen to support Deezer album IDs (deezer:xxx format) - Use getSpotifyMetadataWithFallback for Spotify albums - Hide track count in artist discography when not available from Deezer API - Deezer /artist/{id}/albums endpoint doesn't return nb_tracks --- lib/screens/album_screen.dart | 18 ++++++++++++++++-- lib/screens/artist_screen.dart | 27 ++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/lib/screens/album_screen.dart b/lib/screens/album_screen.dart index 6c8be651..87fc3fca 100644 --- a/lib/screens/album_screen.dart +++ b/lib/screens/album_screen.dart @@ -71,8 +71,22 @@ class _AlbumScreenState extends ConsumerState { Future _fetchTracks() async { setState(() => _isLoading = true); try { - final url = 'https://open.spotify.com/album/${widget.albumId}'; - final metadata = await PlatformBridge.getSpotifyMetadata(url); + Map metadata; + + // Check if this is a Deezer album ID (format: "deezer:123456") + if (widget.albumId.startsWith('deezer:')) { + final deezerAlbumId = widget.albumId.replaceFirst('deezer:', ''); + // ignore: avoid_print + print('[AlbumScreen] Fetching from Deezer: $deezerAlbumId'); + metadata = await PlatformBridge.getDeezerMetadata('album', deezerAlbumId); + } else { + // Spotify album - use fallback method + // ignore: avoid_print + print('[AlbumScreen] Fetching from Spotify with fallback: ${widget.albumId}'); + final url = 'https://open.spotify.com/album/${widget.albumId}'; + metadata = await PlatformBridge.getSpotifyMetadataWithFallback(url); + } + final trackList = metadata['track_list'] as List; final tracks = trackList.map((t) => _parseTrack(t as Map)).toList(); diff --git a/lib/screens/artist_screen.dart b/lib/screens/artist_screen.dart index 94629224..5b96fd49 100644 --- a/lib/screens/artist_screen.dart +++ b/lib/screens/artist_screen.dart @@ -69,10 +69,25 @@ class _ArtistScreenState extends ConsumerState { Future _fetchDiscography() async { setState(() => _isLoadingDiscography = true); try { - final url = 'https://open.spotify.com/artist/${widget.artistId}'; - final metadata = await PlatformBridge.getSpotifyMetadata(url); - final albumsList = metadata['albums'] as List; - final albums = albumsList.map((a) => _parseArtistAlbum(a as Map)).toList(); + List albums; + + // Check if this is a Deezer artist ID (format: "deezer:123456") + if (widget.artistId.startsWith('deezer:')) { + final deezerArtistId = widget.artistId.replaceFirst('deezer:', ''); + // ignore: avoid_print + print('[ArtistScreen] Fetching from Deezer: $deezerArtistId'); + final metadata = await PlatformBridge.getDeezerMetadata('artist', deezerArtistId); + final albumsList = metadata['albums'] as List; + albums = albumsList.map((a) => _parseArtistAlbum(a as Map)).toList(); + } else { + // Spotify artist - use fallback method + // ignore: avoid_print + print('[ArtistScreen] Fetching from Spotify with fallback: ${widget.artistId}'); + final url = 'https://open.spotify.com/artist/${widget.artistId}'; + final metadata = await PlatformBridge.getSpotifyMetadataWithFallback(url); + final albumsList = metadata['albums'] as List; + albums = albumsList.map((a) => _parseArtistAlbum(a as Map)).toList(); + } // Store in cache _ArtistCache.set(widget.artistId, albums); @@ -290,7 +305,9 @@ class _ArtistScreenState extends ConsumerState { Text(album.name, style: Theme.of(context).textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w600), maxLines: 2, overflow: TextOverflow.ellipsis), const Spacer(), Text( - '${album.releaseDate.length >= 4 ? album.releaseDate.substring(0, 4) : album.releaseDate} • ${album.totalTracks} tracks', + album.totalTracks > 0 + ? '${album.releaseDate.length >= 4 ? album.releaseDate.substring(0, 4) : album.releaseDate} • ${album.totalTracks} tracks' + : album.releaseDate.length >= 4 ? album.releaseDate.substring(0, 4) : album.releaseDate, style: Theme.of(context).textTheme.bodySmall?.copyWith(color: colorScheme.onSurfaceVariant, fontSize: 11), maxLines: 1, overflow: TextOverflow.ellipsis,