Inheritance: IChapterRecord
Esempio n. 1
0
        public DownloadViewModel(IDownloader downloader, ChapterRecord chapter)
            : base()
        {
            if (downloader == null)
                throw new ArgumentNullException("downloader");
            if (chapter == null)
                throw new ArgumentNullException("chapter");

            _downloader = downloader;
            _chapter = chapter;

            // register downloader events
            _downloader.DownloadProgress += _downloader_DownloadProgress;
            _downloader.DownloadCompleted += _downloader_DownloadCompleted;

            _cancelDownloadCommand = new CancelDownloadCommand(this);
            _removeDownloadCommand = new RemoveDownloadCommand(this);
            _openDownloadCommand = new OpenDownloadCommand(this);

            State = DownloadState.Ok;
            Completed = false;
            CancelText = ButtonCancelText;
        }
Esempio n. 2
0
        private IDictionary<int, string> GetPages(ChapterRecord chapter)
        {
            IDictionary<int, string> pages = new Dictionary<int, string>();

            var document = WebHelper.GetHtmlDocument(chapter.Url);
            var chapterPages = document.SelectNodes(@"//select[@id=""pageMenu""]/option");
            if (chapterPages == null)
            {
                throw new ParserException("Could not find expected elements on website.", document.InnerHtml);
            }

            foreach (var pageLink in chapterPages)
            {
                int pageNumber = 0;

                Int32.TryParse(pageLink.InnerText, out pageNumber);

                if (pages.ContainsKey(pageNumber))  // if page is already in dictionary use random number instead
                    pageNumber = Random;

                pages.Add(pageNumber, GetFullUrl(pageLink.Attributes["value"].Value));
            }

            return pages;
        }
Esempio n. 3
0
        private IDictionary<int, string> GetPages(ChapterRecord chapter)
        {
            IDictionary<int, string> pages = new Dictionary<int, string>();

            var document = WebHelper.GetHtmlDocument(chapter.Url);
            var chapterPages = document.SelectNodes(@"//div[@id=""controls""]/a");
            if (chapterPages == null)
            {
                throw new ParserException("Could not find expected elements on website.", document.InnerHtml);
            }

            foreach (var pageLink in chapterPages)
            {
                if (pageLink.InnerText.IndexOf("prev", StringComparison.InvariantCultureIgnoreCase) != -1)
                    continue;
                if (pageLink.InnerText.IndexOf("next", StringComparison.InvariantCultureIgnoreCase) != -1)
                    continue;

                int pageNumber = 0;

                Int32.TryParse(pageLink.InnerText, out pageNumber);

                if (pages.ContainsKey(pageNumber))  // if page is already in dictionary use random number instead
                    pageNumber = Random;

                pages.Add(pageNumber, GetFullUrl(pageLink.Attributes.FirstOrDefault(a => a.Name == "href").Value));
            }

            return pages;
        }
Esempio n. 4
0
        private IDictionary<int, string> GetPages(ChapterRecord chapter)
        {
            IDictionary<int, string> pages = new Dictionary<int, string>();

            var document = WebHelper.GetHtmlDocument(chapter.Url);

            var scriptNode = document.SelectSingleNode(@"//div[@id=""image_frame""]/following-sibling::script");
            if (scriptNode == null)
            {
                throw new ParserException("Could not find expected elements on website.", document.InnerHtml);
            }

            var scriptText = scriptNode.InnerText;

            int page = 1;

            foreach (Match match in _pagesRegex.Matches(scriptText))
            {
                pages.Add(page, GetFullUrl(match.Groups[1].Captures[0].Value));

                page++;
            }

            return pages;
        }
Esempio n. 5
0
        private IDictionary<int, string> GetPages(ChapterRecord chapter)
        {
            IDictionary<int, string> pages = new Dictionary<int, string>();

            var document = WebHelper.GetHtmlDocument(chapter.Url);
            var chapterPages = document.SelectNodes(@"(//div[contains(@class, ""tbtitle"") and contains(@class, ""dropdown_right"")]/ul[@class=""dropdown""])/li/a");
            if (chapterPages == null)
            {
                throw new ParserException("Could not find expected elements on website.", document.InnerHtml);
            }

            foreach (var pageLink in chapterPages)
            {
                int pageNumber = 0;

                if (!Int32.TryParse(Regex.Match(pageLink.InnerText, @"\d+").Value, out pageNumber))
                    _log.Error("Unable to parse page number '" + pageLink.InnerText + "'");

                if (pages.ContainsKey(pageNumber))  // if page is already in dictionary use random number instead
                    pageNumber = Random;

                pages.Add(pageNumber, GetFullUrl(pageLink.Attributes["href"].Value));
            }

            return pages;
        }
Esempio n. 6
0
        private string GetNameForSave(ChapterRecord chapter)
        {
            string fileName = String.Format("{0} - {1}", chapter.MangaName, chapter.ChapterName).Replace(" ", "_");

            return _invalidPathCharsRegex.Replace(fileName, "");
        }
Esempio n. 7
0
        private IDictionary<int, string> GetPages(ChapterRecord chapter)
        {
            IDictionary<int, string> pages = new Dictionary<int, string>();

            var document = WebHelper.GetHtmlDocument(chapter.Url);

            var commentsLink = document.SelectSingleNode(@"//a[@id=""comments""]");
            if (commentsLink == null)
            {
                throw new ParserException("Could not find expected elements on website.", document.InnerHtml);
            }

            var link = commentsLink.Attributes["href"].Value;

            var chapterPages = document.SelectNodes(@"//select[@class=""m""][1]/option");
            if (chapterPages == null)
            {
                throw new ParserException("Could not find expected elements on website.", document.InnerHtml);
            }

            foreach (var pageLink in chapterPages)
            {
                int pageNumber = 0;

                if (!Int32.TryParse(pageLink.InnerText, out pageNumber))
                    continue;

                if (pages.ContainsKey(pageNumber)) // if page is already in dictionary then skip adding it
                    continue;

                pages.Add(pageNumber, link + pageNumber + ".html");
            }

            return pages;
        }
Esempio n. 8
0
        public virtual void DownloadChapterAsync(ISemaphore semaphore, ChapterRecord chapter, FileInfo file)
        {
            if (_backgroundWorker.IsBusy)
                throw new InvalidOperationException("Download is currently in progress.");

            if (semaphore == null)
                throw new ArgumentNullException("semaphore");
            if (chapter == null)
                throw new ArgumentNullException("chapter");
            if (file == null)
                throw new ArgumentNullException("file");

            var workerParams = new WorkerParams()
                    {
                        Chapter = chapter,
                        IsFile = true,
                        File = file,
                        Semaphore = semaphore
                    };

            _backgroundWorker.RunWorkerAsync(workerParams);
        }
Esempio n. 9
0
        private void DownloadChapter(BackgroundWorker backgroundWorker, DoWorkEventArgs e, ChapterRecord chapter, DirectoryInfo directory, bool createDir = true)
        {
            if (createDir && !directory.Exists)
            {
                directory.Create();
            }

            AddTask();
            backgroundWorker.ReportProgress(GetPercentComplete(), "Resolving list of pages.");

            var pages = _pageResolver(chapter);

            AddTask(pages.Count);

            TaskDone();
            backgroundWorker.ReportProgress(GetPercentComplete(), String.Format("List of pages resolved, chapter has {0} pages.", pages.Count));

            int current = 1;

            foreach (var page in pages)
            {

                if (backgroundWorker.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

                backgroundWorker.ReportProgress(GetPercentComplete(), String.Format("Downloading page {0} from {1}", current, pages.Count));

                string imgUrl = _imageFinder(page.Value);
                string filePath = GetUniqueFileName(directory.FullName, page.Key, Path.GetExtension(imgUrl));

                try
                {
                    WebHelper.DownloadImage(imgUrl, filePath);
                }
                catch (Exception ex)
                {
                    _log.Error("Unable to download image from url: '" + imgUrl + "' to '" + filePath + "'", ex);
                }

                current++;
                TaskDone();
            }

            backgroundWorker.ReportProgress(GetPercentComplete(), "All pages downloaded.");
        }
Esempio n. 10
0
        private void DownloadChapter(BackgroundWorker backgroundWorker, DoWorkEventArgs e, ChapterRecord chapter, FileInfo file)
        {
            // add task -> zip file
            AddTask();

            var directory = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()));
            try
            {
                DownloadChapter(backgroundWorker, e, chapter, directory);

                backgroundWorker.ReportProgress(GetPercentComplete(), "Compressing chapter to output file");

                if (backgroundWorker.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

                using (var zip = new ZipFile())
                {
                    zip.AddDirectory(directory.FullName, null);
                    zip.Save(file.FullName);
                }

                TaskDone();
                backgroundWorker.ReportProgress(GetPercentComplete(), "Download completed");
            }
            finally
            {
                // remove temp dir
                directory.Delete(true);
            }
        }
Esempio n. 11
0
        public virtual void DownloadChapterAsync(ISemaphore semaphore, ChapterRecord chapter, DirectoryInfo directory, bool createDir = true)
        {
            if (_backgroundWorker.IsBusy)
                throw new InvalidOperationException("Download is currently in progress.");

            if (semaphore == null)
                throw new ArgumentNullException("semaphore");
            if (chapter == null)
                throw new ArgumentNullException("chapter");
            if (directory == null)
                throw new ArgumentNullException("directory");
            if (!createDir && !directory.Exists)
                throw new ArgumentException("Specified directory does not exists.", "directory");

            var workerParams = new WorkerParams()
                    {
                        Chapter = chapter,
                        IsFile = false,
                        Directory = directory,
                        CreateDirectory = createDir,
                        Semaphore = semaphore
                    };

            _backgroundWorker.RunWorkerAsync(workerParams);
        }