fix: cached currently playing track infinite loading

This commit is contained in:
Kingkor Roy Tirtho 2023-06-04 14:44:16 +06:00
parent 957c085e12
commit 94017189c6
2 changed files with 40 additions and 25 deletions

View File

@ -15,6 +15,7 @@ import 'package:spotube/provider/proxy_playlist/proxy_playlist.dart';
import 'package:spotube/provider/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences_provider.dart';
import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/services/audio_services/audio_services.dart'; import 'package:spotube/services/audio_services/audio_services.dart';
import 'package:spotube/services/youtube.dart';
import 'package:spotube/utils/persisted_state_notifier.dart'; import 'package:spotube/utils/persisted_state_notifier.dart';
import 'package:spotube/utils/type_conversion_utils.dart'; import 'package:spotube/utils/type_conversion_utils.dart';
@ -215,29 +216,35 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
int initialIndex = 0, int initialIndex = 0,
bool autoPlay = false, bool autoPlay = false,
}) async { }) async {
tracks = blacklist.filter(tracks).toList() as List<Track>; try {
final addableTrack = await SpotubeTrack.fetchFromTrack( tracks = blacklist.filter(tracks).toList() as List<Track>;
tracks.elementAt(initialIndex), final addableTrack = await SpotubeTrack.fetchFromTrack(
preferences, tracks.elementAt(initialIndex),
); preferences,
);
state = state.copyWith( print('addableTrack: $addableTrack');
tracks: mergeTracks([addableTrack], tracks),
active: initialIndex,
);
await notificationService.addTrack(addableTrack); state = state.copyWith(
tracks: mergeTracks([addableTrack], tracks),
active: initialIndex,
);
await audioPlayer.openPlaylist( await notificationService.addTrack(addableTrack);
state.tracks.map(makeAppropriateSource).toList(),
initialIndex: initialIndex,
autoPlay: autoPlay,
);
await storeTrack( await audioPlayer.openPlaylist(
tracks.elementAt(initialIndex), state.tracks.map(makeAppropriateSource).toList(),
addableTrack, initialIndex: initialIndex,
); autoPlay: autoPlay,
);
await storeTrack(
tracks.elementAt(initialIndex),
addableTrack,
);
} catch (e) {
print('Error: $e');
}
} }
Future<void> jumpTo(int index) async { Future<void> jumpTo(int index) async {
@ -404,14 +411,16 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
} }
@override @override
onInit() { onInit() async {
if (state.tracks.isEmpty) return null; if (state.tracks.isEmpty) return null;
return load( if (await PipedSpotube.initialized) {
state.tracks, await load(
initialIndex: state.active ?? 0, state.tracks,
autoPlay: false, initialIndex: state.active ?? 0,
); autoPlay: false,
);
}
} }
@override @override

View File

@ -1,8 +1,13 @@
import 'dart:async';
import 'package:piped_client/piped_client.dart'; import 'package:piped_client/piped_client.dart';
PipedClient _defaultClient = PipedClient(); PipedClient _defaultClient = PipedClient();
class PipedSpotube { class PipedSpotube {
static final Completer<bool> _initialized = Completer();
static Future<bool> get initialized => _initialized.future;
/// Checks for a working instance of piped.video /// Checks for a working instance of piped.video
/// ///
/// To distribute the load, in each startup it randomizes public instances /// To distribute the load, in each startup it randomizes public instances
@ -15,6 +20,7 @@ class PipedSpotube {
try { try {
await client.streams("dQw4w9WgXcQ"); await client.streams("dQw4w9WgXcQ");
_defaultClient = client; _defaultClient = client;
_initialized.complete(true);
break; break;
} catch (e) { } catch (e) {
continue; continue;