Рефакторинг, плюс небольшие изменения - подготовка к использованию внешних конвертеров

This commit is contained in:
Book Pauk
2019-02-27 19:30:04 +07:00
parent 61cfee222f
commit d3ff0edbff
6 changed files with 38 additions and 22 deletions

View File

@@ -3,9 +3,9 @@ const iconv = require('iconv-lite');
class ConvertFb2 extends ConvertBase { class ConvertFb2 extends ConvertBase {
check(data, opts) { check(data, opts) {
const {fileType} = opts; const {dataType} = opts;
return (fileType && fileType.ext == 'xml' && data.toString().indexOf('<FictionBook') >= 0); return (dataType && dataType.ext == 'xml' && data.toString().indexOf('<FictionBook') >= 0);
} }
run(data, opts) { run(data, opts) {

View File

@@ -4,9 +4,9 @@ const textUtils = require('./textUtils');
class ConvertHtml extends ConvertBase { class ConvertHtml extends ConvertBase {
check(data, opts) { check(data, opts) {
const {fileType} = opts; const {dataType} = opts;
if (fileType && (fileType.ext == 'html' || fileType.ext == 'xml')) if (dataType && (dataType.ext == 'html' || dataType.ext == 'xml'))
return {isText: false}; return {isText: false};
//может это чистый текст? //может это чистый текст?

View File

@@ -6,12 +6,13 @@ const ConvertBase = require('./ConvertBase');
class ConvertSamlib extends ConvertBase { class ConvertSamlib extends ConvertBase {
check(data, opts) { check(data, opts) {
const {url} = opts; const {url, dataType} = opts;
const parsedUrl = new URL(url); const parsedUrl = new URL(url);
if (parsedUrl.hostname == 'samlib.ru' || if (dataType && dataType.ext == 'html' &&
(parsedUrl.hostname == 'samlib.ru' ||
parsedUrl.hostname == 'budclub.ru' || parsedUrl.hostname == 'budclub.ru' ||
parsedUrl.hostname == 'zhurnal.lib.ru') { parsedUrl.hostname == 'zhurnal.lib.ru')) {
return {hostname: parsedUrl.hostname}; return {hostname: parsedUrl.hostname};
} }

View File

@@ -19,13 +19,13 @@ class BookConverter {
} }
} }
async convertToFb2(inputFile, outputFile, url, callback) { async convertToFb2(inputFiles, outputFile, url, callback) {
const fileType = await this.detector.detectFile(inputFile); const selectedFileType = await this.detector.detectFile(inputFiles.selectedFile);
const data = await fs.readFile(inputFile); const data = await fs.readFile(inputFiles.selectedFile);
let result = false; let result = false;
for (const convert of this.convertFactory) { for (const convert of this.convertFactory) {
result = convert.run(data, {inputFile, url, callback, fileType}); result = convert.run(data, {inputFiles, url, callback, dataType: selectedFileType});
if (result) { if (result) {
await fs.writeFile(outputFile, result); await fs.writeFile(outputFile, result);
break; break;
@@ -33,8 +33,8 @@ class BookConverter {
} }
if (!result) { if (!result) {
if (fileType) if (selectedFileType)
throw new Error(`Этот формат файла не поддерживается: ${fileType.mime}`); throw new Error(`Этот формат файла не поддерживается: ${selectedFileType.mime}`);
else { else {
throw new Error(`Не удалось определить формат файла: ${url}`); throw new Error(`Не удалось определить формат файла: ${url}`);
} }

View File

@@ -17,8 +17,16 @@ class FileDecompressor {
async decompressFile(filename, outputDir) { async decompressFile(filename, outputDir) {
const fileType = await this.detector.detectFile(filename); const fileType = await this.detector.detectFile(filename);
if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz')) let result = {
return filename; sourceFile: filename,
selectedFile: filename,
fileType: fileType,
fileList: []
};
if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz')) {
return result;
}
//дурной decompress, поэтому в 2 этапа //дурной decompress, поэтому в 2 этапа
//этап 1 //этап 1
@@ -44,20 +52,26 @@ class FileDecompressor {
} }
} }
let result = filename; let sel = filename;
let fileList = [];
let max = 0; let max = 0;
if (files.length) { if (files.length) {
//ищем файл с максимальным размером //ищем файл с максимальным размером
for (let file of files) { for (let file of files) {
const path = `${outputDir}/${file.path}`;
fileList.push(path);
if (file.data.length > max) { if (file.data.length > max) {
result = `${outputDir}/${file.path}`; sel = path;
max = file.data.length; max = file.data.length;
} }
} }
} }
//дурной decompress //дурной decompress
if (result != filename) if (sel != filename)
await fs.chmod(result, 0o664); await fs.chmod(sel, 0o664);
result.selectedFile = sel;
result.fileList = fileList;
return result; return result;
} }

View File

@@ -63,13 +63,13 @@ class ReaderWorker {
//decompress //decompress
wState.set({state: 'decompress', step: 2, progress: 0}); wState.set({state: 'decompress', step: 2, progress: 0});
decompDir = `${this.config.tempDownloadDir}/${decompDirname}`; decompDir = `${this.config.tempDownloadDir}/${decompDirname}`;
const decompFilename = await this.decomp.decompressFile(downloadedFilename, decompDir); const decompFiles = await this.decomp.decompressFile(downloadedFilename, decompDir);
wState.set({progress: 100}); wState.set({progress: 100});
//конвертирование в fb2 //конвертирование в fb2
wState.set({state: 'convert', step: 3, progress: 0}); wState.set({state: 'convert', step: 3, progress: 0});
convertFilename = `${this.config.tempDownloadDir}/${tempFilename2}`; convertFilename = `${this.config.tempDownloadDir}/${tempFilename2}`;
await this.bookConverter.convertToFb2(decompFilename, convertFilename, url, progress => { await this.bookConverter.convertToFb2(decompFiles, convertFilename, url, progress => {
wState.set({progress}); wState.set({progress});
}); });
@@ -83,8 +83,9 @@ class ReaderWorker {
wState.finish({path: `/tmp/${finishFilename}`}); wState.finish({path: `/tmp/${finishFilename}`});
} catch (e) { } catch (e) {
if (this.config.branch == 'development')
console.error(e);
wState.set({state: 'error', error: (errMes ? errMes : e.message)}); wState.set({state: 'error', error: (errMes ? errMes : e.message)});
} finally { } finally {
//clean //clean
if (decompDir) if (decompDir)