/// <summary> /// Gets a user's playlists as a list of ListingPlaylist objects /// </summary> /// <param name="userID">The ID of the user to look up.</param> /// <param name="forceRequest">If false, this function will attempt to return the result from the cache first. If true, it will always make a fresh request and update the cache.</param> /// <returns></returns> public static async Task <List <ListingPlaylist> > GetUserPlaylistListing(string userID, bool forceRequest = false) { if (userID == null) { return(null); // to handle it when the user isn't logged in } if (!forceRequest && Cache.UsersPlaylists != null) { return(Cache.UsersPlaylists); } var firstPage = await API.S.GetUserPlaylistsAsync(userID, PLAYLIST_REQUEST_LIMIT); var results = await Depaginator <SimplePlaylist> .Depage(firstPage); var userplaylists = new List <ListingPlaylist>(); foreach (var playlist in results) { var lp = new ListingPlaylist(playlist); userplaylists.Add(lp); Cache.Save(playlist); // save simple playlist so the info screen is populated } Cache.UsersPlaylists = userplaylists; return(userplaylists); }
public static async Task <ListingPlaylist> GetAndExtendPlaylist(string id, LoadingStatus status = null, bool forceUpdate = false) { var fullPlaylist = await API.S.GetPlaylistAsync(id); var listingPlaylist = new ListingPlaylist(fullPlaylist); status?.ChangeStage(LoadingStatus.Stage.Tracks, 0); listingPlaylist.Tracks = await Requester.GetPlaylistTracks(fullPlaylist, status); var retrievedIDs = ExtractIDsFromPlaylist(listingPlaylist.Tracks); status?.ChangeStage(LoadingStatus.Stage.Analysis, retrievedIDs.TrackIDs.Count); // if we're not forcing a fresh request, use a linq function to filter out any tracks already cached, ToList as SpotifyAPI-NET can't handle enumerable if (!forceUpdate) { await Requester.CacheAnalysedTracks(retrievedIDs.TrackIDs.Where(Not(Cache.HasAnalysedTrack)).ToList(), status); } else { await Requester.CacheAnalysedTracks(retrievedIDs.TrackIDs, status); } status?.ChangeStage(LoadingStatus.Stage.Artists, retrievedIDs.ArtistIDs.Count); if (!forceUpdate) { await Requester.CacheFullArtists(retrievedIDs.ArtistIDs.Where(Not(Cache.HasFullArtist)).ToList(), status); } else { await Requester.CacheFullArtists(retrievedIDs.ArtistIDs, status); } // Album is no use unless you want album popularity or the label of an album // status?.ChangeStage(LoaderInfo.Stage.Albums, retrievedIDs.AlbumIDs.Count); // var CachedAlbums = await Requester.CacheFullAlbums(retrievedIDs.AlbumIDs, status); // no real use since the table starts rendering and the site hangs before RefreshableComponent ticks over on this status?.ChangeStage(LoadingStatus.Stage.Rendering, 0); // Cache.Save(listingPlaylist); listingPlaylist.IsLoaded = true; return(listingPlaylist); }