UNPKG

moebius

Version:

Command-Line tool to find and download comics (As well as NodeJS module)

171 lines (164 loc) 5.04 kB
'use strict'; let EventEmitter = require('events').EventEmitter; let pathToLib = '../'; let fs = require(pathToLib + 'helper').libraries.fs; let connector = require(pathToLib + 'connector/mangaEden'); let chapterLib = require('./chapter'); const extend = require('deep-extend'); let steps = [ 'Create Directory', 'Load mangas', 'Load manga infos', 'Download chapters', ]; let eventsDefinition = module.exports.events = { start: 'start', close: 'close', progress: 'progress', chapter: { start: 'start-chapter', close: 'close-chapter', progress: 'progress-chapter', image: { downloading: 'image-downloading', downloaded: 'image-downloaded', }, }, }; module.exports.download = function download(title, path, poolSize) { let emitter = new EventEmitter(); return { events: emitter, start: function start(useCache) { return new Promise(function start(resolve, reject) { let directory = path + '/' + title + '/'; let step = 0; let manga; emitter.emit(eventsDefinition.start, { directory: directory, manga: { title: title, }, step: { number: step, total: steps.length, next: steps[step], }, }); fs.mkdir(directory) .then(function listManga() { step += 1; emitter.emit(eventsDefinition.progress, { directory: directory, manga: { title: title, }, step: { number: step, total: steps.length, done: steps[step - 1], next: steps[step], }, }); return connector.loadMangas(useCache); }).then(function onListed(mangas) { manga = mangas.find(function findManga(manga) { return title === manga.title; }); step += 1; emitter.emit(eventsDefinition.progress, { manga: manga, step: { number: step, total: steps.length, done: steps[step - 1], next: steps[step], }, }); return connector.loadChapters(manga.id); }).then(function onChaptersLoaded(mangaInfo) { step += 1; manga = extend(manga, mangaInfo); emitter.emit(eventsDefinition.progress, { manga: manga, step: { number: step, total: steps.length, done: steps[step - 1], next: steps[step], }, }); let promises = mangaInfo.chapters.map(function toPromise(chapter) { let downloader = chapterLib.download(chapter, directory, poolSize); manageEvents({ manga: manga, emitter: emitter, step: { number: step, total: steps.length, next: steps[step], }, }, downloader.events); return downloader.start(); }); return Promise.all(promises); }).then(function onSuccess() { emitter.emit(eventsDefinition.close, { manga: manga, step: { number: step, total: steps.length, done: steps[step], }, }); resolve(); }).catch(reject); }); }, }; }; function manageEvents(mangaOpts, events) { let chapterEventsDef = chapterLib.events; events.on(chapterEventsDef.start, function onProgress(args) { sendEvent(mangaOpts.emitter, eventsDefinition.chapter.start, { manga: mangaOpts.manga, step: mangaOpts.step, chapterEvent: args, }); }); events.on(chapterEventsDef.progress, function onProgress(args) { sendEvent(mangaOpts.emitter, eventsDefinition.chapter.progress, { manga: mangaOpts.manga, step: mangaOpts.step, chapterEvent: args, }); }); events.on(chapterEventsDef.close, function onProgress(args) { sendEvent(mangaOpts.emitter, eventsDefinition.chapter.close, { manga: mangaOpts.manga, step: mangaOpts.step, chapterEvent: args, }); }); events.on(chapterEventsDef.image.downloading, function onProgress(args) { sendEvent(mangaOpts.emitter, eventsDefinition.chapter.image.downloading, { manga: mangaOpts.manga, step: mangaOpts.step, chapterEvent: args, }); }); events.on(chapterEventsDef.image.downloaded, function onProgress(args) { sendEvent(mangaOpts.emitter, eventsDefinition.chapter.image.downloaded, { manga: mangaOpts.manga, step: mangaOpts.step, chapterEvent: args, }); }); } function sendEvent(emitter, eventDef, options) { try { emitter.emit(eventDef, options); } catch (err) { console.error(err); } }