mirror of
https://gitlab.com/foxixus/neomovies_mobile.git
synced 2025-10-28 12:38:51 +05:00
fix: improve API response parsing with detailed logging
Problem:
- Gray screens on movie details and downloads
- No error messages shown to debug issues
- API response structure not fully validated
Solution:
1. Enhanced Movie.fromJson() parsing:
- Added detailed logging for each parsing step
- Safe genre parsing: handles [{id: 18, name: Drama}]
- Safe date parsing with null checks
- Safe runtime parsing for both movies and TV shows
- Better media type detection (movie vs tv)
- Comprehensive error logging with stack traces
2. Added detailed API logging:
- getMovieById(): Log request URL, response status, body preview
- getTvShowById(): Log request URL, response status, body preview
- Log API response structure (keys, types, unwrapped data)
- Makes debugging much easier
3. Based on backend API structure:
Backend returns: {"success": true, "data": {...}}
Movie fields from TMDB:
- id (number)
- title or name (string)
- genres: [{"id": int, "name": string}]
- release_date or first_air_date (string)
- vote_average (number)
- runtime or episode_run_time (number/array)
- number_of_seasons, number_of_episodes (int, optional)
Logging examples:
- 'Parsing Movie from JSON: [id, title, genres, ...]'
- 'Parsed genres: [Drama, Thriller, Mystery]'
- 'Successfully parsed movie: Fight Club'
- 'Response status: 200'
- 'Movie data keys: [id, title, overview, ...]'
Changes:
- lib/data/models/movie.dart: Complete rewrite with safe parsing
- lib/data/api/neomovies_api_client.dart: Add detailed logging
Result:
✅ Safer JSON parsing with null checks
✅ Detailed error logging for debugging
✅ Handles all edge cases from API
✅ Easy to debug gray screen issues via logs
Next steps:
Test the app and check Flutter debug console for:
- API request URLs
- Response bodies
- Parsing errors (if any)
- Successful movie loading messages
This commit is contained in:
@@ -186,17 +186,28 @@ class NeoMoviesApiClient {
|
||||
/// Get movie by ID
|
||||
Future<Movie> getMovieById(String id) async {
|
||||
final uri = Uri.parse('$apiUrl/movies/$id');
|
||||
print('Fetching movie from: $uri');
|
||||
final response = await _client.get(uri);
|
||||
|
||||
print('Response status: ${response.statusCode}');
|
||||
print('Response body: ${response.body.substring(0, response.body.length > 500 ? 500 : response.body.length)}...');
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final apiResponse = json.decode(response.body);
|
||||
print('Decoded API response type: ${apiResponse.runtimeType}');
|
||||
print('API response keys: ${apiResponse is Map ? apiResponse.keys.toList() : 'Not a map'}');
|
||||
|
||||
// API returns: {"success": true, "data": {...}}
|
||||
final movieData = (apiResponse is Map && apiResponse['data'] != null)
|
||||
? apiResponse['data']
|
||||
: apiResponse;
|
||||
|
||||
print('Movie data keys: ${movieData is Map ? movieData.keys.toList() : 'Not a map'}');
|
||||
print('Movie data: $movieData');
|
||||
|
||||
return Movie.fromJson(movieData);
|
||||
} else {
|
||||
throw Exception('Failed to load movie: ${response.statusCode}');
|
||||
throw Exception('Failed to load movie: ${response.statusCode} - ${response.body}');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -227,17 +238,28 @@ class NeoMoviesApiClient {
|
||||
/// Get TV show by ID
|
||||
Future<Movie> getTvShowById(String id) async {
|
||||
final uri = Uri.parse('$apiUrl/tv/$id');
|
||||
print('Fetching TV show from: $uri');
|
||||
final response = await _client.get(uri);
|
||||
|
||||
print('Response status: ${response.statusCode}');
|
||||
print('Response body: ${response.body.substring(0, response.body.length > 500 ? 500 : response.body.length)}...');
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final apiResponse = json.decode(response.body);
|
||||
print('Decoded API response type: ${apiResponse.runtimeType}');
|
||||
print('API response keys: ${apiResponse is Map ? apiResponse.keys.toList() : 'Not a map'}');
|
||||
|
||||
// API returns: {"success": true, "data": {...}}
|
||||
final tvData = (apiResponse is Map && apiResponse['data'] != null)
|
||||
? apiResponse['data']
|
||||
: apiResponse;
|
||||
|
||||
print('TV data keys: ${tvData is Map ? tvData.keys.toList() : 'Not a map'}');
|
||||
print('TV data: $tvData');
|
||||
|
||||
return Movie.fromJson(tvData);
|
||||
} else {
|
||||
throw Exception('Failed to load TV show: ${response.statusCode}');
|
||||
throw Exception('Failed to load TV show: ${response.statusCode} - ${response.body}');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user