Beispiel #1
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);
        }