mirror of
https://github.com/Dr-Blank/Vaani.git
synced 2026-02-16 14:29:35 +00:00
111
This commit is contained in:
parent
36f14dbd58
commit
5abf938dcf
26 changed files with 104 additions and 70 deletions
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue