private string Rename(PageNamingStrategy a_pns, string a_name) { Debug.Assert((a_pns != PageNamingStrategy.IndexToPreserveOrder) || (a_pns != PageNamingStrategy.PrefixToPreserverOrder)); string index = Index.ToString(); if (DownloadManager.Instance.MangaSettings.PadPageNamesWithZeros) { index = index.PadLeft(Chapter.Pages.Count.ToString().Length, '0'); } if (a_pns == PageNamingStrategy.AlwaysUseIndex) { return(index); } else if (a_pns == PageNamingStrategy.AlwaysUsePrefix) { return(String.Format("{0} - {1}", index, Name)); } else { return(a_name); } }
internal void DownloadAndSavePageImage(PageNamingStrategy a_pns) { new DirectoryInfo(Chapter.GetDirectory()).Create(); FileInfo temp_file = new FileInfo(Path.GetTempFileName()); try { using (FileStream file_stream = new FileStream(temp_file.FullName, FileMode.Create)) { MemoryStream ms; try { ms = GetImageStream(); } catch (Exception ex1) { Loggers.MangaCrawler.Error("Exception #1", ex1); throw; } try { try { System.Drawing.Image.FromStream(ms).Dispose(); ms.Position = 0; } catch (Exception ex2) { Loggers.MangaCrawler.Error("Exception #2", ex2); throw; } ms.CopyTo(file_stream); ms.Position = 0; byte[] hash; TomanuExtensions.Utils.Hash.CalculateSHA256(ms, out hash); Hash = hash; } finally { ms.Dispose(); } } string file_name = Rename(a_pns, Name); ImageFilePath = Path.Combine( Chapter.GetDirectory(), FileUtils.RemoveInvalidFileCharacters( Path.GetFileNameWithoutExtension(file_name) + Crawler.GetImageURLExtension(ImageURL).ToLower())); FileInfo image_file = new FileInfo(ImageFilePath); if (image_file.Exists) { image_file.Delete(); } temp_file.MoveTo(image_file.FullName); State = PageState.Downloaded; } finally { if (temp_file.Exists) { if (temp_file.FullName != ImageFilePath) { temp_file.Delete(); } } } }
internal void DownloadAndSavePageImage(PageNamingStrategy pageNamingStrategy) { new DirectoryInfo(Chapter.GetDirectory()).Create(); var tempFile = new FileInfo(Path.GetTempFileName()); try { using (var fileStream = new FileStream(tempFile.FullName, FileMode.Create)) { MemoryStream ms; try { ms = GetImageStream(); } catch (Exception ex1) { Loggers.MangaCrawler.Error("Exception #1", ex1); throw; } try { try { System.Drawing.Image.FromStream(ms).Dispose(); ms.Position = 0; } catch (Exception ex2) { Loggers.MangaCrawler.Error("Exception #2", ex2); throw; } ms.CopyTo(fileStream); ms.Position = 0; byte[] hash; TomanuExtensions.Utils.Hash.CalculateSHA256(ms, out hash); Hash = hash; } finally { ms.Dispose(); } } var fileName = Rename(pageNamingStrategy, Name); ImageFilePath = Path.Combine( Chapter.GetDirectory(), FileUtils.RemoveInvalidFileCharacters( Path.GetFileNameWithoutExtension(fileName) + Crawler.GetImageURLExtension(ImageURL).ToLower())); var imageFile = new FileInfo(ImageFilePath); if (imageFile.Exists) imageFile.Delete(); tempFile.MoveTo(imageFile.FullName); State = PageState.Downloaded; } finally { if (tempFile.Exists) if (tempFile.FullName != ImageFilePath) tempFile.Delete(); } }
private string Rename(PageNamingStrategy pageNamingStrategy, string name) { Debug.Assert((pageNamingStrategy != PageNamingStrategy.IndexToPreserveOrder) || (pageNamingStrategy != PageNamingStrategy.PrefixToPreserverOrder)); var index = Index.ToString(); if (DownloadManager.Instance.MangaSettings.PadPageNamesWithZeros) index = index.PadLeft(Chapter.Pages.Count.ToString().Length, '0'); switch (pageNamingStrategy) { case PageNamingStrategy.AlwaysUseIndex: return index; case PageNamingStrategy.AlwaysUsePrefix: return $"{index} - {Name}"; default: return name; } }
internal void DownloadPagesAndImages() { try { Limiter.BeginChapter(this); try { DownloadPagesList(); var names = Pages.Select(p => p.Name); var sorted_names = Pages.Select(p => p.Name).OrderBy(n => n, new NaturalOrderStringComparer()); bool error = false; PageNamingStrategy pns = DownloadManager.Instance.MangaSettings.PageNamingStrategy; if (pns == PageNamingStrategy.IndexToPreserveOrder) { if (!names.SequenceEqual(sorted_names)) { pns = PageNamingStrategy.AlwaysUseIndex; } } else if (pns == PageNamingStrategy.PrefixToPreserverOrder) { if (!names.SequenceEqual(sorted_names)) { pns = PageNamingStrategy.AlwaysUsePrefix; } } for (int i = 0; i < Pages.Count; i++) { Pages[i].LimiterOrder = Catalog.NextID(); Debug.Assert(Pages[i].Index == i + 1); } Parallel.ForEach(new SequentialPartitioner <Page>(Pages), new ParallelOptions() { MaxDegreeOfParallelism = Crawler.MaxConnectionsPerServer }, (page, state) => { try { page.DownloadAndSavePageImage(pns); Catalog.Save(this); } catch (OperationCanceledException) { state.Break(); } catch (Exception ex2) { Loggers.MangaCrawler.Error(String.Format( "Exception #1, chapter: {0} state: {1}", this, State), ex2); error = true; } } ); Token.ThrowIfCancellationRequested(); if (PagesDownloaded != Pages.Count) { State = ChapterState.Error; } else if (Pages.Any(p => p.State != PageState.Downloaded)) { State = ChapterState.Error; } else if (error) { State = ChapterState.Error; } Catalog.Save(this); if (DownloadManager.Instance.MangaSettings.UseCBZ) { if (State != ChapterState.Error) { CreateCBZ(); } } Visited = true; } finally { Limiter.EndChapter(this); } } catch (OperationCanceledException) { Debug.Assert(State == ChapterState.Cancelling); Debug.Assert(m_cancellation_token_source.IsCancellationRequested); State = ChapterState.Cancelled; } catch (Exception ex1) { Loggers.MangaCrawler.Error(String.Format( "Exception #2, chapter: {0} state: {1}", this, State), ex1); State = ChapterState.Error; try { DownloadManager.Instance.DownloadChapters(Serie, true); } catch (Exception ex2) { Loggers.MangaCrawler.Error(String.Format( "Exception #3, chapter: {0} state: {1}", this, State), ex2); } } finally { lock (m_state_lock) { if ((State != ChapterState.Error) && (State != ChapterState.Cancelled)) { Debug.Assert( (State == ChapterState.DownloadingPages) || (State == ChapterState.Zipping)); State = ChapterState.Downloaded; } } } Catalog.Save(this); }
private string Rename(PageNamingStrategy a_pns, string a_name) { Debug.Assert((a_pns != PageNamingStrategy.IndexToPreserveOrder) || (a_pns != PageNamingStrategy.PrefixToPreserverOrder)); string index = Index.ToString(); if (DownloadManager.Instance.MangaSettings.PadPageNamesWithZeros) index = index.PadLeft(Chapter.Pages.Count.ToString().Length, '0'); if (a_pns == PageNamingStrategy.AlwaysUseIndex) return index; else if (a_pns == PageNamingStrategy.AlwaysUsePrefix) return String.Format("{0} - {1}", index, Name); else return a_name; }