private async Task <Dictionary <string, Playlist> > GetMyPlaylists() { const int MaxLimit = 50; PlaylistApi playlistApi = new PlaylistApi() { AuthorizationHeader = new AuthorizationHeader(await this.RunAsync(this.AccessTokenTask)) }; int offset = 0; dynamic json = await playlistApi.GetMyPlaylists(MaxLimit, offset); int total = json.total; List <dynamic> items = new List <dynamic>(json.items); List <Task <dynamic> > tasks = new List <Task <dynamic> >(); for (int numItems = items.Count; numItems < total; numItems += MaxLimit) { offset += MaxLimit; tasks.Add(playlistApi.GetMyPlaylists(MaxLimit, offset)); } items.AddRange((await Task.WhenAll(tasks)).SelectMany <dynamic, dynamic>(d => d.items)); return(items.ToDictionary( x => (string)x.id, x => new Playlist( (string)x.id, (string)x.name, int.TryParse((string)x.tracks.total, out int numTracks) ? numTracks : 0))); }
private async Task GetSelectedPlaylistTracks(bool disableCache = false) { const int MaxLimit = 100; List <Task <dynamic> > getPlaylistTracksTasks = new List <Task <dynamic> >(); List <Playlist> playlists = this.dataGridViewPlaylists.GetSelectedRowTags <Playlist>(); if (playlists.Count != 1) { return; } Playlist playlist = playlists.Single(); for (int offset = 0; offset < playlist.NumTracks; offset += MaxLimit) { PlaylistApi playlistApi = new PlaylistApi() { AuthorizationHeader = new AuthorizationHeader(await this.RunAsync(this.AccessTokenTask)) }; getPlaylistTracksTasks.Add(playlistApi.GetPlaylistTracks(playlist.Id, MaxLimit, offset, disableCache)); } if (!getPlaylistTracksTasks.Any()) { return; } List <dynamic> playlistEntries = new List <dynamic>(); foreach (dynamic x in await Task.WhenAll(getPlaylistTracksTasks)) { playlistEntries.AddRange(x.items); } this.tracks.Clear(); HashSet <string> artistIds = new HashSet <string>(); foreach (dynamic playlistEntry in playlistEntries) { string trackId = playlistEntry.track.id; string trackName = playlistEntry.track.name; string albumId = playlistEntry.track.album.id; string albumName = playlistEntry.track.album.name; IEnumerable <dynamic> trackArtists = playlistEntry.track.artists; Album album = null; if (this.albums.ContainsKey(albumId)) { album = this.albums[albumId]; } else { album = new Album(albumId, albumName); this.albums.Add(albumId, album); } Track track = null; if (this.tracks.ContainsKey(trackId)) { track = this.tracks[trackId]; } else { HashSet <Artist> artists = new HashSet <Artist>(); foreach (dynamic trackArtist in trackArtists) { string artistId = trackArtist.id; string artistName = trackArtist.name; Artist artist; if (this.artists.ContainsKey(artistId)) { artist = this.artists[artistId]; } else { artist = new Artist(artistId, artistName); this.artists.Add(artistId, artist); } artists.Add(artist); } track = new Track(trackId, trackName, artists, album); this.tracks.Add(trackId, track); } artistIds.UnionWith(track.ArtistIds); } Dictionary <string, HashSet <string> > genres = await this.GetGenres(artistIds); foreach (KeyValuePair <string, HashSet <string> > kvp in genres) { if (this.artists.ContainsKey(kvp.Key)) { this.artists[kvp.Key].Genres = kvp.Value; } } this.DetachFilterEvents(); this.PopulateTracks(this.tracks); this.PopulateGenres(this.tracks); this.PopulateArtists(this.tracks); this.PopulateAlbums(this.tracks); this.AttachFilterEvents(); }