public async Task <List <RemoteSrt> > GetRemoteEpisodeDetail(RemoteEpisode episode, string showName) { List <RemoteSrt> srts = new List <RemoteSrt>(); string html = await _remote.GetRemoteEpisodeDetail(episode).ConfigureAwait(false); var doc = new HtmlDocument(); doc.LoadHtml(html); var nodes = doc.DocumentNode.SelectNodes("//div") .Where(div => div.Id == "container95m"); foreach (HtmlNode htmlNode in nodes) { var htmlTitle = htmlNode.Descendants() /*.SelectNodes("//td")*/ .Where(n => n.HasClass("NewsTitle") && n.Attributes["colspan"].Value == "3"); foreach (HtmlNode node in htmlTitle) { string name = node.InnerText.Trim(); Regex release = new Regex(self_release_pattern); var regMatch = release.Match(name); string releaseTeam = null; if (regMatch.Groups[1].Success) { releaseTeam = regMatch.Groups[1].Value; } var tableRef = node.ParentNode.ParentNode; foreach (var lang in tableRef.Descendants().Where(l => l.HasClass("language"))) { var parent = lang.ParentNode; var impaired = parent.NextSibling.NextSibling.ChildNodes.SingleOrDefault(c => c.HasClass("newsDate"))?.InnerHtml .Contains("Hearing Impaired"); if (!impaired.HasValue || !impaired.Value) { var langGroup = parent.ChildNodes.Where(c => c.Name == "td").ToList(); var status = langGroup[3].InnerText.Trim(); if (status == "Completed") { var nbDl = langGroup[4].ChildNodes.Count(c => c.Name == "a"); var dlLink = ""; if (nbDl == 1) { dlLink = langGroup[4].ChildNodes.SingleOrDefault(c => c.Name == "a") ?.Attributes["href"].Value; } else if (nbDl > 1) { dlLink = langGroup[4].ChildNodes.SingleOrDefault(c => c.Name == "a" && c.InnerText.Contains("most updated")) ?.Attributes["href"].Value; } srts.Add(new RemoteSrt { ShowName = showName, SeasonId = episode.SeasonId, EpisodeId = episode.Id, RemoteId = episode.RemoteId, LongLanguage = lang.InnerText.Trim(), Release = releaseTeam, RemoteUrl = dlLink, }); } } } } } return(srts); }