From 97ebe239da6fe2b9d710558ba0bd8581e9a6a86f Mon Sep 17 00:00:00 2001 From: Roel van Uden Date: Mon, 12 Jun 2017 20:53:36 +0200 Subject: [PATCH] Pipe errors into stderr and continue to the next series upon error. --- mangarack-runnable-cli/src/app.ts | 49 ++++++----------- .../src/services/downloadService.ts | 53 ++++++++++++------- 2 files changed, 49 insertions(+), 53 deletions(-) diff --git a/mangarack-runnable-cli/src/app.ts b/mangarack-runnable-cli/src/app.ts index 8cd2b79..baec43d 100644 --- a/mangarack-runnable-cli/src/app.ts +++ b/mangarack-runnable-cli/src/app.ts @@ -8,7 +8,7 @@ let queue = Promise.resolve(); (function(): void { let args = process.argv.splice(2); populateStore(args); - if (!hasAnySeries(args)) { + if (args.every(x => !isValid(x))) { readline.createInterface({ input: process.stdin, output: process.stdout, @@ -21,28 +21,18 @@ let queue = Promise.resolve(); } })(); -/** - * Kills the process. - * @param error The error. - */ -function die(error: any): void { - console.log(error.stack || error); - process.exit(1); -} - /** * Promises to download the items. * @param items The items. * @return The promise to download the items. */ async function downloadAsync(items: string[]): Promise { - for (let item of items) { + for (let item of items.filter(isValid)) { try { - mio.openProvider(item); - } catch (e) { - continue; + await mio.downloadService.seriesAsync(item); + } catch (error) { + console.error(error.stack || error); } - await mio.downloadService.seriesAsync(item); } } @@ -52,30 +42,23 @@ async function downloadAsync(items: string[]): Promise { */ function enqueue(items: string[]): void { queue = queue.then(async () => { - try { - populateStore(items); - await downloadAsync(items); - } catch (e) { - die(e); - } + populateStore(items); + await downloadAsync(items); }); } /** - * Determines if the collection of items contain a series. - * @param items The items. - * @return Indicates if the collection of items contain a series. + * Determines if the item contains a series. + * @param item The item. + * @return Indicates if the item contains a series. */ -function hasAnySeries(items: string[]): boolean { - for (let item of items) { - try { - mio.openProvider(item); - return true; - } catch (e) { - continue; - } +function isValid(item: string): boolean { + try { + mio.openProvider(item); + return true; + } catch (error) { + return false; } - return false; } /** diff --git a/mangarack-runnable-cli/src/services/downloadService.ts b/mangarack-runnable-cli/src/services/downloadService.ts index c67424b..183ee95 100644 --- a/mangarack-runnable-cli/src/services/downloadService.ts +++ b/mangarack-runnable-cli/src/services/downloadService.ts @@ -17,13 +17,18 @@ export let downloadService: mio.IDownloadService = { let chapterName = getChapterName(series, chapter); let chapterPath = getChapterPath(series, chapter); if (chapterName && chapterPath) { + let beginTime = Date.now(); let chapterExists = await mio.promise(callback => fs.exists(chapterPath!, exists => callback(undefined, exists))); if (!chapterExists) { - console.log(`Fetching ${chapterName}`); - let beginTime = Date.now(); - let pages = await chapter.pagesAsync(); - await downloadService.pagesAsync(provider, series, seriesPreviewImage, chapter, pages); - console.log(`Finished ${chapterName} ${prettyElapsedTime(beginTime)}`); + try { + console.log(`Fetching ${chapterName}`); + let pages = await chapter.pagesAsync(); + await downloadService.pagesAsync(provider, series, seriesPreviewImage, chapter, pages); + console.log(`Finished ${chapterName} ${prettyElapsedTime(beginTime)}`); + } catch (error) { + console.log(`Canceled ${chapterName} ${prettyElapsedTime(beginTime)}`); + throw error; + } } } }, @@ -41,18 +46,21 @@ export let downloadService: mio.IDownloadService = { let chapterPath = getChapterPath(series, chapter); if (chapterPath) { let zip = mio.zipService.create(chapterPath); - for (let page of pages) { - let image = await page.imageAsync(); - let processedImage = await mio.imageService.processAsync(provider, image); - if (processedImage) { - await zip.writeAsync(`${format(3, page.number)}.${mio.helperService.getImageExtension(processedImage)}`, processedImage); - } else { - throw new Error(`Invalid processed page #${page.number}`); + try { + for (let page of pages) { + let image = await page.imageAsync(); + let processedImage = await mio.imageService.processAsync(provider, image); + if (processedImage) { + await zip.writeAsync(`${format(3, page.number)}.${mio.helperService.getImageExtension(processedImage)}`, processedImage); + } else { + throw new Error(`Invalid processed page #${page.number}`); + } } + await zip.writeAsync(`000.${mio.helperService.getImageExtension(seriesPreviewImage)}`, seriesPreviewImage); + await zip.writeAsync('ComicInfo.xml', mio.metaService.createXml(series, chapter, pages)); + } finally { + await zip.commitAsync(); } - await zip.writeAsync(`000.${mio.helperService.getImageExtension(seriesPreviewImage)}`, seriesPreviewImage); - await zip.writeAsync('ComicInfo.xml', mio.metaService.createXml(series, chapter, pages)); - await zip.commitAsync(); } }, @@ -66,12 +74,17 @@ export let downloadService: mio.IDownloadService = { let provider = mio.openProvider(address); let series = await provider.seriesAsync(address); let seriesPreviewImage = await series.imageAsync(); - console.log(`Fetching ${series.title}`); - for (let chapter of series.chapters) { - await downloadService.chapterAsync(provider, series, seriesPreviewImage, chapter); + try { + console.log(`Fetching ${series.title}`); + for (let chapter of series.chapters) { + await downloadService.chapterAsync(provider, series, seriesPreviewImage, chapter); + } + await cleanAsync(series); + console.log(`Finished ${series.title} ${prettyElapsedTime(beginTime)}`); + } catch (error) { + console.log(`Canceled ${series.title} ${prettyElapsedTime(beginTime)}`); + throw error; } - await cleanAsync(series); - console.log(`Finished ${series.title} ${prettyElapsedTime(beginTime)}`); } };