spotube/lib/provider/spotify/playlist/generate.dart
Kingkor Roy Tirtho 6673e5a8a8
feat: improved caching based on riverpod (#1343)
* feat: add riverpod based favorite album provider

* feat: add album is saved, new releases and tracks providers

* feat: add artist related providers

* feat: add all categories providers

* feat: add lyrics provider

* feat: add playlist related providers

* feat: add search provider

* feat: add view and spotify friends provider

* feat: add playlist create and update and favorite handlers

* feat: use providers in home screen

* chore: fix dart lint issues

* feat: use new providers for playlist and albums screen

* feat: use providers in artist page

* feat: use providers on library page

* feat: use provider for playlist and album card and heart button

* feat: use provider in search page

* feat: use providers in generate playlist

* feat: use provider in lyrics screen

* feat: use provider for create playlist

* feat: use provider in add track dialog

* feat: use providers in remaining pages and remove fl_query

* fix: remove direct access to provider.value

* fix: glitching when loading

* fix: user album loading next page indicator

* feat: make many provider autoDispose after 5 minutes of no usage

* fix: ignore episodes in tracks
2024-03-20 23:38:39 +06:00

41 lines
1.3 KiB
Dart

part of '../spotify.dart';
final generatePlaylistProvider = FutureProvider.autoDispose
.family<List<Track>, GeneratePlaylistProviderInput>(
(ref, input) async {
final spotify = ref.watch(spotifyProvider);
final market = ref.watch(
userPreferencesProvider.select((s) => s.recommendationMarket),
);
final recommendation = await spotify.recommendations
.get(
limit: input.limit,
seedArtists: input.seedArtists?.toList(),
seedGenres: input.seedGenres?.toList(),
seedTracks: input.seedTracks?.toList(),
market: market,
max: (input.max?.toJson()?..removeWhere((key, value) => value == null))
?.cast<String, num>(),
min: (input.min?.toJson()?..removeWhere((key, value) => value == null))
?.cast<String, num>(),
target: (input.target?.toJson()
?..removeWhere((key, value) => value == null))
?.cast<String, num>(),
)
.catchError((e, stackTrace) {
Catcher2.reportCheckedError(e, stackTrace);
return Recommendations();
});
if (recommendation.tracks?.isEmpty ?? true) {
return [];
}
final tracks = await spotify.tracks
.list(recommendation.tracks!.map((e) => e.id!).toList());
return tracks.toList();
},
);