private async Task StartPlaylistGeneration() { const int tracksPerPlaylist = 9900; var paginator = new SimplePaginatorWithDelay(100); var authenticator = this.spotifyAuthorization.GetAuthenticator(); var spotifyClient = new SpotifyClient(SpotifyClientConfig.CreateDefault().WithAuthenticator(authenticator)); var profile = await spotifyClient.UserProfile.Current(); var albums = this.GetAlbums().OrderBy(a => a.Artist).ThenBy(a => a.Album).ToList(); var cachedAlbums = this.GetCachedAlbums(); List <string> trackUris = new List <string>(); int counter = 0; var cachedAlbumsInLibrary = cachedAlbums.Where(ca => albums.Select(a => a.Id).Contains(ca.Id)); trackUris.AddRange(cachedAlbumsInLibrary.SelectMany(ca => ca.TrackUris)); var albumsNotInCache = albums.Where(a => !cachedAlbums.Any(ca => ca.Id == a.Id)).ToList(); foreach (var album in albumsNotInCache) { Console.WriteLine($"Processing {++counter}/{albumsNotInCache.Count}: {album.Artist} - {album.Album}"); var albumTrackUris = (await spotifyClient.PaginateAll(await spotifyClient.Albums.GetTracks(album.Id).ConfigureAwait(false), paginator)).Select(at => at.Uri).ToList(); trackUris.AddRange(albumTrackUris); cachedAlbums.Add(new AlbumWithTracks { Id = album.Id, TrackUris = albumTrackUris }); Thread.Sleep(100); } this.SaveCachedAlbums(cachedAlbums); int playlistCounter = 1; var blacklistHelper = new TrackBlacklistHelper(); trackUris = trackUris.Except(blacklistHelper.GetBlacklist()).ToList(); while (trackUris.Any()) { string playlistId = await GetPlaylistId(string.Format(Constants.PlaylistName, playlistCounter++), paginator, spotifyClient, profile).ConfigureAwait(false); await AddTracksToPlaylist(spotifyClient, playlistId, trackUris.Take(tracksPerPlaylist).ToList()); trackUris.RemoveRange(0, Math.Min(tracksPerPlaylist, trackUris.Count)); } }
private static async Task <string> GetPlaylistId(string playlistName, SimplePaginatorWithDelay paginator, SpotifyClient spotifyClient, PrivateUser profile) { var playlists = await spotifyClient.PaginateAll(await spotifyClient.Playlists.GetUsers(profile.Id).ConfigureAwait(false), paginator); var playlist = playlists.FirstOrDefault(pl => pl.Name == playlistName); FullPlaylist createdPlaylist = null; if (playlist == null) { createdPlaylist = await spotifyClient.Playlists.Create(profile.Id, new PlaylistCreateRequest(playlistName)); } string playlistId = playlist?.Id ?? createdPlaylist?.Id; return(playlistId); }