// lib/core/api/tmdb_api.dart import 'package:dio/dio.dart'; import '../config.dart'; class TmdbApi { final Dio _dio; TmdbApi() : _dio = Dio( BaseOptions( baseUrl: 'https://api.themoviedb.org/3', headers: { 'Accept': 'application/json', }, validateStatus: (code) => code != null && code < 500, ), ); Map get _auth => { 'api_key': AppConfig.tmdbApiKey, 'language': 'de-DE', }; Future> getMovie(int id) async { final res = await _dio.get( '/movie/$id', queryParameters: { ..._auth, 'append_to_response': 'images,credits', }, ); if (res.statusCode != 200) { throw Exception( 'TMDB getMovie($id) failed: ${res.statusCode} ${res.data}'); } return Map.from(res.data); } Future>> searchMovies(String query, {int page = 1}) async { final res = await _dio.get( '/search/movie', queryParameters: { ..._auth, 'query': query, 'page': page, 'include_adult': false, }, ); if (res.statusCode != 200) { throw Exception('TMDB searchMovies failed: ${res.statusCode} ${res.data}'); } final data = res.data as Map; final results = (data['results'] as List? ?? const []) .map((e) => Map.from(e as Map)) .toList(); return results; } Future>> searchShows(String query, {int page = 1}) async { final res = await _dio.get( '/search/tv', queryParameters: { ..._auth, 'query': query, 'page': page, 'include_adult': false, }, ); if (res.statusCode != 200) { throw Exception('TMDB searchShows failed: ${res.statusCode} ${res.data}'); } final data = res.data as Map; final results = (data['results'] as List? ?? const []) .map((e) => Map.from(e as Map)) .toList(); return results; } Future> getShow(int id) async { final res = await _dio.get( '/tv/$id', queryParameters: { ..._auth, 'append_to_response': 'images,credits', }, ); if (res.statusCode != 200) { throw Exception( 'TMDB getShow($id) failed: ${res.statusCode} ${res.data}'); } return Map.from(res.data); } Future> getSeason(int showId, int seasonNumber) async { final res = await _dio.get( '/tv/$showId/season/$seasonNumber', queryParameters: _auth, ); if (res.statusCode != 200) { throw Exception( 'TMDB getSeason($showId,S$seasonNumber) failed: ${res.statusCode} ${res.data}'); } return Map.from(res.data); } }