From 9e0f25f0e26366131b275c7a5f7eb6b616ee9ac1 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 20 Nov 2025 19:30:18 +0000 Subject: [PATCH] fix: try multiple endpoints and improve series parsing - Try filterdata endpoint first (like genres) - Fall back to series endpoint if needed - Make SimpleSeries.fromJson more robust with multiple field name attempts - Add extensive logging to debug series loading issues --- lib/api/library_browser_provider.dart | 49 +++++++++++++++++++++------ 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/lib/api/library_browser_provider.dart b/lib/api/library_browser_provider.dart index 8f76711..df816e5 100644 --- a/lib/api/library_browser_provider.dart +++ b/lib/api/library_browser_provider.dart @@ -20,11 +20,18 @@ class SimpleSeries { }); factory SimpleSeries.fromJson(Map json) { - return SimpleSeries( - id: json['id'] as String, - name: json['name'] as String, - numBooks: json['numBooks'] as int?, - ); + try { + return SimpleSeries( + id: json['id'] as String, + name: json['name'] as String, + numBooks: json['numBooks'] as int? ?? + json['num_books'] as int? ?? + (json['books'] as List?)?.length, + ); + } catch (e) { + _logger.warning('Error parsing series: $e. JSON: $json'); + rethrow; + } } } @@ -97,12 +104,36 @@ Future> librarySeries(Ref ref) async { } try { - // Use raw API call to avoid Series deserialization issues + // First try: Get from filterdata endpoint (same as genres) + final filterDataSeries = await api.getJson>( + path: '/api/libraries/${currentLibrary.id}/filterdata', + requiresAuth: true, + fromJson: (json) { + _logger.info('FilterData API response keys: ${json is Map ? (json as Map).keys : json.runtimeType}'); + + if (json is Map && json.containsKey('series')) { + final seriesList = json['series'] as List; + _logger.info('Found ${seriesList.length} series in filterdata'); + return seriesList + .map((e) => SimpleSeries.fromJson(e as Map)) + .toList(); + } + return []; + }, + ); + + if (filterDataSeries != null && filterDataSeries.isNotEmpty) { + _logger.fine('Fetched ${filterDataSeries.length} series from filterdata'); + return filterDataSeries; + } + + // Second try: Get from series endpoint + _logger.info('Trying series endpoint...'); final seriesList = await api.getJson>( path: '/api/libraries/${currentLibrary.id}/series', requiresAuth: true, fromJson: (json) { - _logger.info('Series API response: $json'); + _logger.info('Series API response keys: ${json is Map ? (json as Map).keys : json.runtimeType}'); if (json is Map) { if (json.containsKey('results')) { @@ -111,11 +142,7 @@ Future> librarySeries(Ref ref) async { return results .map((e) => SimpleSeries.fromJson(e as Map)) .toList(); - } else { - _logger.warning('No results key in response. Keys: ${json.keys}'); } - } else { - _logger.warning('Response is not a Map. Type: ${json.runtimeType}'); } return []; },