@@ -94,11 +94,19 @@ class LibMPV extends BasePlayer {
9494 }
9595
9696 @override
97- Future <void > loadVideo (String url, bool play) async {
97+ Future <void > loadVideo (String url, bool play, { Duration startPosition = Duration .zero} ) async {
9898 _loadCompleter = Completer <void >();
99- await _player? .open (mpv.Media (url), play: play);
10099 _firstLoadAttempt = DateTime .now ();
101100
101+ if (_player? .platform is mpv.NativePlayer ) {
102+ await (_player? .platform as dynamic ).setProperty (
103+ 'start' ,
104+ '${startPosition .inMilliseconds / 1000 }' ,
105+ );
106+ }
107+
108+ await _player? .open (mpv.Media (url), play: play);
109+
102110 _retryTimer? .cancel ();
103111 _retryTimer = null ;
104112
@@ -111,21 +119,46 @@ class LibMPV extends BasePlayer {
111119 _retryTimer? .cancel ();
112120 _retryTimer = null ;
113121 } else {
114- if (lastState.buffering == false ) {
115- _finishedLoading ();
116- } else {
117- log ( "Retrying to load video $ url " );
118- _player ? . open (mpv. Media (url), play : play);
119- _retryTimer ? . reset ( );
122+ log ( "Retrying to load video $ url " );
123+ if (_player ? .platform is mpv. NativePlayer ) {
124+ await (_player ? .platform as dynamic ). setProperty (
125+ 'start' ,
126+ '${ startPosition . inMilliseconds / 1000 }' ,
127+ );
120128 }
129+ await _player? .open (mpv.Media (url), play: play);
130+ _retryTimer? .reset ();
121131 }
122132 },
123133 );
134+
135+ // Wait for the player to be ready
136+ if (_loadCompleter? .isCompleted == false ) {
137+ StreamSubscription ? subBuffering;
138+ StreamSubscription ? subDuration;
139+
140+ void onReady () {
141+ if (_loadCompleter? .isCompleted == true ) return ;
142+ _finishedLoading ();
143+ subBuffering? .cancel ();
144+ subDuration? .cancel ();
145+ }
146+
147+ subBuffering = _player? .stream.buffering.listen ((event) {
148+ if (event == false && (_player? .state.duration ?? Duration .zero) > Duration .zero) {
149+ onReady ();
150+ }
151+ });
152+ subDuration = _player? .stream.duration.listen ((event) {
153+ if (event > Duration .zero) onReady ();
154+ });
155+ }
156+
124157 _loadCompleter? .future.then (
125158 (value) async {
126- await Future . delayed ( const Duration (milliseconds : 150 ));
127- if (play && ! lastState.playing ) {
128- await _player? .play ( );
159+ // Backup seek in case property didn't work
160+ if (startPosition != Duration .zero && (_player ? .state.position.inSeconds ?? 0 ) < startPosition.inSeconds - 5 ) {
161+ await _player? .seek (startPosition );
129162 }
130163 },
131164 );
0 commit comments