From d9ca11b996cd3ba1f9773149d54bf63fa439deb0 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Wed, 16 Oct 2024 21:39:00 +0600 Subject: [PATCH] fix: switching to different source on playback endpoint error not working --- lib/provider/server/routes/playback.dart | 9 ++-- lib/provider/server/sourced_track.dart | 57 ++++++++++++++++-------- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/lib/provider/server/routes/playback.dart b/lib/provider/server/routes/playback.dart index 2c5aa380..93f5dac2 100644 --- a/lib/provider/server/routes/playback.dart +++ b/lib/provider/server/routes/playback.dart @@ -52,10 +52,11 @@ class ServerPlaybackRoutes { ), ) .catchError((e, stack) async { - final sourcedTrack = await ref.read( - sourcedTrackProvider(SpotubeMedia(track, extras: {"switch": true})) - .future, - ); + final sourcedTrack = await ref + .read(sourcedTrackProvider(SpotubeMedia(track)).notifier) + .switchToAlternativeSources(); + + ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack); return await dio.get( sourcedTrack!.url, diff --git a/lib/provider/server/sourced_track.dart b/lib/provider/server/sourced_track.dart index 5a6377b5..58531523 100644 --- a/lib/provider/server/sourced_track.dart +++ b/lib/provider/server/sourced_track.dart @@ -5,25 +5,44 @@ import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart'; -final sourcedTrackProvider = - FutureProvider.family((ref, media) async { - final track = media?.track; - if (track == null || track is LocalTrack) { - return null; +class SourcedTrackNotifier + extends FamilyAsyncNotifier { + @override + build(media) async { + final track = media?.track; + if (track == null || track is LocalTrack) { + return null; + } + + ref.listen( + audioPlayerProvider.select((value) => value.tracks), + (old, next) { + if (next.isEmpty || next.none((element) => element.id == track.id)) { + ref.invalidateSelf(); + } + }, + ); + + final sourcedTrack = + await SourcedTrack.fetchFromTrack(track: track, ref: ref); + + return sourcedTrack; } - ref.listen( - audioPlayerProvider.select((value) => value.tracks), - (old, next) { - if (next.isEmpty || next.none((element) => element.id == track.id)) { - ref.invalidateSelf(); - } - }, - ); + Future switchToAlternativeSources() async { + if (arg == null) { + return null; + } + return await update((prev) async { + return await SourcedTrack.fetchFromTrackAltSource( + track: arg!.track, + ref: ref, + ); + }); + } +} - final sourcedTrack = media?.extras?["switch"] == true - ? await SourcedTrack.fetchFromTrackAltSource(track: track, ref: ref) - : await SourcedTrack.fetchFromTrack(track: track, ref: ref); - - return sourcedTrack; -}); +final sourcedTrackProvider = AsyncNotifierProviderFamily( + () => SourcedTrackNotifier(), +);