Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
        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;
            }
        }
Esempio n. 7
0
        /// <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;
        }
Esempio n. 8
0
        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);
                }
            }
        }
Esempio n. 9
0
        /// <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);
            }
        }
Esempio n. 10
0
        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++;
            }
        }
Esempio n. 11
0
        /// <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);
            }
        }
Esempio n. 13
0
        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>();
        }
Esempio n. 16
0
 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 });
             }
         }
     }
 }
Esempio n. 17
0
        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.");
            }
        }
Esempio n. 18
0
        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++;
            }
        }
Esempio n. 19
0
 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;
     }
 }
Esempio n. 20
0
        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);
        }
Esempio n. 21
0
        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;
        }
Esempio n. 22
0
        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);
        }