diff --git a/lib/features/playlist/data/datasources/playlist_remote_datasource.dart b/lib/features/playlist/data/datasources/playlist_remote_datasource.dart index 99fdb03d..9d745fd2 100644 --- a/lib/features/playlist/data/datasources/playlist_remote_datasource.dart +++ b/lib/features/playlist/data/datasources/playlist_remote_datasource.dart @@ -284,24 +284,48 @@ class PlaylistRemoteDatasource { // ============================================================ Future> fetchPlaylistTracks( String playlistId, { - int page = 1, int limit = 20, }) async { - _log('→ GET /playlists/$playlistId/tracks page=$page limit=$limit'); - try { - final response = await _dio.get>( - '/playlists/$playlistId/tracks', - queryParameters: {'page': page, 'limit': limit}, - ); - _log('← ${response.statusCode}'); - final data = response.data!['data'] as Map; - final trackList = data['tracks'] as List; - _log('← Got ${trackList.length} tracks for playlist $playlistId'); - return PlaylistTrackModel.fromJsonList(trackList); - } on DioException catch (e) { - _logError('fetchPlaylistTracks($playlistId) failed', e); - rethrow; + final allTracks = []; + int page = 1; + bool hasNext = true; + const int maxPages = 20; // safety cap — 20 pages × 20 = 400 tracks max + + while (hasNext && page <= maxPages) { + _log('→ GET /playlists/$playlistId/tracks page=$page limit=$limit'); + try { + final response = await _dio.get>( + '/playlists/$playlistId/tracks', + queryParameters: {'page': page, 'limit': limit}, + ); + _log('← ${response.statusCode}'); + + final data = response.data!['data'] as Map; + final trackList = data['tracks'] as List; + final pagination = data['pagination'] as Map?; + + _log( + '← Page $page: ${trackList.length} tracks' + ' has_next=${pagination?['has_next']}', + ); + + final parsed = PlaylistTrackModel.fromJsonList(trackList); + allTracks.addAll(parsed); + + // Check if there are more pages + hasNext = pagination?['has_next'] as bool? ?? false; + page++; + } on DioException catch (e) { + _logError('fetchPlaylistTracks($playlistId) page=$page failed', e); + rethrow; + } } + + _log( + '← fetchPlaylistTracks done: ${allTracks.length} total tracks ' + 'across ${page - 1} page(s)', + ); + return allTracks; } // ============================================================