mirror of
https://github.com/Dr-Blank/Vaani.git
synced 2026-02-17 06:49:34 +00:00
111
This commit is contained in:
parent
36f14dbd58
commit
5abf938dcf
26 changed files with 104 additions and 70 deletions
|
|
@ -1,6 +1,8 @@
|
|||
import 'package:audio_service/audio_service.dart';
|
||||
import 'package:audio_session/audio_session.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:riverpod_annotation/riverpod_annotation.dart';
|
||||
import 'package:shelfsdk/audiobookshelf_api.dart' as api;
|
||||
|
|
@ -16,7 +18,7 @@ final _logger = Logger('AbsPlayerProvider');
|
|||
/// 音频播放器 配置
|
||||
@Riverpod(keepAlive: true)
|
||||
Future<AudioHandler> configurePlayer(Ref ref) async {
|
||||
final player = ref.read(audioPlayerProvider);
|
||||
final player = ref.read(absPlayerProvider);
|
||||
// for playing audio on windows, linux
|
||||
|
||||
// for configuring how this app will interact with other audio apps
|
||||
|
|
@ -43,13 +45,28 @@ Future<AudioHandler> configurePlayer(Ref ref) async {
|
|||
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(keepAlive: true)
|
||||
class AudioPlayer extends _$AudioPlayer {
|
||||
class AbsPlayer extends _$AbsPlayer {
|
||||
@override
|
||||
core.AbsAudioPlayer build() {
|
||||
final audioPlayer = ref.watch(audioPlayerProvider);
|
||||
// final player = AbsMpvAudioPlayer();
|
||||
final player = AbsPlatformAudioPlayer();
|
||||
final player = AbsPlatformAudioPlayer(audioPlayer);
|
||||
ref.onDispose(player.dispose);
|
||||
return player;
|
||||
}
|
||||
|
|
@ -77,7 +94,7 @@ class AudioPlayer extends _$AudioPlayer {
|
|||
class PlayerState extends _$PlayerState {
|
||||
@override
|
||||
core.AbsPlayerState build() {
|
||||
final player = ref.read(audioPlayerProvider);
|
||||
final player = ref.read(absPlayerProvider);
|
||||
player.playerStateStream.listen((playerState) {
|
||||
if (playerState != state) {
|
||||
state = playerState;
|
||||
|
|
@ -87,7 +104,7 @@ class PlayerState extends _$PlayerState {
|
|||
}
|
||||
|
||||
bool isLoading(String itemId) {
|
||||
final player = ref.read(audioPlayerProvider);
|
||||
final player = ref.read(absPlayerProvider);
|
||||
return player.book?.libraryItemId == itemId &&
|
||||
!state.playing &&
|
||||
state.processingState == core.AbsProcessingState.loading;
|
||||
|
|
@ -102,7 +119,7 @@ class PlayerState extends _$PlayerState {
|
|||
class CurrentBook extends _$CurrentBook {
|
||||
@override
|
||||
api.BookExpanded? build() {
|
||||
final player = ref.read(audioPlayerProvider);
|
||||
final player = ref.read(absPlayerProvider);
|
||||
player.bookStream.listen((book) {
|
||||
if (book != state) {
|
||||
state = book;
|
||||
|
|
@ -114,7 +131,7 @@ class CurrentBook extends _$CurrentBook {
|
|||
|
||||
@riverpod
|
||||
bool isPlayerActive(Ref ref) {
|
||||
final player = ref.read(audioPlayerProvider);
|
||||
final player = ref.read(absPlayerProvider);
|
||||
player.bookStream.listen((book) {
|
||||
ref.invalidateSelf();
|
||||
});
|
||||
|
|
@ -125,7 +142,7 @@ bool isPlayerActive(Ref ref) {
|
|||
class CurrentChapter extends _$CurrentChapter {
|
||||
@override
|
||||
api.BookChapter? build() {
|
||||
final player = ref.read(audioPlayerProvider);
|
||||
final player = ref.read(absPlayerProvider);
|
||||
player.chapterStream.listen((chapter) {
|
||||
if (chapter != state) {
|
||||
state = chapter;
|
||||
|
|
@ -137,7 +154,7 @@ class CurrentChapter extends _$CurrentChapter {
|
|||
|
||||
@riverpod
|
||||
Stream<Duration> positionChapter(Ref ref) {
|
||||
return ref.read(audioPlayerProvider).positionInChapterStream;
|
||||
return ref.read(absPlayerProvider).positionInChapterStream;
|
||||
}
|
||||
|
||||
@riverpod
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'abs_provider.dart';
|
|||
// 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')
|
||||
// ignore: unused_element
|
||||
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].
|
||||
@ProviderFor(isPlayerActive)
|
||||
|
|
@ -42,7 +58,7 @@ final isPlayerActiveProvider = AutoDisposeProvider<bool>.internal(
|
|||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef IsPlayerActiveRef = AutoDisposeProviderRef<bool>;
|
||||
String _$positionChapterHash() => r'750b8e2f2c7217b59c3d77ed66dd20798f8787fa';
|
||||
String _$positionChapterHash() => r'ac6148e92363fad849713c07045503653dcaa7e8';
|
||||
|
||||
/// See also [positionChapter].
|
||||
@ProviderFor(positionChapter)
|
||||
|
|
@ -77,24 +93,24 @@ final currentChaptersProvider =
|
|||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
typedef CurrentChaptersRef = AutoDisposeProviderRef<List<api.BookChapter>>;
|
||||
String _$audioPlayerHash() => r'e0efa20f340adf3312a76e5ca9e0c8ab0273a22a';
|
||||
String _$absPlayerHash() => r'2ec8952e1ec764b02239ff7c26144040e460976a';
|
||||
|
||||
/// 音频播放器 riverpod状态
|
||||
///
|
||||
/// Copied from [AudioPlayer].
|
||||
@ProviderFor(AudioPlayer)
|
||||
final audioPlayerProvider =
|
||||
NotifierProvider<AudioPlayer, core.AbsAudioPlayer>.internal(
|
||||
AudioPlayer.new,
|
||||
name: r'audioPlayerProvider',
|
||||
/// Copied from [AbsPlayer].
|
||||
@ProviderFor(AbsPlayer)
|
||||
final absPlayerProvider =
|
||||
NotifierProvider<AbsPlayer, core.AbsAudioPlayer>.internal(
|
||||
AbsPlayer.new,
|
||||
name: r'absPlayerProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product') ? null : _$audioPlayerHash,
|
||||
const bool.fromEnvironment('dart.vm.product') ? null : _$absPlayerHash,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
typedef _$AudioPlayer = Notifier<core.AbsAudioPlayer>;
|
||||
String _$playerStateHash() => r'7e238aea9306cdfb952b546c76d1e894888c586f';
|
||||
typedef _$AbsPlayer = Notifier<core.AbsAudioPlayer>;
|
||||
String _$playerStateHash() => r'f195d2d13bcee0f91b862e669ab3549667d8dd2d';
|
||||
|
||||
/// See also [PlayerState].
|
||||
@ProviderFor(PlayerState)
|
||||
|
|
@ -109,7 +125,7 @@ final playerStateProvider =
|
|||
);
|
||||
|
||||
typedef _$PlayerState = AutoDisposeNotifier<core.AbsPlayerState>;
|
||||
String _$currentBookHash() => r'3684426dfde84e49dc2021e8444a2a3026082942';
|
||||
String _$currentBookHash() => r'f511c6f16c17696e41c6384c5195646a419deae3';
|
||||
|
||||
/// See also [CurrentBook].
|
||||
@ProviderFor(CurrentBook)
|
||||
|
|
@ -124,7 +140,7 @@ final currentBookProvider =
|
|||
);
|
||||
|
||||
typedef _$CurrentBook = AutoDisposeNotifier<api.BookExpanded?>;
|
||||
String _$currentChapterHash() => r'28ac34fa83cbd6acf745e06b91b9ce36733fdbe5';
|
||||
String _$currentChapterHash() => r'aff83aed7d098099805ec7d72ea84fff3a298522';
|
||||
|
||||
/// See also [CurrentChapter].
|
||||
@ProviderFor(CurrentChapter)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue