This commit is contained in:
rang 2025-12-12 15:38:47 +08:00
parent 36f14dbd58
commit 5abf938dcf
26 changed files with 104 additions and 70 deletions

View file

@ -467,8 +467,8 @@ class _LibraryItemPlayButton extends HookConsumerWidget {
return ElevatedButton.icon( return ElevatedButton.icon(
onPressed: () { onPressed: () {
currentBook?.libraryItemId == book.libraryItemId currentBook?.libraryItemId == book.libraryItemId
? ref.read(audioPlayerProvider).playOrPause() ? ref.read(absPlayerProvider).playOrPause()
: ref.read(audioPlayerProvider.notifier).load( : ref.read(absPlayerProvider.notifier).load(
book, book,
initialPosition: userMediaProgress?.currentTime, initialPosition: userMediaProgress?.currentTime,
); );

View file

@ -139,7 +139,7 @@ class _LibraryItemProgressIndicator extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final player = ref.watch(audioPlayerProvider); final player = ref.watch(absPlayerProvider);
final libraryItem = ref.watch(libraryItemProvider(id)).valueOrNull; final libraryItem = ref.watch(libraryItemProvider(id)).valueOrNull;
if (libraryItem == null) { if (libraryItem == null) {
return const SizedBox.shrink(); return const SizedBox.shrink();

View file

@ -13,7 +13,7 @@ class PlaybackReporter extends _$PlaybackReporter {
@override @override
Future<core.PlaybackReporter> build() async { Future<core.PlaybackReporter> build() async {
final playerSettings = ref.watch(appSettingsProvider).playerSettings; final playerSettings = ref.watch(appSettingsProvider).playerSettings;
final player = ref.watch(audioPlayerProvider); final player = ref.watch(absPlayerProvider);
final api = ref.watch(authenticatedApiProvider); final api = ref.watch(authenticatedApiProvider);
final reporter = core.PlaybackReporter( final reporter = core.PlaybackReporter(

View file

@ -6,7 +6,7 @@ part of 'playback_reporter_provider.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$playbackReporterHash() => r'1cdf5cbc614c05c240d28bf0ec740d3899fd957a'; String _$playbackReporterHash() => r'0a3d3a7b10a020c9ee4b6465663e83b8f75b36c5';
/// See also [PlaybackReporter]. /// See also [PlaybackReporter].
@ProviderFor(PlaybackReporter) @ProviderFor(PlaybackReporter)

View file

@ -1,4 +1,3 @@
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'dart:async'; import 'dart:async';
import 'package:audio_service/audio_service.dart'; import 'package:audio_service/audio_service.dart';
@ -32,6 +31,7 @@ abstract class AbsAudioPlayer {
Stream<MediaItem?> get mediaItemStream => _mediaItemController.stream; Stream<MediaItem?> get mediaItemStream => _mediaItemController.stream;
Stream<AbsPlayerState> get playerStateStream => playerStateSubject.stream; Stream<AbsPlayerState> get playerStateStream => playerStateSubject.stream;
//
Future<void> load( Future<void> load(
BookExpanded book, { BookExpanded book, {
required Uri baseUrl, required Uri baseUrl,

View file

@ -8,8 +8,9 @@ final _logger = Logger('AbsPlatformAudioPlayer');
/// ios,macos,android (just_audio) /// ios,macos,android (just_audio)
class AbsPlatformAudioPlayer extends AbsAudioPlayer { class AbsPlatformAudioPlayer extends AbsAudioPlayer {
late final AudioPlayer player; late final AudioPlayer _player;
AbsPlatformAudioPlayer() { AbsPlatformAudioPlayer(AudioPlayer player) {
_player = player;
// //
// prefetch-playlist=yes // prefetch-playlist=yes
JustAudioMediaKit.prefetchPlaylist = true; JustAudioMediaKit.prefetchPlaylist = true;
@ -48,41 +49,41 @@ class AbsPlatformAudioPlayer extends AbsAudioPlayer {
}); });
} }
@override @override
Duration get bufferedPosition => player.bufferedPosition; Duration get bufferedPosition => _player.bufferedPosition;
@override @override
Stream<Duration> get bufferedPositionStream => player.bufferedPositionStream; Stream<Duration> get bufferedPositionStream => _player.bufferedPositionStream;
@override @override
int get currentIndex => player.currentIndex ?? 0; int get currentIndex => _player.currentIndex ?? 0;
@override @override
Future<void> pause() async { Future<void> pause() async {
await player.pause(); await _player.pause();
} }
@override @override
Future<void> play() async { Future<void> play() async {
await player.play(); await _player.play();
} }
@override @override
Future<void> playOrPause() async { Future<void> playOrPause() async {
player.playing ? await player.pause() : await player.play(); _player.playing ? await _player.pause() : await _player.play();
} }
@override @override
Stream<bool> get playingStream => player.playingStream; Stream<bool> get playingStream => _player.playingStream;
@override @override
Duration get position => player.position; Duration get position => _player.position;
@override @override
Stream<Duration> get positionStream => player.positionStream; Stream<Duration> get positionStream => _player.positionStream;
@override @override
Future<void> seek(Duration position, {int? index}) async { Future<void> seek(Duration position, {int? index}) async {
await player.seek(position, index: index); await _player.seek(position, index: index);
} }
@override @override
@ -93,7 +94,7 @@ class AbsPlatformAudioPlayer extends AbsAudioPlayer {
}) async { }) async {
List<AudioSource> audioSources = List<AudioSource> audioSources =
playlist.map((uri) => AudioSource.uri(uri)).toList(); playlist.map((uri) => AudioSource.uri(uri)).toList();
await player await _player
.setAudioSources( .setAudioSources(
audioSources, audioSources,
preload: true, preload: true,
@ -108,20 +109,20 @@ class AbsPlatformAudioPlayer extends AbsAudioPlayer {
@override @override
Future<void> setSpeed(double speed) async { Future<void> setSpeed(double speed) async {
await player.setSpeed(speed); await _player.setSpeed(speed);
} }
@override @override
Future<void> setVolume(double volume) async { Future<void> setVolume(double volume) async {
await player.setVolume(volume); await _player.setVolume(volume);
} }
@override @override
double get speed => player.speed; double get speed => _player.speed;
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
player.dispose(); _player.dispose();
} }
} }

View file

@ -1,6 +1,8 @@
import 'package:audio_service/audio_service.dart'; import 'package:audio_service/audio_service.dart';
import 'package:audio_session/audio_session.dart'; import 'package:audio_session/audio_session.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:just_audio/just_audio.dart';
import 'package:just_audio_media_kit/just_audio_media_kit.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:shelfsdk/audiobookshelf_api.dart' as api; import 'package:shelfsdk/audiobookshelf_api.dart' as api;
@ -16,7 +18,7 @@ final _logger = Logger('AbsPlayerProvider');
/// ///
@Riverpod(keepAlive: true) @Riverpod(keepAlive: true)
Future<AudioHandler> configurePlayer(Ref ref) async { Future<AudioHandler> configurePlayer(Ref ref) async {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
// for playing audio on windows, linux // for playing audio on windows, linux
// for configuring how this app will interact with other audio apps // for configuring how this app will interact with other audio apps
@ -43,13 +45,28 @@ Future<AudioHandler> configurePlayer(Ref ref) async {
return audioService; return audioService;
} }
// just_audio
@Riverpod(keepAlive: true)
AudioPlayer audioPlayer(Ref ref) {
//
// prefetch-playlist=yes
JustAudioMediaKit.prefetchPlaylist = true;
// merge-files=yes
// cache=yes
// cache-pause-wait=60
JustAudioMediaKit.ensureInitialized();
return AudioPlayer();
}
/// riverpod状态 /// riverpod状态
@Riverpod(keepAlive: true) @Riverpod(keepAlive: true)
class AudioPlayer extends _$AudioPlayer { class AbsPlayer extends _$AbsPlayer {
@override @override
core.AbsAudioPlayer build() { core.AbsAudioPlayer build() {
final audioPlayer = ref.watch(audioPlayerProvider);
// final player = AbsMpvAudioPlayer(); // final player = AbsMpvAudioPlayer();
final player = AbsPlatformAudioPlayer(); final player = AbsPlatformAudioPlayer(audioPlayer);
ref.onDispose(player.dispose); ref.onDispose(player.dispose);
return player; return player;
} }
@ -77,7 +94,7 @@ class AudioPlayer extends _$AudioPlayer {
class PlayerState extends _$PlayerState { class PlayerState extends _$PlayerState {
@override @override
core.AbsPlayerState build() { core.AbsPlayerState build() {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
player.playerStateStream.listen((playerState) { player.playerStateStream.listen((playerState) {
if (playerState != state) { if (playerState != state) {
state = playerState; state = playerState;
@ -87,7 +104,7 @@ class PlayerState extends _$PlayerState {
} }
bool isLoading(String itemId) { bool isLoading(String itemId) {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
return player.book?.libraryItemId == itemId && return player.book?.libraryItemId == itemId &&
!state.playing && !state.playing &&
state.processingState == core.AbsProcessingState.loading; state.processingState == core.AbsProcessingState.loading;
@ -102,7 +119,7 @@ class PlayerState extends _$PlayerState {
class CurrentBook extends _$CurrentBook { class CurrentBook extends _$CurrentBook {
@override @override
api.BookExpanded? build() { api.BookExpanded? build() {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
player.bookStream.listen((book) { player.bookStream.listen((book) {
if (book != state) { if (book != state) {
state = book; state = book;
@ -114,7 +131,7 @@ class CurrentBook extends _$CurrentBook {
@riverpod @riverpod
bool isPlayerActive(Ref ref) { bool isPlayerActive(Ref ref) {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
player.bookStream.listen((book) { player.bookStream.listen((book) {
ref.invalidateSelf(); ref.invalidateSelf();
}); });
@ -125,7 +142,7 @@ bool isPlayerActive(Ref ref) {
class CurrentChapter extends _$CurrentChapter { class CurrentChapter extends _$CurrentChapter {
@override @override
api.BookChapter? build() { api.BookChapter? build() {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
player.chapterStream.listen((chapter) { player.chapterStream.listen((chapter) {
if (chapter != state) { if (chapter != state) {
state = chapter; state = chapter;
@ -137,7 +154,7 @@ class CurrentChapter extends _$CurrentChapter {
@riverpod @riverpod
Stream<Duration> positionChapter(Ref ref) { Stream<Duration> positionChapter(Ref ref) {
return ref.read(audioPlayerProvider).positionInChapterStream; return ref.read(absPlayerProvider).positionInChapterStream;
} }
@riverpod @riverpod

View file

@ -6,7 +6,7 @@ part of 'abs_provider.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$configurePlayerHash() => r'7e7003c815e7d240a67cd581931839cc60346707'; String _$configurePlayerHash() => r'7ac63b6c3a34c56f42be55bc7a4856dabaae1583';
/// ///
/// ///
@ -25,7 +25,23 @@ final configurePlayerProvider = FutureProvider<AudioHandler>.internal(
@Deprecated('Will be removed in 3.0. Use Ref instead') @Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element // ignore: unused_element
typedef ConfigurePlayerRef = FutureProviderRef<AudioHandler>; typedef ConfigurePlayerRef = FutureProviderRef<AudioHandler>;
String _$isPlayerActiveHash() => r'71a24418ecf6c1a2d8160b0d0c8fc523d5679e76'; String _$audioPlayerHash() => r'd9d6cea83d03e36fac43367b6a24fd9d3a53b2fa';
/// See also [audioPlayer].
@ProviderFor(audioPlayer)
final audioPlayerProvider = Provider<AudioPlayer>.internal(
audioPlayer,
name: r'audioPlayerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product') ? null : _$audioPlayerHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef AudioPlayerRef = ProviderRef<AudioPlayer>;
String _$isPlayerActiveHash() => r'4fca4af53a17dbcd7c8a98ce115bc11fa39b4cf9';
/// See also [isPlayerActive]. /// See also [isPlayerActive].
@ProviderFor(isPlayerActive) @ProviderFor(isPlayerActive)
@ -42,7 +58,7 @@ final isPlayerActiveProvider = AutoDisposeProvider<bool>.internal(
@Deprecated('Will be removed in 3.0. Use Ref instead') @Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element // ignore: unused_element
typedef IsPlayerActiveRef = AutoDisposeProviderRef<bool>; typedef IsPlayerActiveRef = AutoDisposeProviderRef<bool>;
String _$positionChapterHash() => r'750b8e2f2c7217b59c3d77ed66dd20798f8787fa'; String _$positionChapterHash() => r'ac6148e92363fad849713c07045503653dcaa7e8';
/// See also [positionChapter]. /// See also [positionChapter].
@ProviderFor(positionChapter) @ProviderFor(positionChapter)
@ -77,24 +93,24 @@ final currentChaptersProvider =
@Deprecated('Will be removed in 3.0. Use Ref instead') @Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element // ignore: unused_element
typedef CurrentChaptersRef = AutoDisposeProviderRef<List<api.BookChapter>>; typedef CurrentChaptersRef = AutoDisposeProviderRef<List<api.BookChapter>>;
String _$audioPlayerHash() => r'e0efa20f340adf3312a76e5ca9e0c8ab0273a22a'; String _$absPlayerHash() => r'2ec8952e1ec764b02239ff7c26144040e460976a';
/// riverpod状态 /// riverpod状态
/// ///
/// Copied from [AudioPlayer]. /// Copied from [AbsPlayer].
@ProviderFor(AudioPlayer) @ProviderFor(AbsPlayer)
final audioPlayerProvider = final absPlayerProvider =
NotifierProvider<AudioPlayer, core.AbsAudioPlayer>.internal( NotifierProvider<AbsPlayer, core.AbsAudioPlayer>.internal(
AudioPlayer.new, AbsPlayer.new,
name: r'audioPlayerProvider', name: r'absPlayerProvider',
debugGetCreateSourceHash: debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product') ? null : _$audioPlayerHash, const bool.fromEnvironment('dart.vm.product') ? null : _$absPlayerHash,
dependencies: null, dependencies: null,
allTransitiveDependencies: null, allTransitiveDependencies: null,
); );
typedef _$AudioPlayer = Notifier<core.AbsAudioPlayer>; typedef _$AbsPlayer = Notifier<core.AbsAudioPlayer>;
String _$playerStateHash() => r'7e238aea9306cdfb952b546c76d1e894888c586f'; String _$playerStateHash() => r'f195d2d13bcee0f91b862e669ab3549667d8dd2d';
/// See also [PlayerState]. /// See also [PlayerState].
@ProviderFor(PlayerState) @ProviderFor(PlayerState)
@ -109,7 +125,7 @@ final playerStateProvider =
); );
typedef _$PlayerState = AutoDisposeNotifier<core.AbsPlayerState>; typedef _$PlayerState = AutoDisposeNotifier<core.AbsPlayerState>;
String _$currentBookHash() => r'3684426dfde84e49dc2021e8444a2a3026082942'; String _$currentBookHash() => r'f511c6f16c17696e41c6384c5195646a419deae3';
/// See also [CurrentBook]. /// See also [CurrentBook].
@ProviderFor(CurrentBook) @ProviderFor(CurrentBook)
@ -124,7 +140,7 @@ final currentBookProvider =
); );
typedef _$CurrentBook = AutoDisposeNotifier<api.BookExpanded?>; typedef _$CurrentBook = AutoDisposeNotifier<api.BookExpanded?>;
String _$currentChapterHash() => r'28ac34fa83cbd6acf745e06b91b9ce36733fdbe5'; String _$currentChapterHash() => r'aff83aed7d098099805ec7d72ea84fff3a298522';
/// See also [CurrentChapter]. /// See also [CurrentChapter].
@ProviderFor(CurrentChapter) @ProviderFor(CurrentChapter)

View file

@ -9,7 +9,7 @@ class MiniPlayerBottomPadding extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
return AnimatedSize( return AnimatedSize(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 200),
child: ref.watch(audioPlayerProvider).playing child: ref.watch(absPlayerProvider).playing
? const SizedBox(height: playerMinHeight + 8) ? const SizedBox(height: playerMinHeight + 8)
: const SizedBox.shrink(), : const SizedBox.shrink(),
); );

View file

@ -223,7 +223,7 @@ class ChapterSelection extends HookConsumerWidget {
selected: isCurrent, selected: isCurrent,
// key: isCurrent ? chapterKey : null, // key: isCurrent ? chapterKey : null,
onTap: () { onTap: () {
ref.read(audioPlayerProvider).switchChapter(chapter.id); ref.read(absPlayerProvider).switchChapter(chapter.id);
}, },
); );
}, },

View file

@ -148,7 +148,7 @@ class PlayerMinimizedProgress extends HookConsumerWidget {
final currentChapter = ref.watch(currentChapterProvider); final currentChapter = ref.watch(currentChapterProvider);
final progress = useStream( final progress = useStream(
ref.read(audioPlayerProvider).positionInChapterStream, ref.read(absPlayerProvider).positionInChapterStream,
initialData: Duration.zero, initialData: Duration.zero,
); );
return SizedBox( return SizedBox(

View file

@ -14,7 +14,7 @@ class AudiobookPlayerSeekButton extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
return IconButton( return IconButton(
icon: Icon( icon: Icon(
isForward ? Icons.forward_30 : Icons.replay_30, isForward ? Icons.forward_30 : Icons.replay_30,

View file

@ -20,7 +20,7 @@ class AudiobookPlayerSeekChapterButton extends HookConsumerWidget {
size: AppElementSizes.iconSizeSmall, size: AppElementSizes.iconSizeSmall,
), ),
onPressed: () { onPressed: () {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
final book = ref.read(currentBookProvider); final book = ref.read(currentBookProvider);
if (book == null) { if (book == null) {
return; return;

View file

@ -116,7 +116,7 @@ class ChapterSelectionModal extends HookConsumerWidget {
onTap: () { onTap: () {
Navigator.of(context).pop(); Navigator.of(context).pop();
ref ref
.read(audioPlayerProvider) .read(absPlayerProvider)
.switchChapter(chapter.id); .switchChapter(chapter.id);
}, },
); );

View file

@ -35,7 +35,7 @@ class AudiobookPlayerPlayPauseButton extends HookConsumerWidget {
} }
void _actionButtonPressed(AbsPlayerState playerState, WidgetRef ref) async { void _actionButtonPressed(AbsPlayerState playerState, WidgetRef ref) async {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
if (playerState.playing) { if (playerState.playing) {
await player.pause(); await player.pause();
} else { } else {

View file

@ -12,7 +12,7 @@ class AudiobookChapterProgressBar extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final player = ref.watch(audioPlayerProvider); final player = ref.watch(absPlayerProvider);
final currentChapter = ref.watch(currentChapterProvider); final currentChapter = ref.watch(currentChapterProvider);
final position = useStream( final position = useStream(
player.positionInBookStream, player.positionInBookStream,
@ -63,7 +63,7 @@ class AudiobookProgressBar extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
final position = useStream( final position = useStream(
player.positionInBookStream, player.positionInBookStream,
initialData: const Duration(seconds: 0), initialData: const Duration(seconds: 0),

View file

@ -16,7 +16,7 @@ class PlayerSpeedAdjustButton extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
final book = ref.read(currentBookProvider); final book = ref.read(currentBookProvider);
final bookId = book?.libraryItemId ?? '_'; final bookId = book?.libraryItemId ?? '_';
final bookSettings = ref.watch(bookSettingsProvider(bookId)); final bookSettings = ref.watch(bookSettingsProvider(bookId));

View file

@ -22,7 +22,7 @@ class SpeedSelector extends HookConsumerWidget {
final appSettings = ref.watch(appSettingsProvider); final appSettings = ref.watch(appSettingsProvider);
final playerSettings = appSettings.playerSettings; final playerSettings = appSettings.playerSettings;
final speeds = playerSettings.speedOptions; final speeds = playerSettings.speedOptions;
final currentSpeed = ref.watch(audioPlayerProvider).speed; final currentSpeed = ref.watch(absPlayerProvider).speed;
final speedState = useState(currentSpeed); final speedState = useState(currentSpeed);
// hook the onSpeedSelected function to the state // hook the onSpeedSelected function to the state

View file

@ -33,7 +33,7 @@ class ShakeDetector extends _$ShakeDetector {
} }
// if no book is loaded, shake detection should not be enabled // if no book is loaded, shake detection should not be enabled
final player = ref.watch(audioPlayerProvider); final player = ref.watch(absPlayerProvider);
player.playerStateStream.listen((event) { player.playerStateStream.listen((event) {
if (event.processingState == AbsProcessingState.idle && wasPlayerLoaded) { if (event.processingState == AbsProcessingState.idle && wasPlayerLoaded) {
_logger.config('Player is now not loaded, invalidating'); _logger.config('Player is now not loaded, invalidating');
@ -89,7 +89,7 @@ class ShakeDetector extends _$ShakeDetector {
ShakeAction shakeAction, { ShakeAction shakeAction, {
required Ref ref, required Ref ref,
}) { }) {
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
if (player.book == null && shakeAction.isPlaybackManagementEnabled) { if (player.book == null && shakeAction.isPlaybackManagementEnabled) {
_logger.warning('No book is loaded'); _logger.warning('No book is loaded');
return false; return false;

View file

@ -6,7 +6,7 @@ part of 'shake_detector_provider.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$shakeDetectorHash() => r'c75e0308478cd70ef4b5cdd5f72cf706d597900c'; String _$shakeDetectorHash() => r'8e65e89d59a9cf9492fd5f3eb309eb3a37cf1c6d';
/// See also [ShakeDetector]. /// See also [ShakeDetector].
@ProviderFor(ShakeDetector) @ProviderFor(ShakeDetector)

View file

@ -15,7 +15,7 @@ class SkipStartEnd extends _$SkipStartEnd {
return null; return null;
} }
final player = ref.read(audioPlayerProvider); final player = ref.read(absPlayerProvider);
final bookSettings = ref.watch(bookSettingsProvider(bookId)); final bookSettings = ref.watch(bookSettingsProvider(bookId));
final start = bookSettings.playerSettings.skipChapterStart; final start = bookSettings.playerSettings.skipChapterStart;
final end = bookSettings.playerSettings.skipChapterEnd; final end = bookSettings.playerSettings.skipChapterEnd;

View file

@ -6,7 +6,7 @@ part of 'skip_start_end_provider.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$skipStartEndHash() => r'f14f84be713bdaad463fcf790510cddeb2be7709'; String _$skipStartEndHash() => r'45572f40a098f081181e8b8bf9e4913e6e649cdc';
/// See also [SkipStartEnd]. /// See also [SkipStartEnd].
@ProviderFor(SkipStartEnd) @ProviderFor(SkipStartEnd)

View file

@ -26,7 +26,7 @@ class SleepTimer extends _$SleepTimer {
var sleepTimer = core.SleepTimer( var sleepTimer = core.SleepTimer(
duration: sleepTimerSettings.defaultDuration, duration: sleepTimerSettings.defaultDuration,
player: ref.watch(audioPlayerProvider), player: ref.watch(absPlayerProvider),
); );
ref.onDispose(sleepTimer.dispose); ref.onDispose(sleepTimer.dispose);
return sleepTimer; return sleepTimer;
@ -45,7 +45,7 @@ class SleepTimer extends _$SleepTimer {
} else { } else {
final timer = core.SleepTimer( final timer = core.SleepTimer(
duration: resultingDuration, duration: resultingDuration,
player: ref.watch(audioPlayerProvider), player: ref.watch(absPlayerProvider),
); );
ref.onDispose(timer.dispose); ref.onDispose(timer.dispose);
state = timer; state = timer;

View file

@ -6,7 +6,7 @@ part of 'sleep_timer_provider.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$sleepTimerHash() => r'89ff64cd768deea9ed4ab103ddde918b3f96d705'; String _$sleepTimerHash() => r'417759e07a45e69af93bd9a1c78ac859d9abcf4b';
/// See also [SleepTimer]. /// See also [SleepTimer].
@ProviderFor(SleepTimer) @ProviderFor(SleepTimer)

View file

@ -294,7 +294,7 @@ class _BookOnShelfPlayButton extends HookConsumerWidget {
// book.media.asBookExpanded, // book.media.asBookExpanded,
// userProgress?.currentTime, // userProgress?.currentTime,
// ); // );
ref.read(audioPlayerProvider.notifier).load( ref.read(absPlayerProvider.notifier).load(
book.media.asBookExpanded, book.media.asBookExpanded,
initialPosition: userProgress?.currentTime, initialPosition: userProgress?.currentTime,
); );

View file

@ -46,17 +46,17 @@ class _TrayManagerState extends ConsumerState<TrayManager>
MenuItem( MenuItem(
key: 'play_pause', key: 'play_pause',
label: '播放/暂停', label: '播放/暂停',
onClick: (menuItem) => ref.read(audioPlayerProvider).playOrPause(), onClick: (menuItem) => ref.read(absPlayerProvider).playOrPause(),
), ),
MenuItem( MenuItem(
key: 'previous', key: 'previous',
label: '上一个', label: '上一个',
onClick: (menuItem) => ref.read(audioPlayerProvider).previous(), onClick: (menuItem) => ref.read(absPlayerProvider).previous(),
), ),
MenuItem( MenuItem(
key: 'next', key: 'next',
label: '下一个', label: '下一个',
onClick: (menuItem) => ref.read(audioPlayerProvider).next(), onClick: (menuItem) => ref.read(absPlayerProvider).next(),
), ),
MenuItem.separator(), MenuItem.separator(),
MenuItem( MenuItem(