public static NijieImage ParseImagePopUp(NijieImage image, HtmlDocument doc) { var bigImage = doc.DocumentNode.SelectSingleNode("//div[starts-with(@id,'diff_')]//img"); if (bigImage.Attributes.Contains("data-original")) image.BigImageUrl = Nandaka.Common.Util.FixUrl(bigImage.Attributes["data-original"].Value, ROOT_DOMAIN); else image.BigImageUrl = Nandaka.Common.Util.FixUrl(bigImage.Attributes["src"].Value, ROOT_DOMAIN); if (image.IsManga) { image.ImageUrls.Clear(); //image.ImageUrls.Add(image.BigImageUrl); var images = doc.DocumentNode.SelectNodes("//div[starts-with(@id,'diff_')]//img"); foreach (var item in images) { if (item.Attributes["class"].Value == "filter") continue; if (item.Attributes.Contains("data-original")) image.ImageUrls.Add(Nandaka.Common.Util.FixUrl(item.Attributes["data-original"].Value, ROOT_DOMAIN)); else image.ImageUrls.Add(Nandaka.Common.Util.FixUrl(item.Attributes["src"].Value, ROOT_DOMAIN)); } } return image; }
public NijieImage ParseImage(NijieImage image, NijieMember member = null) { HtmlDocument doc = null; try { canOperate(); var result = getPage(image.ViewUrl); PrintCookie("Image Page " + image.ImageId); doc = result.Item1; if (Util.IsRedirected(result.Item2.ResponseUri.ToString(), image.ViewUrl, true)) { Log.Debug(String.Format("Redirection for Image {0}: {1} ==> {2}, possibly locked.", image.ImageId, image.ViewUrl, result.Item2.ResponseUri)); image.IsFriendOnly = true; return image; } return ParseImage(image, ref member, doc); } catch (NijieException) { throw; } catch (Exception ex) { if (doc != null) { var filename = "Dump for Image " + image.ImageId + ".html"; Log.Debug("Dumping image page to: " + filename); doc.Save(filename); } throw new NijieException(String.Format("Error when processing image: {0} ==> {1}", image.ImageId, ex.Message), ex, NijieException.IMAGE_UNKNOWN_ERROR); } }
public NijieImage ParseImage(int imageId, string referer = null) { if (string.IsNullOrWhiteSpace(referer)) { referer = Util.FixUrl(NijieConstants.NIJIE_INDEXx, ROOT_DOMAIN, Properties.Settings.Default.UseHttps); } canOperate(); NijieImage image = new NijieImage(imageId); image.Referer = referer; return ParseImage(image); }
private NijieImage ParseImagePopups(NijieImage image) { HtmlDocument doc = null; try { canOperate(); var url = "http://nijie.info/view_popup.php?id=" + image.ImageId; var result = getPage(url); doc = result.Item1; return ParseImagePopUp(image, doc); } catch (Exception ex) { if (doc != null) { var filename = "Dump for Big Image " + image.ImageId + ".html"; Log.Debug("Dumping big image page to: " + filename); doc.Save(filename); } Log.Error("Failed to process big image: " + image.ImageId, ex); throw new NijieException(String.Format("Failed to process big image: {0} ==> {1}", image.ImageId, ex.Message), ex, NijieException.IMAGE_BIG_PARSE_ERROR); } }
private void ParseImageLinks(NijieImage image, HtmlDocument doc) { var mediumImageLink = doc.DocumentNode.SelectSingleNode("//div[@id='gallery_open']//img[@class='mozamoza ngtag']"); if (mediumImageLink != null) image.MediumImageUrl = mediumImageLink.Attributes["src"].Value; var bigImageLinks = doc.DocumentNode.SelectNodes("//div[@id='gallery_open']//a"); if (bigImageLinks != null) { image.BigImageUrl = bigImageLinks[0].Attributes["href"].Value; if (bigImageLinks.Count > 1) { image.IsManga = true; image.ImageUrls = new List<string>(); image.MangaPages = new List<NijieMangaInfo>(); int p = 1; foreach (var bigImage in bigImageLinks) { image.ImageUrls.Add(bigImage.Attributes["href"].Value); var page = new NijieMangaInfo(); page.Image = image; page.ImageId = image.ImageId; page.Page = p++; page.ImageUrl = bigImage.Attributes["href"].Value; image.MangaPages.Add(page); } } else { image.IsManga = false; } } // check if image urls is using popups if (image.BigImageUrl.Contains("view_popup.php")) { image = ParseImagePopups(image); } }
private void ParseImageExtras(NijieImage image, HtmlDocument doc) { var goodDiv = doc.DocumentNode.SelectSingleNode("//li[@id='good_cnt']"); if (goodDiv != null) { int good = -1; Int32.TryParse(goodDiv.InnerText, out good); image.GoodCount = good; } var nuitaDiv = doc.DocumentNode.SelectSingleNode("//li[@id='nuita_cnt']"); if (nuitaDiv != null) { int nuita = -1; Int32.TryParse(nuitaDiv.InnerText, out nuita); image.NuitaCount = nuita; } }
/// <summary> /// Parse image list from member. /// </summary> /// <param name="html"></param> /// <param name="referer"></param> /// <returns></returns> private List<NijieImage> ParseImageList(string html, string referer) { HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); var images = doc.DocumentNode.SelectNodes("//div[@class='nijie']"); // parse images var list = new List<NijieImage>(); if (images != null) { foreach (var imageDiv in images) { var imageId = imageDiv.SelectSingleNode("//div[@class='nijie']//a").Attributes["href"].Value; var res = re_image.Match(imageId); if (res.Success) { NijieImage image = new NijieImage(Int32.Parse(res.Groups[1].Value)); image.Referer = referer; var div = new HtmlDocument(); div.LoadHtml(imageDiv.SelectSingleNode("//div[@class='nijie']").InnerHtml); var link = div.DocumentNode.SelectSingleNode("//a"); image.Title = link.Attributes["title"].Value; var thumb = div.DocumentNode.SelectSingleNode("//a/img"); image.ThumbImageUrl = thumb.Attributes["src"].Value; // check if image is friend only // img src="//img.nijie.info/pic/common_icon/illust/friends.png" image.IsFriendOnly = false; if (image.ThumbImageUrl.EndsWith("friends.png")) { image.IsFriendOnly = true; } //"//img.nijie.info/pic/common_icon/illust/golden.png" image.IsGoldenMember = false; if (image.ThumbImageUrl.EndsWith("golden.png")) { image.IsGoldenMember = true; } // check manga icon image.IsManga = false; var icon = div.DocumentNode.SelectSingleNode("//div[@class='thumbnail-icon']/img"); if (icon != null) { if (icon.Attributes["src"].Value.EndsWith("thumbnail_comic.png")) image.IsManga = true; } // check animation icon image.IsAnimated = false; var animeIcon = div.DocumentNode.SelectSingleNode("//div[@class='thumbnail-icon']/img"); if (animeIcon != null) { if (animeIcon.Attributes["src"].Value.EndsWith("thumbnail_anime.png")) image.IsAnimated = true; } list.Add(image); } imageDiv.Remove(); } } using (var ctx = new NijieContext()) { foreach (var item in list) { var r = (from x in ctx.Images where x.ImageId == item.ImageId select x).FirstOrDefault(); if (r != null && !String.IsNullOrWhiteSpace(r.SavedFilename)) item.IsDownloaded = true; else item.IsDownloaded = false; } } return list; }
private void ProcessDoujin(NijieImage image, HtmlDocument doc) { image.IsDoujin = true; // member id var memberDivs = doc.DocumentNode.SelectNodes("//div[@id='dojin_left']//p[@class='text']//a"); foreach (var item in memberDivs) { var href = item.Attributes["href"].Value; if (href.Contains("/members.php?id=")) { var split = href.Split('='); image.Member = new NijieMember(Int32.Parse(split[1]), MemberMode.Doujin); break; } } // parse doujin title var doujinTitleDiv = doc.DocumentNode.SelectSingleNode("//div[@id='dojin_header']//h2[@class='title']"); image.Title = doujinTitleDiv.InnerText; // parse description var doujinDescription = doc.DocumentNode.SelectSingleNode("//p[@itemprop='description']"); image.Description = doujinTitleDiv.InnerText; // created date var doujinCreated = doc.DocumentNode.SelectSingleNode("//div[@id='dojin_left']//span"); image.WorkDate = DateTime.ParseExact(doujinCreated.InnerText, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); // main image var mainImage = doc.DocumentNode.SelectSingleNode("//div[@id='dojin_left']//p[@class='image']/a/img"); image.MediumImageUrl = mainImage.Attributes["src"].Value; var bigImage = doc.DocumentNode.SelectSingleNode("//div[@id='dojin_left']//p[@class='image']/a"); image.BigImageUrl = bigImage.Attributes["href"].Value; // tags var tags = doc.DocumentNode.SelectNodes("//ul[@id='tag']//span[@class='tag_name']/a"); if (tags != null) { image.Tags = new List<NijieTag>(); foreach (var item in tags) { if (!String.IsNullOrWhiteSpace(item.InnerText)) image.Tags.Add(new NijieTag() { Name = item.InnerText }); } } // pages image.IsManga = true; image.ImageUrls = new List<string>(); image.MangaPages = new List<NijieMangaInfo>(); int p = 1; image.ImageUrls.Add(image.BigImageUrl); var page = new NijieMangaInfo(); page.Image = image; page.ImageId = image.ImageId; page.Page = p++; page.ImageUrl = image.BigImageUrl; image.MangaPages.Add(page); var subImages = doc.DocumentNode.SelectNodes("//div[@id='gallery_new']//ul[@id='thumbnail']//a"); if (subImages != null && subImages.Count > 0) { foreach (var item in subImages) { image.ImageUrls.Add(item.Attributes["href"].Value); page = new NijieMangaInfo(); page.Image = image; page.ImageId = image.ImageId; page.Page = p++; page.ImageUrl = item.Attributes["href"].Value; image.MangaPages.Add(page); } } }
/// <summary> /// Parse the image page /// - Illustration /// - Manga /// </summary> /// <param name="job"></param> /// <param name="memberPage"></param> /// <param name="imageTemp"></param> private void processImage(JobDownloadViewModel job, NijieMember memberPage, NijieImage imageTemp) { if (isJobCancelled(job)) return; MainWindow.Log.Debug("Processing Image:" + imageTemp.ImageId); // skip if exists in DB if (Properties.Settings.Default.SkipIfExistsInDB && !NijieDownloader.Library.Properties.Settings.Default.Overwrite) { using (var dao = new NijieContext()) { var result = NijieImage.IsDownloadedInDB(imageTemp.ImageId); if (result) { job.Message = String.Format("Image {0} already downloaded in DB", imageTemp.ImageId); job.SkipCount++; return; } } } var image = MainWindow.Bot.ParseImage(imageTemp, memberPage); if (image.IsFriendOnly) { // sample: 74587 job.Message = "Image locked!"; return; } if (image.IsGoldenMember) { job.Message = "Image only for Gold Membership"; return; } if (image.IsManga) { processManga(job, image); } else { processIllustration(job, image); } }
private void processIllustration(JobDownloadViewModel job, NijieImage image) { if (isJobCancelled(job)) return; job.PauseEvent.WaitOne(Timeout.Infinite); var filename = MainWindow.makeFilename(job, image, type: MainWindow.FilenameFormatType.Image); job.Message = "Downloading: " + image.BigImageUrl; filename = filename + "." + Util.ParseExtension(image.BigImageUrl); filename = Properties.Settings.Default.RootDirectory + Path.DirectorySeparatorChar + Util.SanitizeFilename(filename); var result = downloadUrl(job, image.BigImageUrl, image.ViewUrl, filename); image.SavedFilename = filename; image.ServerFilename = Util.ExtractFilenameFromUrl(image.BigImageUrl); if (result == NijieException.OK) { image.Filesize = new FileInfo(filename).Length; if (Properties.Settings.Default.SaveDB) SaveImageToDB(job, image); if (Properties.Settings.Default.DumpDownloadedImagesToTextFile) Util.WriteTextFile(filename + Environment.NewLine); job.DownloadCount++; } else if (result == NijieException.DOWNLOAD_SKIPPED) { image.Filesize = new FileInfo(filename).Length; if (Properties.Settings.Default.SaveDB) SaveImageToDB(job, image); job.SkipCount++; } }
/// <summary> /// Process individual image. /// </summary> /// <param name="job"></param> private void doImageJob(JobDownloadViewModel job) { if (isJobCancelled(job)) return; MainWindow.Log.Debug("Running Image Job: " + job.Name); try { NijieImage image = new NijieImage(job.ImageId); processImage(job, null, image); } catch (NijieException ne) { HandleJobException(job, ne); MainWindow.Log.Error("Error when processing Image Job: " + job.Name, ne); } }
/// <summary> /// Create Filename based on format on job and image information. /// </summary> /// <param name="job"></param> /// <param name="image"></param> /// <param name="currPage"></param> /// <returns></returns> public static string makeFilename(JobDownloadViewModel job, NijieImage image, int currPage = 0, FilenameFormatType type = FilenameFormatType.Image) { try { string filenameFormat = null; switch (type) { case FilenameFormatType.Image: filenameFormat = job.SaveFilenameFormat; break; case FilenameFormatType.Manga: filenameFormat = job.SaveMangaFilenameFormat; break; case FilenameFormatType.Avatar: filenameFormat = job.SaveAvatarFilenameFormat; break; } if (string.IsNullOrWhiteSpace(filenameFormat)) throw new NijieException("Empty filename format!", NijieException.INVALID_SAVE_FILENAME_FORMAT); if (image.Member != null) { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_ID, image.Member.MemberId.ToString()); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_NAME, image.Member.UserName); } else { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_ID, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MEMBER_NAME, ""); Log.Warn("No Member Information"); } if (job.JobType == JobType.Tags) { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SEARCH_TAGS, job.SearchTag); } else { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SEARCH_TAGS, ""); } if (type != FilenameFormatType.Avatar) { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_ID, image.ImageId.ToString()); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_TITLE, image.Title); if (image.IsManga) { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE, "_p" + (currPage + 1).ToString()); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE_ZERO, "_p" + currPage.ToString()); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MAX_PAGE, " of " + image.ImageUrls.Count); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SERVER_FILENAME, Util.ExtractFilenameFromUrl(image.ImageUrls[currPage])); } else { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE_ZERO, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MAX_PAGE, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SERVER_FILENAME, Util.ExtractFilenameFromUrl(image.BigImageUrl)); } if (image.Tags != null || image.Tags.Count > 0) filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_TAGS, String.Join(" ", image.Tags)); else filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_TAGS, ""); } else { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_ID, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_IMAGE_TITLE, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_PAGE_ZERO, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_MAX_PAGE, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_SERVER_FILENAME, Util.ExtractFilenameFromUrl(image.Member.AvatarUrl)); } if (image.BookmarkedBy != null) { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_ID, image.BookmarkedBy.MemberId.ToString()); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_NAME, image.BookmarkedBy.UserName); } else { filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_ID, ""); filenameFormat = filenameFormat.Replace(FILENAME_FORMAT_BOOKMARKED_MEMBER_NAME, ""); } return filenameFormat; } catch (Exception ex) { Log.Error("filenameFormat=" + job.SaveFilenameFormat, ex); throw new NijieException("Failed when renaming", ex, NijieException.RENAME_ERROR); } }
public void TestImageParserMethod() { NijieMember nullMember = null; var nijie = Nijie.GetInstance(); { var page = UpdateHtmlForm.PATH + "image-normal.html"; Assert.IsTrue(File.Exists(page), "Test file is missing!"); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(File.ReadAllText(page)); var image = new NijieImage(UpdateHtmlForm.IMAGE); var result = nijie.ParseImage(image, ref nullMember, doc); Assert.IsTrue(image.ImageId > 0, "Image Id not valid"); Assert.IsFalse(image.IsManga, "Image is not big image"); Assert.IsNotNull(image.BigImageUrl, "Big image url is missing!"); } { var page = UpdateHtmlForm.PATH + "image-manga.html"; var ppage = UpdateHtmlForm.PATH + "image-manga-popup.html"; Assert.IsTrue(File.Exists(page), "Test file is missing!"); Assert.IsTrue(File.Exists(ppage), "Test file is missing!"); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(File.ReadAllText(page)); HtmlDocument pdoc = new HtmlDocument(); pdoc.LoadHtml(File.ReadAllText(ppage)); var image = new NijieImage(UpdateHtmlForm.MANGA); var result = nijie.ParseImage(image, ref nullMember, doc); Assert.IsTrue(image.ImageId > 0, "Image Id not valid"); Assert.IsTrue(image.IsManga, "Image is not manga"); Assert.AreEqual(5, image.MangaPages.Count, "Manga pages count are different!"); Nijie.ParseImagePopUp(image, pdoc); Assert.AreEqual(5, image.ImageUrls.Count, "Manga image urls count are different!"); foreach (var item in image.MangaPages) { Assert.IsNotNull(item.ImageUrl, "Image url is missing!"); } } { var page = UpdateHtmlForm.PATH + "image-manga-filter.html"; var ppage = UpdateHtmlForm.PATH + "image-manga-popup-filter.html"; Assert.IsTrue(File.Exists(page), "Test file is missing!"); Assert.IsTrue(File.Exists(ppage), "Test file is missing!"); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(File.ReadAllText(page)); HtmlDocument pdoc = new HtmlDocument(); pdoc.LoadHtml(File.ReadAllText(ppage)); var image = new NijieImage(UpdateHtmlForm.MANGA2); var result = nijie.ParseImage(image, ref nullMember, doc); Assert.IsTrue(image.ImageId > 0, "Image Id not valid"); Assert.IsTrue(image.IsManga, "Image is not manga"); Assert.AreEqual(4, image.MangaPages.Count, "Manga pages count are different!"); Nijie.ParseImagePopUp(image, pdoc); Assert.AreEqual(4, image.ImageUrls.Count, "Manga image urls count are different!"); foreach (var item in image.MangaPages) { Assert.IsNotNull(item.ImageUrl, "Image url is missing!"); } } { var page = UpdateHtmlForm.PATH + "image-doujin.html"; var ppage = UpdateHtmlForm.PATH + "image-doujin-popup.html"; Assert.IsTrue(File.Exists(page), "Test file is missing!"); Assert.IsTrue(File.Exists(ppage), "Test file is missing!"); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(File.ReadAllText(page)); HtmlDocument pdoc = new HtmlDocument(); pdoc.LoadHtml(File.ReadAllText(ppage)); var image = new NijieImage(UpdateHtmlForm.DOUJIN); var result = nijie.ParseImage(image, ref nullMember, doc); Assert.IsTrue(image.ImageId > 0, "Image Id not valid"); Assert.IsTrue(image.IsDoujin, "Image is not doujin"); Assert.AreEqual(6, image.MangaPages.Count, "Doujin pages count are different!"); Nijie.ParseImagePopUp(image, pdoc); Assert.AreEqual(6, image.ImageUrls.Count, "Doujin image urls count are different!"); foreach (var item in image.MangaPages) { Assert.IsNotNull(item.ImageUrl, "Image url is missing!"); } } }
/// <summary> /// Used in Search and Member page. /// </summary> /// <param name="image"></param> public NijieImageViewModel(NijieImage image) { _image = image; this.ImageId = image.ImageId; }
public void GetImage() { MainWindow.Log.Debug("Loading Image: " + this.ImageId); NijieImage temp = null; using (var ctx = new NijieContext()) { temp = (from x in ctx.Images.Include("Member").Include("Tags") where x.ImageId == this.ImageId && x.IsManga == false select x).FirstOrDefault(); if (temp != null && !String.IsNullOrWhiteSpace(temp.SavedFilename)) { temp.IsDownloaded = true; } } if (temp == null) { try { var result = MainWindow.Bot.ParseImage(this.ImageId); temp = result; this.Message = "Image parsed, loading image..."; } catch (NijieException ne) { this.Message = "Error: " + ne.Message; this.ImageStatus = ImageLoader.IMAGE_ERROR; this.BigImage = ViewModelHelper.Error; MainWindow.Log.Error(ne.Message, ne.InnerException); } } this._image = temp; this._mangaImageStatus = new List<string>(); }
private void ParseImageTags(NijieImage image, HtmlDocument doc) { var tagsDiv = doc.DocumentNode.SelectSingleNode("//div[@id='view-tag']"); if (tagsDiv != null) { image.Tags = new List<NijieTag>(); var tagNames = doc.DocumentNode.SelectNodes("//div[@id='view-tag']//span[@class='tag_name']"); if (tagNames != null) { foreach (var tag in tagNames) { image.Tags.Add(new NijieTag() { Name = tag.InnerText }); } } } }
private void ParseImageTitleAndDescription(NijieImage image, HtmlDocument doc) { // title var titleDiv = doc.DocumentNode.SelectSingleNode("//div[@id='view-left']/p"); if (titleDiv != null) image.Title = titleDiv.InnerText; if (String.IsNullOrWhiteSpace(image.Title)) { var titleDiv2 = doc.DocumentNode.SelectSingleNode("//div[@id='view-left']/h2"); if (titleDiv2 != null) image.Title = titleDiv2.InnerText; } // description and date var descDiv = doc.DocumentNode.SelectSingleNode("//div[@id='view-honbun']"); if (descDiv != null) { var ps = descDiv.SelectNodes("//div[@id='view-honbun']/p"); if (ps != null && ps.Count > 1) { var dateStr = ps[0].InnerText; var dateCheck = re_date.Match(dateStr); if (dateCheck.Success) { var tempDate = DateTime.ParseExact(dateCheck.Groups[1].Value, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); if (tempDate != DateTime.MinValue) { image.WorkDate = tempDate; } Log.Debug("Works Date: " + dateStr + " ==>" + image.WorkDate.ToString("yyyy-MM-dd HH:mm:ss")); } else { Log.Warn("Failed to parse Date: " + ps[0].InnerText); } image.Description = ps[1].InnerText; } } else { Log.Warn("Failed to get image description and works date."); } }
private void processManga(JobDownloadViewModel job, NijieImage image) { var downloaded = -1; MainWindow.Log.Debug("Processing Manga Images:" + image.ImageId); string lastFilename = "", lastUrl = ""; for (int i = 0; i < image.ImageUrls.Count; ++i) { downloaded = -1; if (isJobCancelled(job)) return; job.PauseEvent.WaitOne(Timeout.Infinite); var filename = MainWindow.makeFilename(job, image, i, MainWindow.FilenameFormatType.Manga); job.Message = "Downloading: " + image.ImageUrls[i]; var pagefilename = filename; if (!(job.SaveFilenameFormat.Contains(MainWindow.FILENAME_FORMAT_PAGE) || job.SaveFilenameFormat.Contains(MainWindow.FILENAME_FORMAT_PAGE_ZERO))) { pagefilename += "_p" + i; } pagefilename += "." + Util.ParseExtension(image.ImageUrls[i]); pagefilename = Properties.Settings.Default.RootDirectory + Path.DirectorySeparatorChar + Util.SanitizeFilename(pagefilename); var pages = image.MangaPages as List<NijieMangaInfo>; downloaded = downloadUrl(job, image.ImageUrls[i], image.Referer, pagefilename); pages[i].SavedFilename = pagefilename; pages[i].ServerFilename = Util.ExtractFilenameFromUrl(image.ImageUrls[i]); if (downloaded == NijieException.OK) { pages[i].Filesize = new FileInfo(pagefilename).Length; if (Properties.Settings.Default.DumpDownloadedImagesToTextFile) Util.WriteTextFile(pagefilename + Environment.NewLine); } lastFilename = pagefilename; lastUrl = image.ImageUrls[i]; } image.SavedFilename = lastFilename; image.ServerFilename = Util.ExtractFilenameFromUrl(lastUrl); if (downloaded == NijieException.OK) { image.Filesize = new FileInfo(lastFilename).Length; if (Properties.Settings.Default.SaveDB) SaveImageToDB(job, image); job.DownloadCount++; } else if (downloaded == NijieException.DOWNLOAD_SKIPPED) { image.Filesize = new FileInfo(lastFilename).Length; if (Properties.Settings.Default.SaveDB) SaveImageToDB(job, image); job.SkipCount++; } }
private void SaveImageToDB(JobDownloadViewModel job, NijieImage image) { try { lock (_dbLock) { using (var dao = new NijieContext()) { if (Properties.Settings.Default.TraceDB) { dao.Database.Log = MainWindow.Log.Debug; } image.SaveToDb(dao); } } } catch (Exception ex) { MainWindow.Log.Error("Failed to save to DB: " + image.ImageId, ex); job.Message += ex.Message; } }
public Tuple<List<NijieImage>, bool> ParseMyImageBookmark(int page) { canOperate(); List<NijieImage> images = new List<NijieImage>(); HtmlDocument doc = null; bool isNextPageAvailable = false; try { var url = Util.FixUrl(String.Format("//nijie.info/okiniiri.php?p={0}", page), ROOT_DOMAIN, Properties.Settings.Default.UseHttps); var result = getPage(url); doc = result.Item1; var imagesDiv = doc.DocumentNode.SelectNodes("//div[@class='nijie-bookmark']"); if (imagesDiv != null) { foreach (var imageDivx in imagesDiv) { var tmp = imageDivx.InnerHtml; HtmlDocument imageDiv = new HtmlDocument(); imageDiv.LoadHtml(tmp); var imageUrl = imageDiv.DocumentNode.SelectSingleNode("//a").Attributes["href"].Value; var res = re_image.Match(imageUrl); if (res.Success) { var image = new NijieImage(Int32.Parse(res.Groups[1].Value)); image.Title = imageDiv.DocumentNode.SelectSingleNode("//p[@class='title']").InnerText; image.ThumbImageUrl = imageDiv.DocumentNode.SelectSingleNode("//p[@class='nijiedao']//img").Attributes["src"].Value; // check if image is friend only // img src="//img.nijie.info/pic/common_icon/illust/friends.png" image.IsFriendOnly = false; if (image.ThumbImageUrl.EndsWith("friends.png")) { image.IsFriendOnly = true; } //"//img.nijie.info/pic/common_icon/illust/golden.png" image.IsGoldenMember = false; if (image.ThumbImageUrl.EndsWith("golden.png")) { image.IsGoldenMember = true; } // check manga icon image.IsManga = false; var icon = imageDiv.DocumentNode.SelectSingleNode("//div[@class='thumbnail-icon']/img"); if (icon != null) { if (icon.Attributes["src"].Value.EndsWith("thumbnail_comic.png")) image.IsManga = true; } // check animation icon image.IsAnimated = false; var animeIcon = imageDiv.DocumentNode.SelectSingleNode("//div[@class='thumbnail-anime-icon']/img"); if (animeIcon != null) { if (animeIcon.Attributes["src"].Value.EndsWith("thumbnail_anime.png")) image.IsAnimated = true; } images.Add(image); } imageDivx.Remove(); } } var nextPageButton = doc.DocumentNode.SelectNodes("//p[@class='page_button']//a"); if (nextPageButton != null) { foreach (var item in nextPageButton) { if (item.InnerText.StartsWith("次へ")) { isNextPageAvailable = true; break; } } } } catch (Exception ex) { if (doc != null) { var filename = "Dump for My Image Bookmark.html"; Log.Debug("Dumping My Image Bookmark page to: " + filename); doc.Save(filename); } throw new NijieException(String.Format("Error when processing my image bookmark ==> {0}", ex.Message), ex, NijieException.IMAGE_UNKNOWN_ERROR); } return new Tuple<List<NijieImage>, bool>(images, isNextPageAvailable); }
public NijieImage ParseImage(NijieImage image, ref NijieMember member, HtmlDocument doc) { checkErrorMessage(doc); var doujinDiv = doc.DocumentNode.SelectSingleNode("//div[@id='dojin_header']"); if (doujinDiv != null) { ProcessDoujin(image, doc); } else { if (member == null) { member = ParseMemberFromImage(doc); } image.Member = member; ParseImageLinks(image, doc); ParseImageTitleAndDescription(image, doc); ParseImageTags(image, doc); } ParseImageExtras(image, doc); return image; }
private void ParseMemberBookmark(HtmlDocument doc, NijieMember member) { member.Images = new List<NijieImage>(); var bookmarkedImages = doc.DocumentNode.SelectNodes("//p[@class='nijiedao']"); if (bookmarkedImages == null || bookmarkedImages.Count == 0) { return; } foreach (var item in bookmarkedImages) { var div = new HtmlDocument(); div.LoadHtml(item.InnerHtml); var imageId = div.DocumentNode.SelectSingleNode("//a").Attributes["href"].Value; var res = re_image.Match(imageId); if (res.Success) { NijieImage image = new NijieImage(Int32.Parse(res.Groups[1].Value)); image.Referer = member.MemberUrl; var link = div.DocumentNode.SelectSingleNode("//a"); image.Title = link.Attributes["title"].Value; var thumb = div.DocumentNode.SelectSingleNode("//a/img"); image.ThumbImageUrl = thumb.Attributes["src"].Value; // check if image is friend only // img src="//img.nijie.info/pic/common_icon/illust/friends.png" image.IsFriendOnly = false; if (image.ThumbImageUrl.EndsWith("friends.png")) { image.IsFriendOnly = true; } //"//img.nijie.info/pic/common_icon/illust/golden.png" image.IsGoldenMember = false; if (image.ThumbImageUrl.EndsWith("golden.png")) { image.IsGoldenMember = true; } // check manga icon image.IsManga = false; var icon = div.DocumentNode.SelectSingleNode("//div[@class='thumbnail-icon']/img"); if (icon != null) { if (icon.Attributes["src"].Value.EndsWith("thumbnail_comic.png")) image.IsManga = true; } // check animation icon image.IsAnimated = false; var animeIcon = div.DocumentNode.SelectSingleNode("//div[@class='thumbnail-anime-icon']/img"); if (animeIcon != null) { if (animeIcon.Attributes["src"].Value.EndsWith("thumbnail_anime.png")) image.IsAnimated = true; } image.BookmarkedBy = member; member.Images.Add(image); } item.Remove(); } // check next page member.IsNextAvailable = false; var navButtons = doc.DocumentNode.SelectNodes("//p[@class='page_button']/a"); if (navButtons != null) { foreach (var item in navButtons) { if (item.InnerText.StartsWith("次へ")) { member.IsNextAvailable = true; break; } } } var imageCountElements = doc.DocumentNode.SelectNodes("//p[@class='mem-indent float-left']/em"); member.TotalImages = ParseTotalImageCount(imageCountElements); }