private static List <RemoteSubtitleInfo> ExtractSubtitles(string html, string lang) { html = html.Replace("</div></div></body>", "</div></body>"); var res = new List <RemoteSubtitleInfo>(); var xml = new XmlDocument(); xml.LoadXml(Const.XmlTag + html); var repeater = xml.SelectNodes("//li[@class='item']"); if (repeater == null) { return(res); } foreach (XmlElement node in repeater) { var nameList = node.SelectNodes(".//li"); if (nameList == null) { continue; } var name = nameList.Cast <XmlElement>() .Aggregate(string.Empty, (current, nItem) => current + (nItem.InnerText + "<br/>")); if (string.IsNullOrWhiteSpace(name)) { continue; } var id = Subtitle.CreateSubtitleId( node.SelectSingleNode(".//a[@class='download icon-download']")?.Attributes?["href"].Value, lang); var author = node.SelectSingleNode(".//p")?.InnerText.RemoveExtraCharacter(); var provider = node.SelectSingleNode(".//div[@class='vertical-middle']/b/a")?.InnerText.RemoveExtraCharacter(); var item = new RemoteSubtitleInfo { Id = id, Name = $"{provider} ({author})", Author = author, ProviderName = Const.PluginName, Comment = name, Format = "srt" }; res.Add(item); } return(res); }
protected static int CompareSubInfo(RemoteSubtitleInfo x, RemoteSubtitleInfo y) { // Download count if (x.DownloadCount == null) { if (y.DownloadCount == null) { return(0); } else { return(1); } } else if (y.DownloadCount == null) { return(-1); } else { return((int)(y.DownloadCount - x.DownloadCount)); } }
public async Task <IEnumerable <RemoteSubtitleInfo> > Search(SubtitleSearchRequest request, CancellationToken cancellationToken) { string hash = Helpers.Utils.GetMovieHash(request.MediaPath); Response resp = _client.SearchSubtitleAsync(hash, true).GetAwaiter().GetResult(); Helpers.CsvResponseParser csvResponseParser = new CsvResponseParser(); IReadOnlyList <Language> languages = csvResponseParser.ParseSearchSubtitle(ASCIIEncoding.ASCII.GetString((byte[])resp.Body), true); List <RemoteSubtitleInfo> list = new List <RemoteSubtitleInfo>(); _logger.LogInformation("Searched for languages on the hash " + hash + " and found " + languages.Count.ToString() + " results"); foreach (Language lang in languages) { _logger.LogInformation(lang.Name.ToString() + " " + lang.Count.ToString()); _logger.LogInformation("Fant en sub med riktig språk"); RemoteSubtitleInfo remoteSubtitleInfo = new RemoteSubtitleInfo() { Name = lang.Name, Id = lang.Name + "-n0t-" + hash, }; list.Add(remoteSubtitleInfo); } return(list); }
private async Task <List <RemoteSubtitleInfo> > SearchTV(string title, int?year, string lang, string movieId, int season, int episode) { var res = new List <RemoteSubtitleInfo>(); var mDb = new MovieDb(_jsonSerializer, _httpClient, _appHost); var info = await mDb.GetTvInfo(movieId); if (info == null) { return(new List <RemoteSubtitleInfo>()); } #region Search TV Shows title = info.Name; _logger?.Debug($"Subscene= Searching for site search \"{title}\""); var url = string.Format(SearchUrl, HttpUtility.UrlEncode($"{title} - {_seasonNumbers[season]} Season")); var html = await GetHtml(Domain, url); if (string.IsNullOrWhiteSpace(html)) { return(res); } var xml = new XmlDocument(); xml.LoadXml($"{XmlTag}{html}"); var xNode = xml.SelectSingleNode("//div[@class='search-result']"); if (xNode == null) { return(res); } var ex = xNode?.SelectSingleNode("h2[@class='exact']") ?? xNode?.SelectSingleNode("h2[@class='close']"); if (ex == null) { return(res); } xNode = xNode.SelectSingleNode("ul"); if (xNode == null) { return(res); } var sItems = xNode.SelectNodes(".//a"); foreach (XmlNode item in sItems) { if (!item.InnerText.StartsWith($"{title} - {_seasonNumbers[season]} Season")) { continue; } var link = item.Attributes["href"].Value; link += $"/{MapLanguage(lang)}"; html = await GetHtml(Domain, link); break; } #endregion #region Extract subtitle links xml = new XmlDocument(); xml.LoadXml($"{XmlTag}{html}"); var repeater = xml.SelectNodes("//table/tbody/tr"); if (repeater == null) { return(res); } foreach (XmlElement node in repeater) { var name = RemoveExtraCharacter(node.SelectSingleNode(".//a")?.SelectNodes("span").Item(1) ?.InnerText); if (string.IsNullOrWhiteSpace(name)) { continue; } var id = (node.SelectSingleNode(".//a")?.Attributes["href"].Value + "___" + lang) .Replace("/", "__"); var item = new RemoteSubtitleInfo { Id = id, Name = RemoveExtraCharacter(node.SelectSingleNode(".//a")?.SelectNodes("span").Item(1) ?.InnerText), Author = RemoveExtraCharacter(node.SelectSingleNode("td[@class='a6']")?.InnerText), ProviderName = RemoveExtraCharacter(node.SelectSingleNode("td[@class='a5']")?.InnerText), ThreeLetterISOLanguageName = NormalizeLanguage(lang), IsHashMatch = true }; res.Add(item); } #endregion var eTitle = $"S{season.ToString().PadLeft(2, '0')}E{episode.ToString().PadLeft(2, '0')}"; res.RemoveAll(s => !s.Name.Contains(eTitle)); return(res); }
private async Task <List <RemoteSubtitleInfo> > SearchMovie(string title, int?year, string lang, string movieId) { var res = new List <RemoteSubtitleInfo>(); if (!string.IsNullOrWhiteSpace(movieId)) { var mDb = new MovieDb(_jsonSerializer, _httpClient, _appHost); var info = await mDb.GetMovieInfo(movieId); if (info != null) { year = info.release_date.Year; title = info.Title; _logger?.Info($"Subscene= Original movie title=\"{info.Title}\", year={info.release_date.Year}"); } } #region Search subscene _logger?.Debug($"Subscene= Searching for site search \"{title}\""); var url = string.Format(SearchUrl, HttpUtility.UrlEncode(title)); var html = await GetHtml(Domain, url); if (string.IsNullOrWhiteSpace(html)) { return(res); } var xml = new XmlDocument(); xml.LoadXml($"{XmlTag}{html}"); var xNode = xml.SelectSingleNode("//div[@class='search-result']"); if (xNode == null) { return(res); } var ex = xNode?.SelectSingleNode("h2[@class='exact']") ?? xNode?.SelectSingleNode("h2[@class='close']") ?? xNode?.SelectSingleNode("h2[@class='popular']"); if (ex == null) { return(res); } xNode = xNode.SelectSingleNode("ul"); if (xNode == null) { return(res); } var sItems = xNode.SelectNodes(".//a"); foreach (XmlNode item in sItems) { var sYear = item.InnerText.Split('(', ')')[1]; if (year.Value != Convert.ToInt16(sYear)) { continue; } var link = item.Attributes["href"].Value; link += $"/{MapLanguage(lang)}"; html = await GetHtml(Domain, link); break; } #endregion #region Extract subtitle links xml = new XmlDocument(); xml.LoadXml($"{XmlTag}{html}"); var repeater = xml.SelectNodes("//table/tbody/tr"); if (repeater == null) { return(res); } foreach (XmlElement node in repeater) { var name = RemoveExtraCharacter(node.SelectSingleNode(".//a")?.SelectNodes("span").Item(1) ?.InnerText); if (string.IsNullOrWhiteSpace(name)) { continue; } var id = (node.SelectSingleNode(".//a")?.Attributes["href"].Value + "___" + lang) .Replace("/", "__"); var item = new RemoteSubtitleInfo { Id = id, Name = RemoveExtraCharacter(node.SelectSingleNode(".//a")?.SelectNodes("span").Item(1) ?.InnerText), Author = RemoveExtraCharacter(node.SelectSingleNode("td[@class='a6']")?.InnerText), ProviderName = RemoveExtraCharacter(node.SelectSingleNode("td[@class='a5']")?.InnerText), ThreeLetterISOLanguageName = NormalizeLanguage(lang), IsHashMatch = true }; res.Add(item); } #endregion return(res); }
private RemoteSubtitleInfo ParseSubtitleList(XmlReader reader) { var SubtitleInfo = new RemoteSubtitleInfo { ProviderName = Name }; reader.MoveToContent(); reader.Read(); var id = new StringBuilder(); while (!reader.EOF && reader.ReadState == ReadState.Interactive) { if (reader.NodeType == XmlNodeType.Element) { switch (reader.Name) { case "pid": { SubtitleInfo.Id = reader.ReadElementContentAsString(); break; } case "title": { SubtitleInfo.Name = reader.ReadElementContentAsString(); break; } case "url": { SubtitleInfo.Id = $"{SubtitleInfo.Id},{reader.ReadElementContentAsString().Split('/')[5]}"; break; } case "language": { SubtitleInfo.Id = $"{SubtitleInfo.Id},{reader.ReadElementContentAsString()}"; break; } case "rating": { SubtitleInfo.CommunityRating = reader.ReadElementContentAsFloat(); break; } case "downloads": { SubtitleInfo.DownloadCount = reader.ReadElementContentAsInt(); break; } default: { reader.Skip(); break; } } } else { reader.Read(); } } return(SubtitleInfo); }
private async Task <RemoteSubtitleInfo> ParseSubtitleList(XmlReader reader) { var SubtitleInfo = new RemoteSubtitleInfo { ProviderName = Name, Format = "srt" }; await reader.MoveToContentAsync().ConfigureAwait(false); await reader.ReadAsync().ConfigureAwait(false); var id = new StringBuilder(); while (!reader.EOF && reader.ReadState == ReadState.Interactive) { if (reader.NodeType == XmlNodeType.Element) { switch (reader.Name) { case "pid": { id.Append($"{(await reader.ReadElementContentAsStringAsync().ConfigureAwait(false))},"); break; } case "release": { SubtitleInfo.Name = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false); break; } case "url": { id.Append($"{(await reader.ReadElementContentAsStringAsync().ConfigureAwait(false)).Split('/')[5]},"); break; } case "language": { var lang = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false); SubtitleInfo.Language = NormalizeLanguage(lang); id.Append($"{lang},"); break; } case "rating": { SubtitleInfo.CommunityRating = await ReadFloat(reader).ConfigureAwait(false); break; } case "downloads": { SubtitleInfo.DownloadCount = await ReadInt(reader).ConfigureAwait(false); break; } default: { await reader.SkipAsync().ConfigureAwait(false); break; } } } else { await reader.ReadAsync().ConfigureAwait(false); } } SubtitleInfo.Id = id.ToString(); return(SubtitleInfo); }
private List <RemoteSubtitleInfo> SearchSubtitles(string query, int page) { var html = GetHtml($"http://www.subdivx.com/index.php?accion=5&q={query}&pg={page}"); if (string.IsNullOrWhiteSpace(html)) { return(null); } string reListSub = "<a\\s+class=\"titulo_menu_izq\"\\s+href=\"http://www.subdivx.com/(?<id>[a-zA-Z\\w -]*).html\">(?<title>.*)</a></div>"; reListSub += "+.*<img\\s+src=\"img/calif(?<calif>\\d)\\.gif\"\\s+class=\"detalle_calif\"\\s+name=\"detalle_calif\">+.*"; reListSub += "\\n<div\\s+id=\"buscador_detalle_sub\">(?<desc>.*?)</div>+.*<b>Downloads:</b>(?<download>.+?)<b>Cds:</b>+.*<b>Subido\\ por:</b>\\s*<a.+?>(?<uploader>.+?)</a>.+?</div></div>"; Regex re = new Regex(reListSub); var mat = re.Matches(html); if (mat.Count == 0) { return(null); } var subtitles = new List <RemoteSubtitleInfo>(); foreach (Match x in mat) { var sub = new RemoteSubtitleInfo() { Name = "", ThreeLetterISOLanguageName = "ESP", Id = x.Groups["id"].Value, CommunityRating = float.Parse(x.Groups["calif"].Value.Trim()), DownloadCount = int.Parse(x.Groups["download"].Value.Trim().Replace(",", "").Replace(".", "")), Author = x.Groups["uploader"].Value, ProviderName = Name, Format = "srt" }; if (_configuration.ShowTitleInResult || _configuration.ShowUploaderInResult) { if (_configuration.ShowTitleInResult) { sub.Name = $"{x.Groups["title"].Value.Trim()}"; } if (_configuration.ShowUploaderInResult) { sub.Name += (_configuration.ShowTitleInResult ? " | " : "") + $"Uploader: { x.Groups["uploader"].Value.Trim()}"; } sub.Comment = x.Groups["desc"].Value; } else { sub.Name = x.Groups["desc"].Value; } subtitles.Add(sub); } return(subtitles); }