async Task LoadTVShowSeason(int tv_id, int season_number, string showName)
        {
            Item = await Task.Run(() => TMDbService.GetDetailedTVShowSeasonAsync(tv_id, season_number, showName));

            Item.poster_path = "";

            PosterSource.Clear();
            foreach (var posterItem in Item.images.posters)
            {
                PosterSource.Add(posterItem);
            }

            CastSource.Clear();
            foreach (var castItem in Item.credits.cast)
            {
                CastSource.Add(castItem);
            }

            CrewSource.Clear();
            foreach (var crewItem in Item.credits.crew)
            {
                CrewSource.Add(crewItem);
            }

            EpisodeSource.Clear();
            foreach (var episodeItem in Item.episodes)
            {
                EpisodeSource.Add(episodeItem);
            }

            LoadCompleted();
        }
        private static void TryClickButton(EpisodeSource episodeSource)
        {
            var tryNumber = 30;

            while (true)
            {
                tryNumber--;
                if (tryNumber == 0)
                {
                    throw new InvalidOperationException("Couldn't click in button");
                }

                try {
                    episodeSource.Button.Click();
                    return;
                }
                catch (ElementClickInterceptedException) {
                    Thread.Sleep(500);
                }
            }
        }
        protected override async Task <Uri> GetEpisodeDownloadUrl(Episode episode)
        {
            var episodeSrcUrls = new List <string>();

            Driver.Url = episode.EpisodeUri.AbsoluteUri;
            var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(30));

            AcceptCookies(wait);
            var table          = GetTable(wait);
            var rows           = table.FindElements(By.TagName("tr"));
            var episodeSources = new List <EpisodeSource>();

            foreach (var row in rows)
            {
                var columns      = row.FindElements(By.TagName("td"));
                var providerName = columns[0].Text;

                if (providerName.ToLower().Contains("cda".ToLower()))
                {
                    var spans          = columns[2].FindElements(By.TagName("span"));
                    var soundsLanguage = spans[1].GetAttribute("textContent");
                    if (!soundsLanguage.Equals("japoński", StringComparison.InvariantCultureIgnoreCase))
                    {
                        continue;
                    }
                    var quality = columns[1].Text;
                    var button  = columns[5].FindElement(By.TagName("a"));

                    var episodeSource = new EpisodeSource {
                        ProviderType = ProviderType.Cda,
                        Quality      = QualityParser.FromString(quality),
                        Language     = Language.PL,
                        Button       = button
                    };
                    episodeSources.Add(episodeSource);
                }
            }

            if (episodeSources.Count == 0)
            {
                throw new NullReferenceException("Episodes with chosen criteria not found");
            }

            episodeSources = episodeSources
                             .OrderByDescending(a => a.Language)
                             .ThenByDescending(a => a.Quality)
                             .ToList();

            foreach (var episodeSource in episodeSources)
            {
                try {
                    TryClickButton(episodeSource);

                    IWebElement iframe;
                    try {
                        iframe = wait.Until(a =>
                                            a.FindElement(By.XPath("/html/body/div[4]/div/article/div[2]/div/iframe")));
                    }
                    catch (WebDriverTimeoutException) {
                        continue;
                    }

                    var src     = iframe.GetAttribute("src");
                    var fullSrc = $"{src}?wersja={episodeSource.Quality.GetDescription()}";
                    episodeSource.SourceUrl = fullSrc;
                }
                catch (InvalidOperationException) { }
            }

            Uri episodeUri = null;

            foreach (var episodeSource in episodeSources)
            {
                try {
                    episodeUri = await new ProviderFactory(Driver).GetProvider(episodeSource.ProviderType)
                                 .GetVideoSourceAsync(episodeSource.SourceUrl);
                    break;
                }
                catch (WebDriverTimeoutException) { }
            }

            if (episodeUri == null)
            {
                throw new InvalidOperationException("Could not find any episode source to download");
            }

            return(episodeUri);
        }