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"); }
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);
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>()); } }
#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); }
//レポート詳細ページから検査結果データを生成 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); }
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); } }
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); }
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)); }
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()); } }