From f5407ecac8643c01ddf98d0e9db3f7ec73ac3973 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:38:16 +0200 Subject: [PATCH] fix: enable PiP and crop/fill for live TV --- lib/screens/video_player_screen.dart | 44 ++++++++++++++++------------ 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/lib/screens/video_player_screen.dart b/lib/screens/video_player_screen.dart index 3ab22803..643810dc 100644 --- a/lib/screens/video_player_screen.dart +++ b/lib/screens/video_player_screen.dart @@ -1091,6 +1091,8 @@ class VideoPlayerScreenState extends State with WidgetsBindin _trackManager?.cacheExternalSubtitles(const []); + await _initVideoFilterAndPip(); + if (mounted) { setState(() { _availableVersions = []; @@ -1225,26 +1227,9 @@ class VideoPlayerScreenState extends State with WidgetsBindin }); } - // Initialize video PIP and filter manager with player and available versions + await _initVideoFilterAndPip(); + if (player != null) { - final settings = await SettingsService.getInstance(); - _videoFilterManager = VideoFilterManager( - player: player!, - availableVersions: _availableVersions, - selectedMediaIndex: widget.selectedMediaIndex, - initialBoxFitMode: settings.getDefaultBoxFitMode(), - onBoxFitModeChanged: (mode) => settings.setDefaultBoxFitMode(mode), - ); - // Update video filter once dimensions are available - _videoFilterManager!.updateVideoFilter(); - - // PIP Manager - _videoPIPManager = VideoPIPManager(player: player!); - _videoPIPManager!.onBeforeEnterPip = () { - _videoFilterManager?.enterPipMode(); - }; - _videoPIPManager!.isPipActive.addListener(_onPipStateChanged); - // Auto-PiP: set up callback for API 26-30 path and initial state if (_autoPipEnabled) { PipService.onAutoPipEntering = () { @@ -1398,6 +1383,27 @@ class VideoPlayerScreenState extends State with WidgetsBindin ); } + /// Initialize VideoFilterManager and VideoPIPManager if not already set up. + /// Called from both live TV and VOD playback paths. + Future _initVideoFilterAndPip() async { + if (player == null || _videoFilterManager != null) return; + final settings = await SettingsService.getInstance(); + _videoFilterManager = VideoFilterManager( + player: player!, + availableVersions: _availableVersions, + selectedMediaIndex: widget.selectedMediaIndex, + initialBoxFitMode: settings.getDefaultBoxFitMode(), + onBoxFitModeChanged: (mode) => settings.setDefaultBoxFitMode(mode), + ); + _videoFilterManager!.updateVideoFilter(); + + _videoPIPManager = VideoPIPManager(player: player!); + _videoPIPManager!.onBeforeEnterPip = () { + _videoFilterManager?.enterPipMode(); + }; + _videoPIPManager!.isPipActive.addListener(_onPipStateChanged); + } + Future _togglePIPMode() async { final result = await _videoPIPManager?.togglePIP(); if (result != null && !result.$1 && mounted) {