From 05bc0cde74f618e4fea54aaeb5137dbdacacb84e Mon Sep 17 00:00:00 2001 From: rang <378694192@qq.com> Date: Fri, 24 Oct 2025 13:46:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AB=A0=E8=8A=82=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=BB=9A=E5=8A=A8=20=E5=9C=A8windows=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../player/core/audiobook_player.dart | 29 +++++++++++++++---- .../player/view/audiobook_player.dart | 4 +-- .../player/view/player_when_expanded.dart | 1 + .../widgets/audiobook_player_seek_button.dart | 4 +-- .../audiobook_player_seek_chapter_button.dart | 2 +- .../widgets/chapter_selection_button.dart | 2 +- .../skip_start_end/skip_start_end.dart | 2 +- 7 files changed, 32 insertions(+), 12 deletions(-) diff --git a/lib/features/player/core/audiobook_player.dart b/lib/features/player/core/audiobook_player.dart index 680bb4d..56f21da 100644 --- a/lib/features/player/core/audiobook_player.dart +++ b/lib/features/player/core/audiobook_player.dart @@ -174,12 +174,31 @@ class AudiobookPlayer extends AudioPlayer { }; } + // @override + // Future seek(Duration? positionInBook, {int? index, bool b = true}) async { + // if (!b) { + // return super.seek(positionInBook, index: index); + // } + // if (_book == null) { + // _logger.warning('No book is set, not seeking'); + // return; + // } + // if (positionInBook == null) { + // _logger.warning('Position given is null, not seeking'); + // return; + // } + // final tracks = _book!.tracks; + // final trackToPlay = getTrackToPlay(_book!, positionInBook); + // final i = tracks.indexOf(trackToPlay); + // final positionInTrack = positionInBook - trackToPlay.startOffset; + // return super.seek(positionInTrack, index: i); + // } + /// need to override getDuration and getCurrentPosition to return according to the book instead of the current track /// this is because the book can be a list of audio files and the player is only aware of the current track /// so we need to calculate the duration and current position based on the book - @override - Future seek(Duration? positionInBook, {int? index, bool b = true}) async { + Future seekInBook(Duration? positionInBook, {int? index, bool b = true}) async { if (!b) { return super.seek(positionInBook, index: index); } @@ -208,11 +227,11 @@ class AudiobookPlayer extends AudioPlayer { void seekForward() { final index = _book!.chapters.indexOf(currentChapter!); if (index < _book!.chapters.length - 1) { - seek( + super.seek( _book!.chapters[index + 1].start + offset, ); } else { - seek(currentChapter!.end); + super.seek(currentChapter!.end); } } @@ -227,7 +246,7 @@ class AudiobookPlayer extends AudioPlayer { } else { chapterToSeekTo = currentChapter!; } - seek( + super.seek( chapterToSeekTo.start + offset, ); } diff --git a/lib/features/player/view/audiobook_player.dart b/lib/features/player/view/audiobook_player.dart index 8afeca3..e260f28 100644 --- a/lib/features/player/view/audiobook_player.dart +++ b/lib/features/player/view/audiobook_player.dart @@ -165,7 +165,7 @@ class AudiobookPlayerPlayPauseButton extends HookConsumerWidget { ), ProcessingState.completed => IconButton( onPressed: () async { - await player.seek(const Duration(seconds: 0)); + await player.seekInBook(const Duration(seconds: 0)); await player.play(); }, icon: const Icon( @@ -220,7 +220,7 @@ class AudiobookChapterProgressBar extends HookConsumerWidget { : currentChapter.end - currentChapter.start, // ! TODO add onSeek onSeek: (duration) { - player.seek( + player.seekInBook( duration + (currentChapter?.start ?? const Duration(seconds: 0)), ); }, diff --git a/lib/features/player/view/player_when_expanded.dart b/lib/features/player/view/player_when_expanded.dart index eeeb190..e157e3b 100644 --- a/lib/features/player/view/player_when_expanded.dart +++ b/lib/features/player/view/player_when_expanded.dart @@ -201,6 +201,7 @@ class PlayerWhenExpanded extends HookConsumerWidget { // the chapter skip buttons, seek 30 seconds back and forward, and play/pause button Expanded( + flex: 2, child: Opacity( opacity: earlyPercentage, child: SizedBox( diff --git a/lib/features/player/view/widgets/audiobook_player_seek_button.dart b/lib/features/player/view/widgets/audiobook_player_seek_button.dart index ac1ec20..4781113 100644 --- a/lib/features/player/view/widgets/audiobook_player_seek_button.dart +++ b/lib/features/player/view/widgets/audiobook_player_seek_button.dart @@ -22,9 +22,9 @@ class AudiobookPlayerSeekButton extends HookConsumerWidget { ), onPressed: () { if (isForward) { - player.seek(player.positionInBook + const Duration(seconds: 30)); + player.seek(player.position + const Duration(seconds: 30)); } else { - player.seek(player.positionInBook - const Duration(seconds: 30)); + player.seek(player.position - const Duration(seconds: 30)); } }, ); diff --git a/lib/features/player/view/widgets/audiobook_player_seek_chapter_button.dart b/lib/features/player/view/widgets/audiobook_player_seek_chapter_button.dart index aead305..39ef472 100644 --- a/lib/features/player/view/widgets/audiobook_player_seek_chapter_button.dart +++ b/lib/features/player/view/widgets/audiobook_player_seek_chapter_button.dart @@ -65,7 +65,7 @@ class AudiobookPlayerSeekChapterButton extends HookConsumerWidget { } // if chapter does not exist, go to the start or end of the book if (player.currentChapter == null) { - player.seek(isForward ? player.book!.duration : Duration.zero); + player.seekInBook(isForward ? player.book!.duration : Duration.zero); return; } if (isForward) { diff --git a/lib/features/player/view/widgets/chapter_selection_button.dart b/lib/features/player/view/widgets/chapter_selection_button.dart index cc31e35..a7dd4bc 100644 --- a/lib/features/player/view/widgets/chapter_selection_button.dart +++ b/lib/features/player/view/widgets/chapter_selection_button.dart @@ -112,7 +112,7 @@ class ChapterSelectionModal extends HookConsumerWidget { key: isCurrent ? chapterKey : null, onTap: () { Navigator.of(context).pop(); - notifier.seek(chapter.start + 90.ms); + notifier.seekInBook(chapter.start + 90.ms); notifier.play(); }, ); diff --git a/lib/features/skip_start_end/skip_start_end.dart b/lib/features/skip_start_end/skip_start_end.dart index e6a5d9b..e109357 100644 --- a/lib/features/skip_start_end/skip_start_end.dart +++ b/lib/features/skip_start_end/skip_start_end.dart @@ -19,7 +19,7 @@ class SkipStartEnd { if (_index != index && player.position.inMilliseconds < 500) { _index = index!; Future.microtask(() { - player.seek(start, b: false); + player.seek(start); }); } }),