コード例 #1
0
ファイル: MainForm.cs プロジェクト: onsubmit/sTunes
        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)));
        }
コード例 #2
0
ファイル: MainForm.cs プロジェクト: onsubmit/sTunes
        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();
        }