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
This commit is contained in:
Claude 2025-11-20 19:30:18 +00:00
parent f4d1914b21
commit 9e0f25f0e2
No known key found for this signature in database

View file

@ -20,11 +20,18 @@ class SimpleSeries {
}); });
factory SimpleSeries.fromJson(Map<String, dynamic> json) { factory SimpleSeries.fromJson(Map<String, dynamic> json) {
return SimpleSeries( try {
id: json['id'] as String, return SimpleSeries(
name: json['name'] as String, id: json['id'] as String,
numBooks: json['numBooks'] as int?, 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<List<SimpleSeries>> librarySeries(Ref ref) async {
} }
try { try {
// Use raw API call to avoid Series deserialization issues // First try: Get from filterdata endpoint (same as genres)
final filterDataSeries = await api.getJson<List<SimpleSeries>>(
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<String, dynamic> && json.containsKey('series')) {
final seriesList = json['series'] as List<dynamic>;
_logger.info('Found ${seriesList.length} series in filterdata');
return seriesList
.map((e) => SimpleSeries.fromJson(e as Map<String, dynamic>))
.toList();
}
return <SimpleSeries>[];
},
);
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<List<SimpleSeries>>( final seriesList = await api.getJson<List<SimpleSeries>>(
path: '/api/libraries/${currentLibrary.id}/series', path: '/api/libraries/${currentLibrary.id}/series',
requiresAuth: true, requiresAuth: true,
fromJson: (json) { 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<String, dynamic>) { if (json is Map<String, dynamic>) {
if (json.containsKey('results')) { if (json.containsKey('results')) {
@ -111,11 +142,7 @@ Future<List<SimpleSeries>> librarySeries(Ref ref) async {
return results return results
.map((e) => SimpleSeries.fromJson(e as Map<String, dynamic>)) .map((e) => SimpleSeries.fromJson(e as Map<String, dynamic>))
.toList(); .toList();
} else {
_logger.warning('No results key in response. Keys: ${json.keys}');
} }
} else {
_logger.warning('Response is not a Map. Type: ${json.runtimeType}');
} }
return <SimpleSeries>[]; return <SimpleSeries>[];
}, },