diff --git a/build_log.txt b/build_log.txt index 1c0f614..8a9c5f9 100644 Binary files a/build_log.txt and b/build_log.txt differ diff --git a/lib/features/iptv/screens/player_screen.dart b/lib/features/iptv/screens/player_screen.dart index 1e46985..5c42948 100644 --- a/lib/features/iptv/screens/player_screen.dart +++ b/lib/features/iptv/screens/player_screen.dart @@ -7,8 +7,6 @@ import 'package:google_fonts/google_fonts.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import '../providers/xtream_provider.dart'; import '../providers/playback_positions_provider.dart'; -import '../providers/settings_provider.dart'; -import '../widgets/lite_player_view.dart'; // ... (existing imports) // ... (existing imports) @@ -17,7 +15,6 @@ import '../../../core/models/iptv_models.dart'; import '../../../core/widgets/tv_focusable_card.dart'; import '../../../core/widgets/glass_container.dart'; import '../../../core/theme/app_colors.dart'; -import '../models/xtream_models.dart'; import '../widgets/epg_overlay.dart'; enum StreamType { live, vod, series } diff --git a/lib/features/iptv/widgets/live_tv_tab.dart b/lib/features/iptv/widgets/live_tv_tab.dart index 0d3874b..365e858 100644 --- a/lib/features/iptv/widgets/live_tv_tab.dart +++ b/lib/features/iptv/widgets/live_tv_tab.dart @@ -8,13 +8,10 @@ import '../screens/player_screen.dart'; import '../../../core/models/iptv_models.dart'; import '../../../core/models/playlist_config.dart'; import '../../../core/theme/app_colors.dart'; -import '../../../core/theme/app_theme.dart'; import '../../../core/utils/responsive_layout.dart'; -import '../../../core/widgets/components/ui_components.dart'; import '../../../core/widgets/themed_loading_screen.dart'; import '../../../core/widgets/glass_container.dart'; import '../../../core/widgets/tv_focusable_card.dart'; -import 'channel_card.dart'; class LiveTVTab extends ConsumerStatefulWidget { final PlaylistConfig playlist; diff --git a/lib/features/iptv/widgets/movies_tab.dart b/lib/features/iptv/widgets/movies_tab.dart index 800337f..213225c 100644 --- a/lib/features/iptv/widgets/movies_tab.dart +++ b/lib/features/iptv/widgets/movies_tab.dart @@ -4,10 +4,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:google_fonts/google_fonts.dart'; import '../../../core/models/playlist_config.dart'; import '../../../core/theme/app_colors.dart'; -import '../../../core/theme/app_theme.dart'; import '../../../core/utils/responsive_layout.dart'; import '../../../core/widgets/components/hero_carousel.dart'; -import '../../../core/widgets/themed_loading_screen.dart'; import '../../../core/widgets/glass_container.dart'; import '../../../core/widgets/tv_focusable_card.dart'; import '../providers/watch_history_provider.dart'; diff --git a/lib/features/iptv/widgets/series_tab.dart b/lib/features/iptv/widgets/series_tab.dart index 975d7f5..c357746 100644 --- a/lib/features/iptv/widgets/series_tab.dart +++ b/lib/features/iptv/widgets/series_tab.dart @@ -399,7 +399,9 @@ class _SeriesTabState extends ConsumerState { fontWeight: FontWeight.w600, shadows: [ const Shadow( - color: Colors.black, blurRadius: 4), + color: Colors.black, + blurRadius: 4, + ), ], ), maxLines: 2, diff --git a/lib/mobile/features/iptv/widgets/mobile_series_tab.dart b/lib/mobile/features/iptv/widgets/mobile_series_tab.dart index 7693389..c00b015 100644 --- a/lib/mobile/features/iptv/widgets/mobile_series_tab.dart +++ b/lib/mobile/features/iptv/widgets/mobile_series_tab.dart @@ -198,7 +198,9 @@ class _MobileSeriesTabState extends ConsumerState { child: TextField( controller: _searchController, style: GoogleFonts.inter( - fontSize: 14, color: Colors.white), + fontSize: 14, + color: Colors.white, + ), decoration: InputDecoration( hintText: 'Search Series...', hintStyle: GoogleFonts.inter(color: Colors.white54), @@ -211,18 +213,24 @@ class _MobileSeriesTabState extends ConsumerState { ), if (_isSearching) const SizedBox( - width: 12, - height: 12, - child: CircularProgressIndicator( - strokeWidth: 2, color: Colors.white)), + width: 12, + height: 12, + child: CircularProgressIndicator( + strokeWidth: 2, + color: Colors.white, + ), + ), if (_searchQuery.isNotEmpty) GestureDetector( onTap: () { _searchController.clear(); _onSearchChanged(''); }, - child: const Icon(Icons.close, - size: 16, color: Colors.white), + child: const Icon( + Icons.close, + size: 16, + color: Colors.white, + ), ), ], ), @@ -242,7 +250,8 @@ class _MobileSeriesTabState extends ConsumerState { onTap: (item) { try { final series = _series.firstWhere( - (s) => s.seriesId.toString() == item.id); + (s) => s.seriesId.toString() == item.id, + ); _openSeries(series); } catch (e) { // Fallback @@ -286,8 +295,11 @@ class _MobileSeriesTabState extends ConsumerState { ) : Container( color: Colors.white10, - child: const Icon(Icons.tv, - color: Colors.white24)), + child: const Icon( + Icons.tv, + color: Colors.white24, + ), + ), ), // Gradient Overlay @@ -303,11 +315,12 @@ class _MobileSeriesTabState extends ConsumerState { end: Alignment.bottomCenter, colors: [ Colors.transparent, - Colors.black.withOpacity(0.9) + Colors.black.withOpacity(0.9), ], ), borderRadius: const BorderRadius.vertical( - bottom: Radius.circular(16)), + bottom: Radius.circular(16), + ), ), ), ), @@ -320,9 +333,10 @@ class _MobileSeriesTabState extends ConsumerState { child: Text( series.name, style: GoogleFonts.inter( - color: Colors.white, - fontSize: 13, - fontWeight: FontWeight.w600), + color: Colors.white, + fontSize: 13, + fontWeight: FontWeight.w600, + ), maxLines: 2, overflow: TextOverflow.ellipsis, ), @@ -337,19 +351,25 @@ class _MobileSeriesTabState extends ConsumerState { borderRadius: 4, opacity: 0.6, padding: const EdgeInsets.symmetric( - horizontal: 6, vertical: 2), + horizontal: 6, + vertical: 2, + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.star, - size: 10, color: Colors.amber), + const Icon( + Icons.star, + size: 10, + color: Colors.amber, + ), const SizedBox(width: 4), Text( _formatRating(series.rating)!, style: GoogleFonts.inter( - fontSize: 10, - fontWeight: FontWeight.bold, - color: Colors.white), + fontSize: 10, + fontWeight: FontWeight.bold, + color: Colors.white, + ), ), ], ), @@ -369,7 +389,8 @@ class _MobileSeriesTabState extends ConsumerState { child: Padding( padding: EdgeInsets.all(24), child: Center( - child: CircularProgressIndicator(color: Colors.white)), + child: CircularProgressIndicator(color: Colors.white), + ), ), ), ], diff --git a/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart b/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart index 6000015..ab23a43 100644 --- a/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart +++ b/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart @@ -91,7 +91,9 @@ class _MobileSettingsTabState extends ConsumerState { child: Text( currentUser?.username.substring(0, 1).toUpperCase() ?? 'U', style: const TextStyle( - fontWeight: FontWeight.bold, color: AppColors.primary), + fontWeight: FontWeight.bold, + color: AppColors.primary, + ), ), ), const SizedBox(width: 16), @@ -111,16 +113,21 @@ class _MobileSettingsTabState extends ConsumerState { Container( margin: const EdgeInsets.only(top: 4), padding: const EdgeInsets.symmetric( - horizontal: 8, vertical: 2), + horizontal: 8, + vertical: 2, + ), decoration: BoxDecoration( color: AppColors.primary.withOpacity(0.2), borderRadius: BorderRadius.circular(4), ), - child: const Text('ADMIN', - style: TextStyle( - fontSize: 10, - color: AppColors.primary, - fontWeight: FontWeight.bold)), + child: const Text( + 'ADMIN', + style: TextStyle( + fontSize: 10, + color: AppColors.primary, + fontWeight: FontWeight.bold, + ), + ), ), ], ), @@ -140,18 +147,24 @@ class _MobileSettingsTabState extends ConsumerState { child: Column( children: [ SwitchListTile( - title: const Text('Dark Mode', - style: TextStyle(color: AppColors.textPrimary)), - secondary: Icon(isDark ? Icons.dark_mode : Icons.light_mode, - color: AppColors.primary), + title: const Text( + 'Dark Mode', + style: TextStyle(color: AppColors.textPrimary), + ), + secondary: Icon( + isDark ? Icons.dark_mode : Icons.light_mode, + color: AppColors.primary, + ), value: isDark, onChanged: (_) => themeNotifier.toggleTheme(), activeThumbColor: AppColors.primary, ), const Divider(height: 1), SwitchListTile( - title: const Text('Show Clock', - style: TextStyle(color: AppColors.textPrimary)), + title: const Text( + 'Show Clock', + style: TextStyle(color: AppColors.textPrimary), + ), secondary: const Icon(Icons.access_time, color: AppColors.primary), value: settings.showClock, @@ -181,10 +194,11 @@ class _MobileSettingsTabState extends ConsumerState { items: StreamQuality.values, labelBuilder: (v) => v.name.toUpperCase(), onChanged: (v) { - if (v != null) + if (v != null) { ref .read(iptvSettingsProvider.notifier) .setStreamQuality(v); + } }, ), const Divider(height: 1), @@ -195,8 +209,9 @@ class _MobileSettingsTabState extends ConsumerState { items: BufferSize.values, labelBuilder: (v) => v.name.toUpperCase(), onChanged: (v) { - if (v != null) + if (v != null) { ref.read(iptvSettingsProvider.notifier).setBufferSize(v); + } }, ), const Divider(height: 1), @@ -208,10 +223,11 @@ class _MobileSettingsTabState extends ConsumerState { labelBuilder: (v) => '${v.name.toUpperCase()} (${ref.read(iptvSettingsProvider).timeoutSeconds}s)', onChanged: (v) { - if (v != null) + if (v != null) { ref .read(iptvSettingsProvider.notifier) .setConnectionTimeout(v); + } }, ), const Divider(height: 1), @@ -231,16 +247,19 @@ class _MobileSettingsTabState extends ConsumerState { } }, onChanged: (v) { - if (v != null) + if (v != null) { ref .read(iptvSettingsProvider.notifier) .setTranscodingMode(v); + } }, ), const Divider(height: 1), SwitchListTile( - title: const Text('Auto Reconnect', - style: TextStyle(color: AppColors.textPrimary)), + title: const Text( + 'Auto Reconnect', + style: TextStyle(color: AppColors.textPrimary), + ), secondary: const Icon(Icons.refresh, color: AppColors.primary), value: settings.autoReconnect, @@ -373,9 +392,13 @@ class _FilterInput extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(label, - style: const TextStyle( - fontSize: 12, color: AppColors.textSecondary)), + Text( + label, + style: const TextStyle( + fontSize: 12, + color: AppColors.textSecondary, + ), + ), TextField( controller: controller, style: @@ -476,8 +499,10 @@ class _DropdownSetting extends StatelessWidget { value: value, underline: const SizedBox(), dropdownColor: AppColors.surfaceVariant, - icon: const Icon(Icons.arrow_drop_down, - color: AppColors.textSecondary), + icon: const Icon( + Icons.arrow_drop_down, + color: AppColors.textSecondary, + ), style: const TextStyle(color: AppColors.textPrimary), items: items.map((item) { return DropdownMenuItem( diff --git a/lib/mobile/widgets/mobile_scaffold.dart b/lib/mobile/widgets/mobile_scaffold.dart index bfa8c28..73b621f 100644 --- a/lib/mobile/widgets/mobile_scaffold.dart +++ b/lib/mobile/widgets/mobile_scaffold.dart @@ -48,8 +48,11 @@ class MobileScaffold extends ConsumerWidget { decoration: BoxDecoration( color: const Color(0xFF1C1C1E).withOpacity(0.85), border: Border( - top: BorderSide( - color: Colors.white.withOpacity(0.1), width: 0.5)), + top: BorderSide( + color: Colors.white.withOpacity(0.1), + width: 0.5, + ), + ), ), child: BottomNavigationBar( currentIndex: currentIndex, diff --git a/pubspec.yaml b/pubspec.yaml index c39c149..e0ba01f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,7 +47,7 @@ dependencies: intl: ^0.19.0 equatable: ^2.0.5 shared_preferences: ^2.3.2 - video_player_win: ^3.2.2 +