import 'package:audio_service/audio_service.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../auth/auth_provider.dart'; import '../cache/audio_cache_manager.dart'; import '../library/library_providers.dart' show dioProvider; import '../models/track.dart'; import 'album_cover_cache.dart'; import 'audio_handler.dart'; final audioHandlerProvider = Provider((ref) { throw UnimplementedError('overridden in main()'); }); final albumCoverCacheProvider = Provider((ref) { return AlbumCoverCache( dioFactory: () => ref.read(dioProvider.future), ); }); final playbackStateProvider = StreamProvider( (ref) => ref.watch(audioHandlerProvider).playbackState, ); final mediaItemProvider = StreamProvider( (ref) => ref.watch(audioHandlerProvider).mediaItem, ); final queueProvider = StreamProvider>( (ref) => ref.watch(audioHandlerProvider).queue, ); class PlayerActions { PlayerActions(this._ref); final Ref _ref; Future playTracks(List tracks, {int initialIndex = 0}) async { final url = await _ref.read(serverUrlProvider.future); final token = await _ref.read(secureStorageProvider).read(key: 'session_token'); final cache = _ref.read(albumCoverCacheProvider); final audioCache = _ref.read(audioCacheManagerProvider); final h = _ref.read(audioHandlerProvider) ..configure( baseUrl: url ?? '', token: token, coverCache: cache, audioCacheManager: audioCache, ); await h.setQueueFromTracks(tracks, initialIndex: initialIndex); await h.play(); } Future playNext(TrackRef track) async { final h = _ref.read(audioHandlerProvider); await h.playNext(track); } Future enqueue(TrackRef track) async { final h = _ref.read(audioHandlerProvider); await h.enqueue(track); } } final playerActionsProvider = Provider((ref) => PlayerActions(ref));