Skip to content
This repository has been archived by the owner on May 1, 2022. It is now read-only.

Commit

Permalink
Merge pull request #71 from Deathspike/dev/cli-stderr
Browse files Browse the repository at this point in the history
Pipe errors into stderr and continue to the next series upon error.
  • Loading branch information
Roel van Uden authored Jun 12, 2017
2 parents cf77838 + 97ebe23 commit ae8f53e
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 53 deletions.
49 changes: 16 additions & 33 deletions mangarack-runnable-cli/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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<void> {
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);
}
}

Expand All @@ -52,30 +42,23 @@ async function downloadAsync(items: string[]): Promise<void> {
*/
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;
}

/**
Expand Down
53 changes: 33 additions & 20 deletions mangarack-runnable-cli/src/services/downloadService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<boolean>(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;
}
}
}
},
Expand All @@ -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();
}
},

Expand All @@ -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)}`);
}
};

Expand Down

0 comments on commit ae8f53e

Please sign in to comment.