From aad081abaeb83a42b1652fee9f76a29a2a8a24b7 Mon Sep 17 00:00:00 2001 From: PartyDonut <42371342+PartyDonut@users.noreply.github.com> Date: Sat, 17 May 2025 14:50:09 +0200 Subject: [PATCH] fix: Update playback position when paused (#344) Co-authored-by: PartyDonut --- lib/providers/video_player_provider.dart | 44 +++++++++++++++++++----- lib/wrappers/media_control_wrapper.dart | 3 ++ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/lib/providers/video_player_provider.dart b/lib/providers/video_player_provider.dart index f5fd9c1..a077035 100644 --- a/lib/providers/video_player_provider.dart +++ b/lib/providers/video_player_provider.dart @@ -37,11 +37,11 @@ class VideoPlayerNotifier extends StateNotifier { } final subscription = state.stateStream?.listen((value) { - mediaState.update((state) => state.copyWith(buffering: value.buffering)); - mediaState.update((state) => state.copyWith(buffer: value.buffer)); + updateBuffering(value.buffering); + updateBuffer(value.buffer); updatePlaying(value.playing); updatePosition(value.position); - mediaState.update((state) => state.copyWith(duration: value.duration)); + updateDuration(value.duration); }); if (subscription != null) { @@ -49,32 +49,58 @@ class VideoPlayerNotifier extends StateNotifier { } } + Future updateBuffering(bool event) async => + mediaState.update((state) => state.buffering == event ? state : state.copyWith(buffering: event)); + + Future updateBuffer(Duration buffer) async { + mediaState.update( + (state) => (state.buffer - buffer).inSeconds.abs() < 1 + ? state + : state.copyWith( + buffer: buffer, + ), + ); + } + + Future updateDuration(Duration duration) async { + mediaState.update((state) { + return (state.duration - duration).inSeconds.abs() < 1 + ? state + : state.copyWith( + duration: duration, + ); + }); + } + Future updatePlaying(bool event) async { if (!state.hasPlayer) return; - mediaState.update((state) => state.copyWith(playing: event)); + mediaState.update( + (state) => state.playing == event ? state : state.copyWith(playing: event), + ); } Future updatePosition(Duration event) async { if (!state.hasPlayer) return; if (playbackState.playing == false) return; + final currentState = playbackState; + final currentPosition = currentState.position; + + if ((currentPosition - event).inSeconds.abs() < 1) return; final position = event; - final lastPosition = ref.read(mediaPlaybackProvider.select((value) => value.lastPosition)); + + final lastPosition = currentState.lastPosition; final diff = (position.inMilliseconds - lastPosition.inMilliseconds).abs(); if (diff > const Duration(seconds: 10).inMilliseconds) { mediaState.update((value) => value.copyWith( position: event, - playing: playbackState.playing, - duration: playbackState.duration, lastPosition: position, )); ref.read(playBackModel)?.updatePlaybackPosition(position, playbackState.playing, ref); } else { mediaState.update((value) => value.copyWith( position: event, - playing: playbackState.playing, - duration: playbackState.duration, )); } } diff --git a/lib/wrappers/media_control_wrapper.dart b/lib/wrappers/media_control_wrapper.dart index c480dd5..5ad95c6 100644 --- a/lib/wrappers/media_control_wrapper.dart +++ b/lib/wrappers/media_control_wrapper.dart @@ -296,6 +296,9 @@ class MediaControlsWrapper extends BaseAudioHandler { @override Future seek(Duration position) { _player?.seek(position); + if (_player?.lastState.playing == false) { + ref.read(mediaPlaybackProvider.notifier).update((state) => state.copyWith(position: position)); + } return super.seek(position); }