/// <summary>
        /// This method generates the cbz file from the images in the manga book.
        /// </summary>
        /// <param name="mangaBook"></param>
        /// <param name="saveLocation">Location to save the manga book cbz file.</param>
        public void Generate(MangaBook mangaBook, string saveLocation)
        {
            OperationStatus.StartedMangaBookFileCreation(mangaBook);

            Collection<string> imageSaveLocationList = new Collection<string>();

            mangaBook.SaveLocationPath = Path.Combine(saveLocation, mangaBook.FileName());
            using (ZipFile zip = new ZipFile(mangaBook.SaveLocationPath))
            {
                SavePagesAsPhysicalFiles(mangaBook, saveLocation, imageSaveLocationList);

                // Get all pages from save location and create cbz file.

                zip.AddFiles(imageSaveLocationList);
                zip.Save();

                // Delete the temporary files.

                foreach (string path in imageSaveLocationList)
                {
                    File.Delete(path);
                }
            }

            OperationStatus.CompletedMangaBookFileCreation(mangaBook);
        }
        protected override void GetPages(MangaBook mangaBook, HtmlDocument htmlDocument)
        {
            // find id="pageMenu" and traverse through options tags to get mangareader pages.

            HtmlNodeCollection selectOptionNodes = htmlDocument.DocumentNode.SelectNodes("//select[@id='pageMenu']/option");

            AddNewPagesToMangaBook(mangaBook, selectOptionNodes);
        }
 private static void SavePagesAsPhysicalFiles(MangaBook mangaBook, string saveLocation, ICollection<string> imageSaveLocationList)
 {
     foreach (MangaPage mangaPage in mangaBook.Pages)
     {
         mangaPage.SavedFilePath = Path.Combine(saveLocation, mangaPage.Filename);
         mangaPage.Image.Save(mangaPage.SavedFilePath);
         imageSaveLocationList.Add(mangaPage.SavedFilePath);
     }
 }
        protected override Uri GetFullPageUrl(HtmlNode selectOption, MangaBook mangaBook)
        {
            string selectOptionValueAttribute = selectOption.GetAttributeValue("value", "");

            string pageUrl = String.Format("{0}/{1}/{2}/{3}/{4}.html",
                mangaBook.UrlCategoryName,
                mangaBook.Title,
                mangaBook.Volume,
                mangaBook.Chapter,
                selectOptionValueAttribute);

            return String.IsNullOrEmpty(selectOptionValueAttribute) ? null : new Uri(HostUri, pageUrl);
        }
        protected override void ExtractMangaDetailsFromUrl(MangaBook mangaBook)
        {
            string url = mangaBook.Url.ToString().Replace("http://", "");
            string[] parts = url.Split('/');

            // 3 because it should be
            // 0 - www.mangareader.net
            // 1 - manga name
            // 2 - volume number.

            if (parts.Length < (int)UrlSectionsEnum.NumberOfSections) throw new InvalidOperationException(String.Format("Manga Book url is incorrect: {0}", mangaBook.Url));

            mangaBook.Title = parts[1];
            mangaBook.Volume = parts[2];
        }
        protected void AddNewPagesToMangaBook(MangaBook mangaBook, HtmlNodeCollection selectOptionNodes)
        {
            if (selectOptionNodes == null) return;

            // create new pages and add it to the mangabook.

            foreach (HtmlNode selectOption in selectOptionNodes)
            {
                int pageNumber;

                bool isNumeric = int.TryParse(selectOption.InnerText, out pageNumber);

                if (!isNumeric) continue;

                MangaPage mangaPage = new MangaPage
                {
                    PageNumber = pageNumber,
                    PageUrl = GetFullPageUrl(selectOption, mangaBook)
                };
                mangaBook.Pages.Add(mangaPage);
            }
        }
        public MangaBook GetMangaBook(Uri url)
        {
            // Get Pages from the homeUrl

            HtmlDocument htmlDocument = HtmlProcessor.GetHtmlDocument(url);
            MangaBook mangaBook = new MangaBook
            {
                HostUrl = url.Host,
                Url = url
            };
            ExtractMangaDetailsFromUrl(mangaBook);

            OperationStatus.StartedMangaBookDownload(mangaBook);

            GetPages(mangaBook, htmlDocument);

            // Traverse Page urls and get images.

            GetImagesForEachPage(mangaBook);

            OperationStatus.CompletedMangaBookDownload(mangaBook);

            return mangaBook;
        }
 protected override Uri GetFullPageUrl(HtmlNode selectOption, MangaBook mangaBook)
 {
     string selectOptionValueAttribute = selectOption.GetAttributeValue("value", "");
     return String.IsNullOrEmpty(selectOptionValueAttribute) ? null : new Uri(HostUri, selectOptionValueAttribute);
 }
 private static void ValidateMangaBookArgument(MangaBook mangabook)
 {
     if (mangabook == null)
         throw new ArgumentNullException("mangabook");
 }
 public void StartedMangaBookDownload(MangaBook mangabook)
 {
 }
 public void CompletedMangaBookFileCreation(MangaBook mangaBook)
 {
 }
 protected abstract void GetPages(MangaBook mangaBook, HtmlDocument htmlDocument);
        protected void GetImagesForEachPage(MangaBook mangaBook)
        {
            foreach (MangaPage mangaPage in mangaBook.Pages)
            {
                OperationStatus.MangaPageDownloadInProgress(mangaBook, mangaPage.PageNumber);

                // Get image from each manga page and save the image and src url into the page object.

                HtmlDocument pageHtmlDocument = HtmlProcessor.GetHtmlDocument(mangaPage.PageUrl);
                HtmlNode imageSourceHtmlNode = pageHtmlDocument.DocumentNode.SelectSingleNode(GetImageXPathExpression());

                if (imageSourceHtmlNode == null)
                    throw new InvalidOperationException("imageSource Html Node not found for page: " +
                                                        mangaPage.PageNumber);

                mangaPage.ImageUrl = new Uri(imageSourceHtmlNode.GetAttributeValue("src", ""));
                mangaPage.Image = HtmlProcessor.DownloadImageFromUrl(mangaPage.ImageUrl.ToString());
                mangaPage.Initialise(mangaBook.Title);
            }
        }
 protected abstract Uri GetFullPageUrl(HtmlNode selectOption, MangaBook mangaBook);
 protected abstract void ExtractMangaDetailsFromUrl(MangaBook mangaBook);
 public void CompletedMangaBookDownload(MangaBook mangabook)
 {
 }
 public void MangaPageDownloadInProgress(MangaBook mangaBook, int pageNumber)
 {
     ValidateMangaBookArgument(mangaBook);
     StatusStrip.Text = String.Format("Downloading manga book: [{0}], page: [{1}]", mangaBook.Title, pageNumber);
 }
 public void MangaPageDownloadInProgress(MangaBook mangabook, int pageNumber)
 {
 }
 public void StartedMangaBookDownload(MangaBook mangaBook)
 {
     ValidateMangaBookArgument(mangaBook);
     StatusStrip.Text = String.Format("Starting download of manga book: [{0}]", mangaBook.Title);
 }
 public void StartedMangaBookFileCreation(MangaBook mangaBook)
 {
 }
 public void StartedMangaBookFileCreation(MangaBook mangaBook)
 {
     ValidateMangaBookArgument(mangaBook);
     StatusStrip.Text = String.Format("Started creation of manga book: [{0}]", mangaBook.Title);
 }