diff --git a/lib/models/spotube_track.dart b/lib/models/spotube_track.dart index a6ddb9ed..25418a19 100644 --- a/lib/models/spotube_track.dart +++ b/lib/models/spotube_track.dart @@ -8,7 +8,6 @@ import 'package:spotube/extensions/album_simple.dart'; import 'package:spotube/extensions/artist_simple.dart'; import 'package:spotube/models/matched_track.dart'; import 'package:spotube/provider/user_preferences_provider.dart'; -import 'package:spotube/services/supabase.dart'; import 'package:spotube/services/youtube.dart'; import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/service_utils.dart'; diff --git a/lib/provider/proxy_playlist/proxy_playlist.dart b/lib/provider/proxy_playlist/proxy_playlist.dart index 65d2d020..3dc1bb56 100644 --- a/lib/provider/proxy_playlist/proxy_playlist.dart +++ b/lib/provider/proxy_playlist/proxy_playlist.dart @@ -11,9 +11,9 @@ class ProxyPlaylist { ProxyPlaylist(this.tracks, [this.active]); factory ProxyPlaylist.fromJson(Map json) { return ProxyPlaylist( - (json['tracks'] as List>) - .map(_makeAppropriateTrack) - .toSet(), + List.castFrom>( + json['tracks'] ?? >[], + ).map(_makeAppropriateTrack).toSet(), json['active'] as int, ); } diff --git a/lib/provider/proxy_playlist/proxy_playlist_provider.dart b/lib/provider/proxy_playlist/proxy_playlist_provider.dart index 7bc639f3..84b4ff33 100644 --- a/lib/provider/proxy_playlist/proxy_playlist_provider.dart +++ b/lib/provider/proxy_playlist/proxy_playlist_provider.dart @@ -1,3 +1,6 @@ +import 'dart:async'; +import 'dart:convert'; + import 'package:collection/collection.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:palette_generator/palette_generator.dart'; @@ -13,6 +16,7 @@ import 'package:spotube/provider/proxy_playlist/proxy_playlist.dart'; import 'package:spotube/provider/user_preferences_provider.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_services/audio_services.dart'; +import 'package:spotube/utils/persisted_state_notifier.dart'; import 'package:spotube/utils/type_conversion_utils.dart'; /// Things to implement: @@ -24,7 +28,7 @@ import 'package:spotube/utils/type_conversion_utils.dart'; /// * [x] Add track at the beginning /// * [x] Remove track /// * [ ] Reorder track -/// * [ ] Caching and loading of cache of tracks +/// * [x] Caching and loading of cache of tracks /// * [x] Shuffling /// * [x] loop => playlist, track, none /// * [ ] Alternative Track Source @@ -35,7 +39,7 @@ import 'package:spotube/utils/type_conversion_utils.dart'; /// * It'll not store any sort of player state e.g playing, paused, shuffled etc /// * For that, use [SpotubeAudioPlayer] -class ProxyPlaylistNotifier extends StateNotifier +class ProxyPlaylistNotifier extends PersistedStateNotifier with NextFetcher { final Ref ref; late final AudioServices notificationService; @@ -52,7 +56,7 @@ class ProxyPlaylistNotifier extends StateNotifier static AlwaysAliveRefreshable get notifier => provider.notifier; - ProxyPlaylistNotifier(this.ref) : super(ProxyPlaylist({})) { + ProxyPlaylistNotifier(this.ref) : super(ProxyPlaylist({}), "playlist") { () async { notificationService = await AudioServices.create(ref, this); @@ -80,9 +84,6 @@ class ProxyPlaylistNotifier extends StateNotifier audioPlayer.shuffledStream.listen((event) { final newlyOrderedTracks = mapSourcesToTracks(audioPlayer.sources); - print( - 'newlyOrderedTracks: ${newlyOrderedTracks.map((e) => e.name).toList()}'); - final newActiveIndex = newlyOrderedTracks.indexWhere( (element) => element.id == state.activeTrack?.id, ); @@ -207,13 +208,13 @@ class ProxyPlaylistNotifier extends StateNotifier } Future load( - List tracks, { + Iterable tracks, { int initialIndex = 0, bool autoPlay = false, }) async { tracks = blacklist.filter(tracks).toList() as List; - final addableTrack = - await SpotubeTrack.fetchFromTrack(tracks[initialIndex], preferences); + final addableTrack = await SpotubeTrack.fetchFromTrack( + tracks.elementAt(initialIndex), preferences); state = state.copyWith( tracks: mergeTracks([addableTrack], tracks), @@ -227,7 +228,7 @@ class ProxyPlaylistNotifier extends StateNotifier ); await storeTrack( - tracks[initialIndex], + tracks.elementAt(initialIndex), addableTrack, ); } @@ -385,4 +386,24 @@ class ProxyPlaylistNotifier extends StateNotifier ref.read(paletteProvider.notifier).state = null; } } + + @override + onInit() { + return load( + state.tracks, + initialIndex: state.active ?? 0, + autoPlay: false, + ); + } + + @override + FutureOr fromJson(Map json) { + return ProxyPlaylist.fromJson(json); + } + + @override + Map toJson() { + final json = state.toJson(); + return json; + } } diff --git a/lib/utils/persisted_state_notifier.dart b/lib/utils/persisted_state_notifier.dart index 9f444c1b..7cc1652d 100644 --- a/lib/utils/persisted_state_notifier.dart +++ b/lib/utils/persisted_state_notifier.dart @@ -109,7 +109,7 @@ abstract class PersistedStateNotifier extends StateNotifier { } void save() async { - box.put(cacheKey, toJson()); + await box.put(cacheKey, toJson()); } FutureOr fromJson(Map json); diff --git a/pubspec.lock b/pubspec.lock index a5167848..05e039db 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1306,11 +1306,9 @@ packages: piped_client: dependency: "direct main" description: - path: "." - ref: "2036a78d3414a0fc7fe3b081f1029dd086352fcd" - resolved-ref: "2036a78d3414a0fc7fe3b081f1029dd086352fcd" - url: "https://github.com/KRTirtho/piped_client" - source: git + path: "../piped_client" + relative: true + source: path version: "0.1.0" platform: dependency: transitive diff --git a/pubspec.yaml b/pubspec.yaml index e28a397d..395f0de7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -101,7 +101,7 @@ dependencies: piped_client: git: url: https://github.com/KRTirtho/piped_client - ref: 2036a78d3414a0fc7fe3b081f1029dd086352fcd + ref: eaade37d0938d31dbfa35bb5152caca4e284bda6 supabase_flutter: ^1.9.1 dev_dependencies: