예제 #1
0
        public void IdSelectorMustReturnOnlyFirstElement()
        {
            var elements = doc.QuerySelectorAll("#myDiv");

            Assert.IsTrue(elements.Count == 1);
            Assert.IsTrue(elements[0].Id == "myDiv");
            Assert.IsTrue(elements[0].Attributes["first"].Value == "1");
        }
예제 #2
0
        public void IdSelectorMustReturnOnlyFirstElement()
        {
            String elementId   = "myDiv";
            String cssSelector = String.Format("#{0}", elementId);
            var    elements    = doc.QuerySelectorAll(cssSelector);

            Assert.IsTrue(elements.Count == 1);
            Assert.IsTrue(elements[0].Id == elementId);
            // identify the DOM node that was found, there are multiple
            Assert.IsTrue(elements[0].Attributes["first"].Value == "1");
        }
        public override NonBloatSeasonData GetSeasonData(MALSeason ms, TempThread tempThread, string year, object storedData)
        {
            List <AnimeParadiseData> data    = (List <AnimeParadiseData>)storedData;
            NonBloatSeasonData       setData = new NonBloatSeasonData()
            {
                dubEpisodes = new List <string>(), subEpisodes = new List <string>()
            };

            foreach (var subData in data)
            {
                if ((setData.DubExists && subData.isDub) || (setData.SubExists && !subData.isDub))
                {
                    continue;
                }

                if (subData.season == ms.season &&
                    (ToLowerAndReplace(ms.name, false).StartsWith(ToLowerAndReplace(subData.name, false)) ||
                     ToLowerAndReplace(ms.engName, false).StartsWith(ToLowerAndReplace(subData.name, false))))                       // THIS IS BECAUSE SEASON IS SEPERATED FROM NAME
                {
                    try {
                        string d   = DownloadString("https://animeparadise.cc/anime.php?s=" + subData.id, referer: subData.referer);
                        var    doc = new HtmlAgilityPack.HtmlDocument();
                        doc.LoadHtml(d);
                        var nodes = doc.QuerySelectorAll("h1.title");

                        int lastEp = int.Parse(nodes[^ 1].InnerText);
예제 #4
0
        public override object StoreData(string year, TempThread tempThred, MALData malData)
        {
            try {
                string d = core.PostRequest("https://genoanime.com/data/searchdata.php", "https://genoanime.com/search", $"anime={malData.engName}");
                if (!d.IsClean())
                {
                    return(null);
                }

                var doc = new HtmlAgilityPack.HtmlDocument();
                doc.LoadHtml(d);

                var mtxt = doc.QuerySelectorAll("div.product__item__text > h5");

                GenoanimeSearchItem[] items = new GenoanimeSearchItem[mtxt.Count];
                for (int i = 0; i < mtxt.Count; i++)
                {
                    var stxt = mtxt[i];
                    var txt  = stxt.QuerySelectorAll("> a")[0];
                    items[i] = new GenoanimeSearchItem()
                    {
                        name = txt.InnerText,
                        link = txt.GetAttributeValue("href", ""),
                    };
                }

                return(items.Length > 0 ? items : null);
            }
            catch (Exception _ex) {
                error(_ex);
                return(null);
            }
        }
        public override object StoreData(string year, TempThread tempThred, MALData malData)
        {
            try {
                string search = ActiveMovie.title.name;
                string data   = $"action=ajaxsearchlite_search&aslp={search}&asid=1&options=qtranslate_lang%3D0%26set_intitle%3DNone%26customset%255B%255D%3Danime";

                string d   = core.PostRequest("https://4anime.to/wp-admin/admin-ajax.php", "https://4anime.to/", data);
                var    doc = new HtmlAgilityPack.HtmlDocument();
                doc.LoadHtml(d);
                var items = doc.QuerySelectorAll("div.info");
                List <FourAnimeQuickSearchItem> searchItems = new List <FourAnimeQuickSearchItem>();

                foreach (var item in items)
                {
                    try {
                        var link      = item.QuerySelector("> a");
                        var localYear = item.QuerySelectorAll("> div > span > span > a")[1];
                        searchItems.Add(new FourAnimeQuickSearchItem()
                        {
                            href  = link.GetAttributeValue("href", ""),
                            title = link.InnerHtml,
                            year  = localYear.InnerText,
                        });
                    }
                    catch (Exception _ex) {
                        error("Error EX parsing item in 4Anime: " + _ex);
                    }
                }
                return(searchItems);
            }
            catch (Exception _ex) {
                error("Fatal EX in 4Anime: " + _ex);
                return(new List <FourAnimeQuickSearchItem>());
            }
        }
예제 #6
0
#pragma warning restore CS0649

        /// <summary>
        /// Null if nothing found
        /// </summary>
        /// <param name="inp"></param>
        /// <returns></returns>
        public List <DubbedSearchItem> Search(string inp)
        {
            string d = DownloadString($"https://bestdubbedanime.com/search/{inp}");

            if (!d.IsClean())
            {
                return(null);
            }
            var doc = new HtmlAgilityPack.HtmlDocument();

            doc.LoadHtml(d);
            List <DubbedSearchItem> items = new List <DubbedSearchItem>();

            var hrefs = doc.QuerySelectorAll("a.resulta");

            foreach (var q in hrefs)
            {
                string href = q.GetAttributeValue("href", "");
                if (href == "")
                {
                    continue;
                }
                var    hDiv    = q.QuerySelector("> div.result");
                string name    = hDiv.QuerySelector("> div.titleresults").InnerText;
                var    innerHt = hDiv.QuerySelector("> div.inresult").InnerHtml.Replace('\n', ' ').Replace('\r', ' ').Replace("  ", "");
                bool   isMovie = innerHt.Length > 4;
                items.Add(new DubbedSearchItem()
                {
                    isMovie = isMovie,
                    name    = name,
                    slug    = href.Replace("//bestdubbedanime.com/", ""),
                });
            }
            return(items);
        }
        private List <AnimeVibeData> Search(string search)
        {
            string searchResults = DownloadString($"https://animevibe.tv/?s={search}");
            //print(search_results);
            var doc = new HtmlAgilityPack.HtmlDocument();

            doc.LoadHtml(searchResults);
            var data = doc.QuerySelectorAll("div.blogShort");
            var list = new List <AnimeVibeData>();

            for (int i = 0; i < data.Count; i++)
            {
                var realName = data[i].QuerySelectorAll("div.search-ex > h6");
                var link     = data[i].QuerySelectorAll("a");

                bool   isDub = (link[0].InnerText.Contains("(Dub)"));
                string href  = (link[0].GetAttributeValue("href", ""));
                string title = (realName[0].InnerText);
                int    maxEp = (int.Parse(FindHTML(realName[3].InnerText, ":", "Episode(s)")));
                list.Add(new AnimeVibeData()
                {
                    isDub = isDub,
                    href  = href,
                    title = title,
                    maxEp = maxEp
                });
            }
            return(list);
        }
예제 #8
0
        //レポート詳細ページから検査結果データを生成
        public List <List <string> > get_detail_table_data(string pageID, string pageURL, string guideline)
        {
            List <List <string> > data = new List <List <string> >();
            var dom = new HtmlAgilityPack.HtmlDocument();

            dom.LoadHtml(_wd.PageSource);
            var tbl = dom.QuerySelectorAll("table").ElementAt <HtmlAgilityPack.HtmlNode>(2);
            var trs = tbl.QuerySelectorAll("tr");

            for (int i = 0; i < trs.Count <HtmlAgilityPack.HtmlNode>(); i++)
            {
                if (i == 0)
                {
                    continue;
                }
                List <string> row_data = new List <string>();
                row_data.Add(pageID);
                row_data.Add(pageURL);
                row_data.Add(guideline);
                var tr      = trs.ElementAt <HtmlAgilityPack.HtmlNode>(i);
                var tds     = tr.QuerySelectorAll("td");
                int col_num = 0;
                for (int j = 0; j < tds.Count <HtmlAgilityPack.HtmlNode>(); j++)
                {
                    var    td     = tds.ElementAt <HtmlAgilityPack.HtmlNode>(j);
                    string td_val = td.InnerHtml;
                    td_val = td_val.TrimStart().TrimEnd();

                    //コメント列
                    if (col_num == 4)
                    {
                        td_val = TextUtil.br_decode(td_val);
                        td_val = TextUtil.tag_decode(td_val);
                    }
                    //それ以外
                    else
                    {
                        td_val = TextUtil.tag_decode(td_val);
                        td_val = TextUtil.trim_indent(td_val);
                    }
                    if (td_val == "" || td_val == null)
                    {
                        row_data.Add("");
                    }
                    else
                    {
                        row_data.Add(td_val);
                    }
                    col_num++;
                }
                data.Add(row_data);
            }
            return(data);
        }
예제 #9
0
        private List <Category> Parse(string html)
        {
            var document = new HtmlAgilityPack.HtmlDocument()
            {
                OptionFixNestedTags  = true,
                OptionAutoCloseOnEnd = true
            };

            document.LoadHtml(html);

            var categories = new List <Category>();

            var categoryNodes = document.QuerySelectorAll("td.categoriesContainer dl dt a");

            var subcategoryNodes = document.QuerySelectorAll("select#category optgroup");

            foreach (var categoryNode in categoryNodes)
            {
                var category = new Category();

                category.ID   = ParseCategoryID(categoryNode.GetAttributeValue("href", null));
                category.Name = categoryNode.InnerText;

                foreach (var subcategoryNode in subcategoryNodes.Where(x => x.GetAttributeValue("label", null) == category.Name).SelectMany(x => x.QuerySelectorAll("option")))
                {
                    var subcategory = new Category();

                    subcategory.ID   = subcategoryNode.GetAttributeValue("value", null);
                    subcategory.Name = subcategoryNode.NextSibling.InnerText;

                    category.Subcategories.Add(subcategory);
                }

                categories.Add(category);
            }

            return(categories);
        }
 public override object StoreData(string year, TempThread tempThred, MALData malData)
 {
     try {
         string search = malData.engName.Replace("-", " ");
         List <AnimeParadiseData> data = new List <AnimeParadiseData>();
         string searchQry = "https://animeparadise.cc/search.php?query=" + search;
         string d         = DownloadString(searchQry, referer: (IsNewApi ? "https://animeparadise.cc/" : "https://animeparadise.cc/index.php"));
         if (d == "")
         {
             return(null);
         }
         var doc = new HtmlAgilityPack.HtmlDocument();
         doc.LoadHtml(d);
         var nodes = doc.QuerySelectorAll("div.content > p");
         foreach (var item in nodes)
         {
             var _data = item.QuerySelector("strong > a");
             int.TryParse(_data.GetAttributeValue("href", "").Split('=')[1], out int id);
             bool   isDub  = item.QuerySelector("span").InnerText == "DUB";
             string name   = _data.InnerText;
             int    season = 1;
             for (int i = 2; i < 10; i++)
             {
                 if (item.InnerText.Contains($"(Season {i})"))
                 {
                     season = i;
                     break;
                 }
             }
             if (id != 0)
             {
                 data.Add(new AnimeParadiseData()
                 {
                     isDub   = isDub,
                     name    = name,
                     id      = id,
                     season  = season,
                     referer = searchQry,
                 });
             }
         }
         return(data);
     }
     catch (Exception _ex) {
         error(_ex);
         return(null);
     }
 }
예제 #11
0
        private GetTorrentsResponse Parse(string html)
        {
            var document = new HtmlAgilityPack.HtmlDocument()
            {
                OptionFixNestedTags  = true,
                OptionAutoCloseOnEnd = true
            };

            document.LoadHtml(html);

            var response = new GetTorrentsResponse();

            var nodes = document.QuerySelectorAll("table#searchResult tr");

            foreach (var node in nodes)
            {
                var torrent = new Torrent();

                torrent.CategoryID    = GetValue(categoryIDRegex, "categoryID", node.QuerySelector("td.vertTh center a:nth-child(1)")?.Attributes["href"]?.Value);
                torrent.SubcategoryID = GetValue(categoryIDRegex, "categoryID", node.QuerySelector("td.vertTh center a:nth-child(3)")?.Attributes["href"]?.Value);
                torrent.Category      = node.QuerySelector("td.vertTh center a:nth-child(1)")?.InnerText;
                torrent.Subcategory   = node.QuerySelector("td.vertTh center a:nth-child(3)")?.InnerText;
                torrent.Name          = node.QuerySelector("a.detLink")?.InnerText;
                torrent.TorrentID     = GetValue(torrentIDRegex, "torrentID", node.QuerySelector("a.detLink")?.Attributes["href"]?.Value);
                torrent.Seeders       = int.Parse(node.QuerySelector("td:nth-child(3)")?.InnerText ?? "0");
                torrent.Leechers      = int.Parse(node.QuerySelector("td:nth-child(4)")?.InnerText ?? "0");

                var description = node.QuerySelector("font.detDesc")?.InnerText;

                if (!string.IsNullOrEmpty(description))
                {
                    var items = description.Split(',').Select(x => x.Trim());

                    torrent.Uploaded = items.Where(x => x.StartsWith("Uploaded ")).Select(x => x.Replace("Uploaded ", string.Empty).Trim()).FirstOrDefault();
                    torrent.Size     = items.Where(x => x.StartsWith("Size ")).Select(x => x.Replace("Size ", string.Empty).Trim()).FirstOrDefault();
                    torrent.Uploader = items.Where(x => x.StartsWith("ULed by ")).Select(x => x.Replace("ULed by ", string.Empty).Trim()).FirstOrDefault();
                }

                if (!string.IsNullOrEmpty(torrent.TorrentID))
                {
                    response.Torrents.Add(torrent);
                }
            }

            return(response);
        }
예제 #12
0
        protected static string GetWikipediaDescription(string url)
        {
            var    doc      = new HtmlAgilityPack.HtmlDocument();
            var    request  = WebRequest.Create(url);
            var    response = (HttpWebResponse)request.GetResponse();
            string html;

            using (var sr = new StreamReader(response.GetResponseStream()))
            {
                html = sr.ReadToEnd();
            }
            doc.LoadHtml(html);

            var firstParagraph = "";

            if (url.Contains("#"))
            {
                var fragment   = url.Split('#')[1];
                var anchorNode = doc.GetElementbyId(fragment);
                if (anchorNode != null)
                {
                    firstParagraph = anchorNode.ParentNode.NextSiblingElement().InnerText;
                }
            }
            else
            {
                firstParagraph = doc.QuerySelectorAll("div.mw-parser-output > p:not(.mw-empty-elt)").Where(s => !s.InnerText.Trim().ToLower().StartsWith("coordinates")).FirstOrDefault().InnerText;
            }

            firstParagraph = HttpUtility.HtmlDecode(firstParagraph);
            //Strip out links / citations
            firstParagraph = Regex.Replace(firstParagraph, @"\[(\d*|\w?)\]", "");
            firstParagraph = firstParagraph.Replace("[citation needed]", "");
            firstParagraph = firstParagraph.Replace("[better source needed]", "");
            firstParagraph = firstParagraph.Replace("[update]", "");
            firstParagraph = firstParagraph.Replace("\n", "");

            return(Ellipsis(firstParagraph, 400));
        }
예제 #13
0
        public override void LoadLink(string episodeLink, int episode, int normalEpisode, TempThread tempThred, object extraData, bool isDub)
        {
            string request = episodeLink.Replace(NineAnimeSite + "/watch/", "") + "/"; // /xrrj358";
            string url     = NineAnimeSite + "/watch/" + request;
            string d       = DownloadString(url);
            string key     = core.GetMcloudKey(url);

            string dataTs = FindHTML(d, "data-ts=\"", "\"");
            string _id    = FindHTML(request, ".", "/");
            // string _endId = FindHTML(request + "|||", "/", "|||");
            string _under = rng.Next(100, 999).ToString();
            // print(_id + "|" + _endId);

            string requestServer  = $"{NineAnimeSite}/ajax/film/servers?id={_id}&ts={dataTs}&_={_under}"; // &episode={_endId}
            string serverResponse = DownloadString(requestServer).Replace("\\", "").Replace("  ", "");
            //   print(serverResponse);
            string real = FindHTML(serverResponse, "{\"html\":\"", "\"}");

            // real = real.Substring(0, real.Length - 2);
            print(real);

            var doc = new HtmlAgilityPack.HtmlDocument();

            doc.LoadHtml(real);
            var data = doc.QuerySelectorAll("div.server");

            List <NineAnimeEpisodeData> Streamtape = new List <NineAnimeEpisodeData>();
            List <NineAnimeEpisodeData> Mp4upload  = new List <NineAnimeEpisodeData>();
            List <NineAnimeEpisodeData> MyCloud    = new List <NineAnimeEpisodeData>();
            const string myCloudId    = "28";
            const string streamtapeId = "40";
            const string mp4uploadId  = "35";

            foreach (var subData in data)
            {
                string name = subData.GetAttributeValue("ndata-id", "");

                foreach (var selectors in subData.QuerySelectorAll("ul > li > a"))
                {
                    string subId     = selectors.GetAttributeValue("ndata-id", "");
                    string subEp     = selectors.GetAttributeValue("ndata-base", "");
                    string href      = selectors.GetAttributeValue("nnhref", "");
                    int    realEp    = int.Parse(selectors.InnerText);
                    var    storeData = new NineAnimeEpisodeData()
                    {
                        ep   = realEp,
                        href = href,
                        id   = subId,
                    };

                    if (name == myCloudId)
                    {
                        MyCloud.Add(storeData);
                    }
                    else if (name == streamtapeId)
                    {
                        Streamtape.Add(storeData);
                    }
                    else if (name == mp4uploadId)
                    {
                        Mp4upload.Add(storeData);
                    }
                }
            }

            try {
                string target = core.GetTarget(Mp4upload[normalEpisode].id, key, dataTs, NineAnimeSite, url);
                AddMp4(FindHTML(target, "embed-", "."), normalEpisode, tempThred);
            }
            catch (Exception) {
            }

            try {
                core.AddStreamTape(Streamtape[normalEpisode].id, key, dataTs, NineAnimeSite, normalEpisode, url);
            }
            catch (Exception) {
            }

            try {
                core.AddMCloud(MyCloud[normalEpisode].id, key, dataTs, NineAnimeSite, normalEpisode, url);
            }
            catch (Exception) {
            }
        }
        public override NonBloatSeasonData GetSeasonData(MALSeason ms, TempThread tempThread, string year, object storedData)
        {
            try {
                List <FourAnimeQuickSearchItem> data = (List <FourAnimeQuickSearchItem>)storedData;
                NonBloatSeasonData setData           = new NonBloatSeasonData()
                {
                    dubEpisodes = new List <string>(), subEpisodes = new List <string>()
                };
                foreach (var subData in data)
                {
                    var _title = ToLowerAndReplace(subData.title);
                    if ((ms.Year == -1 || (subData.year == ms.Year.ToString())) && (
                            _title == ToLowerAndReplace(ms.engName) ||
                            _title == ToLowerAndReplace(ms.name) ||
                            ms.synonyms.Select(t => ToLowerAndReplace(t)).Contains(_title)))                       // CHECK

                    {
                        string url = subData.href;
                        string d   = DownloadString(url, tempThread);
                        if (!d.IsClean())
                        {
                            continue;
                        }

                        bool isSub = d.Contains("/language/subbed");                         // There is some dubbed anime

                        if ((isSub && !setData.SubExists) || (!isSub && !setData.DubExists)) // To prevent duplicates, first result if often right
                        {
                            try {
                                var doc = new HtmlAgilityPack.HtmlDocument();
                                doc.LoadHtml(d);
                                var episodes = doc.QuerySelectorAll("ul.episodes.range.active > li > a");
                                List <FourAnimeEpisode> localEpisodes = new List <FourAnimeEpisode>();

                                foreach (var f in episodes)                                   // This is to really make sure no offset happends, if for some reason some episode is misson
                                {
                                    int.TryParse(f.InnerText, out int ep);
                                    if (ep > 0)
                                    {
                                        localEpisodes.Add(new FourAnimeEpisode()
                                        {
                                            episode = ep,
                                            href    = f.GetAttributeValue("href", "")
                                        });
                                    }
                                }

                                if (localEpisodes.Count == 0)
                                {
                                    continue;
                                }
                                int maxEp = localEpisodes.OrderBy(t => - t.episode).First().episode;
                                var list  = new string[maxEp].ToList();
                                foreach (var item in localEpisodes)
                                {
                                    list[item.episode - 1] = item.href;
                                }

                                if (isSub)
                                {
                                    setData.subEpisodes = list;
                                }
                                else
                                {
                                    setData.dubEpisodes = list;
                                }
                            }
                            catch (Exception _ex) {
                                error(_ex);
                            }
                        }
                    }
                }
                return(setData);
            }
            catch (Exception _ex) {
                error("Fatal Ex in 4Anime Getseason: " + _ex);
                return(new NonBloatSeasonData());
            }
        }