Рефакторинг, плюс небольшие изменения - подготовка к использованию внешних конвертеров
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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};
|
||||||
|
|
||||||
//может это чистый текст?
|
//может это чистый текст?
|
||||||
|
|||||||
@@ -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};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user