private async Task <Series> GetAllEpisodesInfo(ISeriesIdentifier seriesIdentifier, string authToken,
                                                       IWebProxy proxy)
        {
            // I will hate TheTvDb forever for how they make you get episodes now.


            // Step 1. Query the extended details of a series
            string seriesJson = await _apiDownloader.GetSeriesExtendedAsync(seriesIdentifier, authToken, proxy);

            var theTvDbSeries = Deserialize <SeriesExtendedRecord>(seriesJson);


            // Step 2. Extract all the Aired Order seasons
            var allSeasons = theTvDbSeries.Data.Seasons
                             .Where(x => x.Type.Name == "Aired Order")
                             .OrderBy(x => x.Number)
                             .ToList();


            // Step 3. For each season, query the season individually to get episodes
            var seasonsTasks = allSeasons.ToDictionary(
                x => x.Number,
                x => _apiDownloader.GetSeasonExtendedAsync(x.Id, authToken, proxy
                                                           ));
            await Task.WhenAll(seasonsTasks.Values.ToArray());

            var theTvDbEpisodes = seasonsTasks
                                  .ToDictionary(
                x => x.Key,
                x => Deserialize <SeasonExtendedRecord>(x.Value?.Result).Data.Episodes
                .Where(y => y.SeasonNumber == x.Key)         // Linting bad information
                .ToList()
                );

            // De-dupe episodes
            var dedupedEpisodes = theTvDbEpisodes
                                  .ToDictionary(
                kvp => kvp.Key,
                kvp => kvp.Value.GroupBy(
                    x => x.Id,
                    x => x
                    )
                .Select(x => x.First())
                .OrderBy(x => x.Number)
                .ToList()
                );

            // Remove any seasons without episodes
            var seasonNumbersToRemove = dedupedEpisodes
                                        .Where(kvp => kvp.Value.Count == 0)
                                        .Select(kvp => kvp.Key)
                                        .ToArray();

            foreach (var seasonNumber in seasonNumbersToRemove)
            {
                dedupedEpisodes.Remove(seasonNumber);
                allSeasons.RemoveAt(allSeasons.FindIndex(x => x.Number == seasonNumber));
            }

            // Step 4. For each episode, query the translations individually to get descriptions
            var episodesTasks = dedupedEpisodes.SelectMany(kvp => kvp.Value)
                                .ToDictionary(
                x => x.Id,
                x => _apiDownloader.GetEpisodeTranslationAsync(x.Id, "eng", authToken, proxy
                                                               ));
            await Task.WhenAll(seasonsTasks.Values.ToArray());

            var overviews = episodesTasks.ToDictionary(
                x => x.Key,
                x => Deserialize <Translation>(x.Value.Result).Data
                );

            var series = Adapt(theTvDbSeries.Data, allSeasons, dedupedEpisodes, overviews);

            return(series);
        }