fix: switching to different source on playback endpoint error not working

This commit is contained in:
Kingkor Roy Tirtho 2024-10-16 21:39:00 +06:00
parent a8d2210d52
commit d9ca11b996
2 changed files with 43 additions and 23 deletions

View File

@ -52,10 +52,11 @@ class ServerPlaybackRoutes {
), ),
) )
.catchError((e, stack) async { .catchError((e, stack) async {
final sourcedTrack = await ref.read( final sourcedTrack = await ref
sourcedTrackProvider(SpotubeMedia(track, extras: {"switch": true})) .read(sourcedTrackProvider(SpotubeMedia(track)).notifier)
.future, .switchToAlternativeSources();
);
ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack);
return await dio.get( return await dio.get(
sourcedTrack!.url, sourcedTrack!.url,

View File

@ -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/audio_player/audio_player.dart';
import 'package:spotube/services/sourced_track/sourced_track.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart';
final sourcedTrackProvider = class SourcedTrackNotifier
FutureProvider.family<SourcedTrack?, SpotubeMedia?>((ref, media) async { extends FamilyAsyncNotifier<SourcedTrack?, SpotubeMedia?> {
final track = media?.track; @override
if (track == null || track is LocalTrack) { build(media) async {
return null; 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( Future<SourcedTrack?> switchToAlternativeSources() async {
audioPlayerProvider.select((value) => value.tracks), if (arg == null) {
(old, next) { return null;
if (next.isEmpty || next.none((element) => element.id == track.id)) { }
ref.invalidateSelf(); return await update((prev) async {
} return await SourcedTrack.fetchFromTrackAltSource(
}, track: arg!.track,
); ref: ref,
);
});
}
}
final sourcedTrack = media?.extras?["switch"] == true final sourcedTrackProvider = AsyncNotifierProviderFamily<SourcedTrackNotifier,
? await SourcedTrack.fetchFromTrackAltSource(track: track, ref: ref) SourcedTrack?, SpotubeMedia?>(
: await SourcedTrack.fetchFromTrack(track: track, ref: ref); () => SourcedTrackNotifier(),
);
return sourcedTrack;
});