Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
        }