Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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();
                    }
                }
            }
        }
Ejemplo n.º 3
0
        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();
            }
        }
Ejemplo n.º 4
0
        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;
            }
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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;
        }