From 62fc19598a22fcc96f69225ca629dc56d72cdd58 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Mon, 8 Dec 2025 21:27:06 +0100 Subject: [PATCH] feat: Implement new video player screen with controls for live, VOD, and series streams, integrating with an external player via iframe messaging. --- lib/features/iptv/screens/player_screen.dart | 88 +++++++++++-------- verify_vod_fix_log.txt | Bin 0 -> 81790 bytes verify_vod_log.txt | Bin 0 -> 92182 bytes 3 files changed, 50 insertions(+), 38 deletions(-) create mode 100644 verify_vod_fix_log.txt create mode 100644 verify_vod_log.txt diff --git a/lib/features/iptv/screens/player_screen.dart b/lib/features/iptv/screens/player_screen.dart index f71ef28..75f3d18 100644 --- a/lib/features/iptv/screens/player_screen.dart +++ b/lib/features/iptv/screens/player_screen.dart @@ -353,47 +353,59 @@ class _PlayerScreenState extends ConsumerState { } else { // For VOD and Series - // FORCE API STREAMING (FFMPEG) - // We always use the backend /api/stream endpoint because it handles audio transcoding (to AAC) - // which is required for browsers to play content with AC3/DTS audio. - // For 'High' quality, the backend uses '-c:v copy', so video quality is preserved (Direct Stream). - setState(() { - _statusMessage = 'Preparing stream...'; - }); + // For VOD and Series - final baseUrl = html.window.location.origin; - final vodStreamUrl = widget.streamType == StreamType.vod - ? xtreamService.getVodStreamUrl(currentStreamId, widget.containerExtension) - : xtreamService.getSeriesStreamUrl(currentStreamId, widget.containerExtension); - - final encodedUrl = Uri.encodeComponent(vodStreamUrl); - - // Read settings for VOD quality + // Determine play mode: Direct (Proxy) vs Transcode (FFmpeg) + // Default to Direct/Proxy because it preserves duration metadata and seeking capability (via Range headers) + // Only use Transcode if explicitly FORCED (e.g. for audio compatibility issues like AC3/DTS on some browsers) final settings = ref.read(iptvSettingsProvider); - - // Map quality enum to string (using if-else to avoid switch exhaustivity issues) - String qualityParam = 'medium'; - if (settings.streamQuality == StreamQuality.low) { - qualityParam = 'low'; - } else if (settings.streamQuality == StreamQuality.high) { - qualityParam = 'high'; + final baseUrl = html.window.location.origin; + bool useTranscode = settings.transcodingMode == TranscodingMode.forced; + + setState(() { + _statusMessage = useTranscode ? 'Preparing stream...' : 'Loading video...'; + }); + + if (useTranscode) { + // Transcoding Mode (FFmpeg pipe) + final encodedUrl = Uri.encodeComponent( + widget.streamType == StreamType.vod + ? xtreamService.getVodStreamUrl(currentStreamId, widget.containerExtension) + : xtreamService.getSeriesStreamUrl(currentStreamId, widget.containerExtension) + ); + + String qualityParam = 'medium'; + if (settings.streamQuality == StreamQuality.low) qualityParam = 'low'; + else if (settings.streamQuality == StreamQuality.high) qualityParam = 'high'; + + // Calculate start time for seeking support + double startSeconds = startTimeOverride ?? 0; + if (startTimeOverride == null && _contentId.isNotEmpty) { + final positions = ref.read(playbackPositionsProvider); + final saved = positions.getPosition(_contentId); + if (saved > 0) startSeconds = saved; + } + + // We force extension to .ts for mpegts.js compatibility + hlsUrl = '$baseUrl/api/stream/$currentStreamId?url=$encodedUrl&quality=$qualityParam&start=${startSeconds.round()}&ext=.ts'; + debugPrint('PlayerScreen: Streaming VOD (Transcoded): $hlsUrl'); + + } else { + // Direct/Proxy Mode (Preserves Duration) + final rawUrl = widget.streamType == StreamType.vod + ? '${widget.playlist.dns}/movie/${widget.playlist.username}/${widget.playlist.password}/$currentStreamId.${widget.containerExtension}' + : '${widget.playlist.dns}/series/${widget.playlist.username}/${widget.playlist.password}/$currentStreamId.${widget.containerExtension}'; + + // Force use of local proxy /api/xtream/ to handle CORS and Range headers correctly + final proxyPath = '/api/xtream/$rawUrl'; + hlsUrl = '$baseUrl$proxyPath'; + + // Append start time for direct play? + // HTML5 video handles seeking naturally via headers, but if we want to resume: + // We have to seek AFTER metadata is loaded via JS (_seekTo called in onMessage logic). + + debugPrint('PlayerScreen: Streaming VOD (Direct Proxy): $hlsUrl'); } - - // Calculate start time for seeking support - // If override provided (seeking), use it. Else check provider resume. - double startSeconds = startTimeOverride ?? 0; - if (startTimeOverride == null && _contentId.isNotEmpty) { - final positions = ref.read(playbackPositionsProvider); - final saved = positions.getPosition(_contentId); - if (saved > 0) startSeconds = saved; - } - - // Construct URL with start param - // Note: We force extension to .ts for mpegts.js compatibility - final streamEndpoint = '$baseUrl/api/stream/$currentStreamId?url=$encodedUrl&quality=$qualityParam&start=${startSeconds.round()}&ext=.ts'; - - debugPrint('PlayerScreen: Streaming VOD (Audio Fix enabled): $streamEndpoint'); - hlsUrl = streamEndpoint; } setState(() { diff --git a/verify_vod_fix_log.txt b/verify_vod_fix_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..05696033385b923cada632e97307e9b230a405c1 GIT binary patch literal 81790 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 literal 0 HcmV?d00001 diff --git a/verify_vod_log.txt b/verify_vod_log.txt new file mode 100644 index 0000000000000000000000000000000000000000..ccf37fb5dd54a747eafdac3099a808417ac0a7ca GIT binary patch literal 92182 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