From 8c65e48bbe455e8f051133a4d26440810fadf61f Mon Sep 17 00:00:00 2001 From: R0m1k3 Date: Tue, 10 Mar 2026 16:48:28 +0100 Subject: [PATCH] feat: Implement Xtream IPTV API service, including data fetching, caching, and proxy integration. --- bin/api/proxy_handler.dart | 17 ++--------------- .../iptv/providers/settings_provider.dart | 12 ++++++------ lib/features/iptv/services/xtream_service.dart | 6 +++--- 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/bin/api/proxy_handler.dart b/bin/api/proxy_handler.dart index b03fb06..3f9439f 100644 --- a/bin/api/proxy_handler.dart +++ b/bin/api/proxy_handler.dart @@ -123,6 +123,7 @@ class ProxyHandler { 'User-Agent': 'VLC/3.0.18 LibVLC/3.0.18', 'Accept': '*/*', 'Accept-Encoding': 'identity', + 'Connection': 'close', // Forced close for better IPTV server compatibility }; // Forward Range header if present @@ -158,21 +159,7 @@ class ProxyHandler { } } - // Special case for API requests (JSON list of channels etc.) - // If it's not a Range request and looks like JSON, read it fully - final isJson = - response.headers['content-type']?.contains('json') == true; - final isRange = request.headers.containsKey('range'); - - if (isJson && !isRange) { - final bytes = await response.stream.toBytes(); - return Response( - response.statusCode, - body: bytes, - headers: responseHeaders, - ); - } - + // ALWAYS stream the response for maximum performance and to avoid memory issues with large JSONs return Response( response.statusCode, body: response.stream, diff --git a/lib/features/iptv/providers/settings_provider.dart b/lib/features/iptv/providers/settings_provider.dart index d23a2e2..edd64ff 100644 --- a/lib/features/iptv/providers/settings_provider.dart +++ b/lib/features/iptv/providers/settings_provider.dart @@ -19,9 +19,9 @@ enum BufferSize { /// Connection timeout presets enum ConnectionTimeout { - short, // 30 seconds - medium, // 60 seconds - long, // 120 seconds + short, // 60 seconds + medium, // 180 seconds + long, // 300 seconds } /// EPG cache duration presets @@ -205,11 +205,11 @@ class IptvSettings { int get timeoutSeconds { switch (connectionTimeout) { case ConnectionTimeout.short: - return 30; - case ConnectionTimeout.medium: return 60; + case ConnectionTimeout.medium: + return 180; case ConnectionTimeout.long: - return 120; + return 300; } } diff --git a/lib/features/iptv/services/xtream_service.dart b/lib/features/iptv/services/xtream_service.dart index 669f2dc..6ac75fb 100644 --- a/lib/features/iptv/services/xtream_service.dart +++ b/lib/features/iptv/services/xtream_service.dart @@ -18,9 +18,9 @@ class XtreamService { XtreamService() { _dio = Dio( BaseOptions( - connectTimeout: const Duration(seconds: 60), - receiveTimeout: const Duration(seconds: 60), - sendTimeout: const Duration(seconds: 60), + connectTimeout: const Duration(seconds: 300), + receiveTimeout: const Duration(seconds: 300), + sendTimeout: const Duration(seconds: 300), ), );