/// <summary> /// Get and parse the search page /// </summary> /// <param name="option"></param> /// <returns></returns> public NijieSearch Search(NijieSearchOption option) { HtmlDocument doc = null; try { canOperate(); if (option.Page < 1) option.Page = 1; NijieSearch search = new NijieSearch(option); var result = getPage(search.QueryUrl); if (Util.IsRedirected(result.Item2.ResponseUri.ToString(), search.QueryUrl, true)) { Log.Debug(string.Format("Different Search URL expected: {0} ==> {1}", search.QueryUrl, result.Item2.ResponseUri.ToString())); } doc = result.Item1; return ParseSearch(doc, search); } catch (NijieException) { throw; } catch (Exception ex) { if (doc != null) { var filename = string.Format("Dump for Search {0} Page {1}.html", option.Query, option.Page); Log.Debug("Dumping search page to: " + filename); doc.Save(filename); } throw new NijieException(string.Format("Error when processing search: {0} Page {1} ==> {2}", option.Query, option.Page, ex.Message), ex, NijieException.SEARCH_UNKNOWN_ERROR); } }
/// <summary> /// Parse the search page /// </summary> /// <param name="doc"></param> /// <param name="search"></param> /// <returns></returns> public NijieSearch ParseSearch(HtmlDocument doc, NijieSearch search) { var imagesDiv = doc.DocumentNode.SelectSingleNode("//div[@id='main-left-main']/div[@class='clearfix']").InnerHtml; search.Images = ParseSearchImageList(imagesDiv, search.QueryUrl); // check next page availability search.IsNextAvailable = false; // max image per search page = 48 // nijie removed the next page button, search based on paging number var topNav = doc.DocumentNode.SelectNodes("//div[@class='kabu-top']//li"); if (search.Images.Count == 48 && topNav != null) { int nextPage = search.Option.Page + 1; foreach (var pageItem in topNav) { if (pageItem.InnerText.Contains(nextPage.ToString())) { search.IsNextAvailable = true; break; } } } var imageCountElements = doc.DocumentNode.SelectNodes("//h4/em"); search.TotalImages = ParseTotalImageCount(imageCountElements); // set next page to false if no images anymore. if (search.Images.Count <= 0) search.IsNextAvailable = false; return search; }
public void TestSearchParserMethod() { var nijie = Nijie.GetInstance(); var option = new NijieSearchOption() { Matching = SearchType.PartialMatch, Query = "無修正", Sort = SortType.Latest, SearchBy = SearchMode.Tag, Page = 1 }; var search = new NijieSearch(option); { var page = UpdateHtmlForm.PATH + "search-tag-partial-latest.html"; Assert.IsTrue(File.Exists(page), "Test file is missing!"); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(File.ReadAllText(page)); var result = nijie.ParseSearch(doc, search); Assert.AreEqual(48, result.Images.Count, "Image counts differents"); foreach (var image in result.Images) { Assert.IsTrue(image.ImageId > 0, "Image Id not valid"); Assert.IsNotNull(image.ThumbImageUrl, "Thumbnail image missing!"); } Assert.IsTrue(result.IsNextAvailable, "Next Page should be available"); Assert.AreEqual(160, result.TotalImages, "Different image count"); } { var page = UpdateHtmlForm.PATH + "search-tag-exact-latest.html"; Assert.IsTrue(File.Exists(page), "Test file is missing!"); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(File.ReadAllText(page)); var result = nijie.ParseSearch(doc, search); Assert.AreEqual(48, result.Images.Count, "Image counts differents"); foreach (var image in result.Images) { Assert.IsTrue(image.ImageId > 0, "Image Id not valid"); Assert.IsNotNull(image.ThumbImageUrl, "Thumbnail image missing!"); } Assert.IsTrue(result.IsNextAvailable, "Next Page should be available"); Assert.AreEqual(88, result.TotalImages, "Different image count"); } { var page = UpdateHtmlForm.PATH + "search-tag-partial-latest-lastpage.html"; Assert.IsTrue(File.Exists(page), "Test file is missing!"); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(File.ReadAllText(page)); search.Option.Page = UpdateHtmlForm.search_tag_partial_latest_lastpage_page; var result = nijie.ParseSearch(doc, search); Assert.AreEqual(15, result.Images.Count, "Image counts differents"); foreach (var image in result.Images) { Assert.IsTrue(image.ImageId > 0, "Image Id not valid"); Assert.IsNotNull(image.ThumbImageUrl, "Thumbnail image missing!"); } Assert.IsFalse(result.IsNextAvailable, "Next Page should not be available"); Assert.AreEqual(160, result.TotalImages, "Different image count"); } }
public void DoSearch(SynchronizationContext context) { NijieSearchOption option = new NijieSearchOption(); option.Sort = Sort; option.Query = Query; option.Page = Page; option.SearchBy = SearchBy; option.Matching = Matching; try { _search = MainWindow.Bot.Search(option); Images = new ObservableCollection<NijieImageViewModel>(); foreach (var image in _search.Images) { var temp = new NijieImageViewModel(image); context.Send((x) => { Images.Add(temp); }, null); } onPropertyChanged("TotalImages"); } catch (NijieException ne) { Status = "Error: " + ne.Message; } }