From 59bb26479eab09118e7743f85539617e2e439449 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Sun, 7 Dec 2025 23:02:48 +0100 Subject: [PATCH 1/2] feat: add IPTV series detail screen with season and episode listing. --- lib/features/iptv/screens/series_detail_screen.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/features/iptv/screens/series_detail_screen.dart b/lib/features/iptv/screens/series_detail_screen.dart index 8126d36..2a1aeb9 100644 --- a/lib/features/iptv/screens/series_detail_screen.dart +++ b/lib/features/iptv/screens/series_detail_screen.dart @@ -76,6 +76,10 @@ class _SeriesDetailScreenState extends ConsumerState { appBar: AppBar( title: Text(widget.series.name), backgroundColor: Colors.black87, + leading: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.white), + onPressed: () => Navigator.pop(context), + ), ), backgroundColor: Colors.grey.shade900, body: _isLoading From 643bf7e761b4eb3efe3800dc17ea2102d2cfdcda Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Sun, 7 Dec 2025 23:08:29 +0100 Subject: [PATCH 2/2] feat: Add new UI components for IPTV movies and series, including mobile-specific tabs with search and pagination, and a series detail screen. --- lib/features/iptv/widgets/movies_tab.dart | 2 +- lib/features/iptv/widgets/series_tab.dart | 2 +- .../screens/mobile_series_detail_screen.dart | 24 +++++++++++++++++++ .../iptv/widgets/mobile_movies_tab.dart | 2 +- .../iptv/widgets/mobile_series_tab.dart | 2 +- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/features/iptv/widgets/movies_tab.dart b/lib/features/iptv/widgets/movies_tab.dart index 94fd4b1..3eefb66 100644 --- a/lib/features/iptv/widgets/movies_tab.dart +++ b/lib/features/iptv/widgets/movies_tab.dart @@ -292,7 +292,7 @@ class _MoviesTabState extends ConsumerState { return MediaCard( title: movie.name, imageUrl: movie.streamIcon, - imageUrl: movie.streamIcon, + subtitle: movie.rating != null ? '${_formatRating(movie.rating)} ★' : null, rating: _formatRating(movie.rating), isWatched: isWatched, diff --git a/lib/features/iptv/widgets/series_tab.dart b/lib/features/iptv/widgets/series_tab.dart index 2504c9b..e91beab 100644 --- a/lib/features/iptv/widgets/series_tab.dart +++ b/lib/features/iptv/widgets/series_tab.dart @@ -282,7 +282,7 @@ class _SeriesTabState extends ConsumerState { return MediaCard( title: serie.name, imageUrl: serie.cover, - imageUrl: serie.cover, + subtitle: serie.rating != null ? '${_formatRating(serie.rating)} ★' : null, rating: _formatRating(serie.rating), placeholderIcon: Icons.tv, diff --git a/lib/mobile/features/iptv/screens/mobile_series_detail_screen.dart b/lib/mobile/features/iptv/screens/mobile_series_detail_screen.dart index 059fea0..3c234dc 100644 --- a/lib/mobile/features/iptv/screens/mobile_series_detail_screen.dart +++ b/lib/mobile/features/iptv/screens/mobile_series_detail_screen.dart @@ -24,6 +24,30 @@ class MobileSeriesDetailScreen extends ConsumerStatefulWidget { } class _MobileSeriesDetailScreenState extends ConsumerState { + SeriesInfo? _seriesInfo; + bool _isLoading = true; + String? _error; + int _selectedSeason = 1; + + @override + void initState() { + super.initState(); + _loadSeriesInfo(); + } + + String? _formatRating(String? rating) { + if (rating == null || rating.isEmpty) return null; + final value = double.tryParse(rating); + if (value != null) { + return value.toStringAsFixed(1); + } + return rating; + } + + Future _loadSeriesInfo() async { + try { + setState(() { + _isLoading = true; _error = null; }); diff --git a/lib/mobile/features/iptv/widgets/mobile_movies_tab.dart b/lib/mobile/features/iptv/widgets/mobile_movies_tab.dart index 76cefae..5cab4d8 100644 --- a/lib/mobile/features/iptv/widgets/mobile_movies_tab.dart +++ b/lib/mobile/features/iptv/widgets/mobile_movies_tab.dart @@ -252,7 +252,7 @@ class _MobileMoviesTabState extends ConsumerState { return MediaCard( title: movie.name, imageUrl: movie.streamIcon, - imageUrl: movie.streamIcon, + subtitle: movie.rating != null ? '${_formatRating(movie.rating)} ★' : null, rating: _formatRating(movie.rating), isWatched: isWatched, diff --git a/lib/mobile/features/iptv/widgets/mobile_series_tab.dart b/lib/mobile/features/iptv/widgets/mobile_series_tab.dart index 809dd07..9c91206 100644 --- a/lib/mobile/features/iptv/widgets/mobile_series_tab.dart +++ b/lib/mobile/features/iptv/widgets/mobile_series_tab.dart @@ -252,7 +252,7 @@ class _MobileSeriesTabState extends ConsumerState { return MediaCard( title: series.name, imageUrl: series.cover, - imageUrl: series.cover, + subtitle: series.rating != null ? '${_formatRating(series.rating)} ★' : null, rating: _formatRating(series.rating), placeholderIcon: Icons.tv,