Exemple #1
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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);
        }