/// <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); }