Начата переделка FileDecompressor - отказ от использования багнутого пакета decompress
This commit is contained in:
@@ -18,13 +18,13 @@ class ConvertDoc extends ConvertDocX {
|
||||
|
||||
const {inputFiles, callback} = opts;
|
||||
|
||||
const outFile = `${inputFiles.fileListDir}/${path.basename(inputFiles.sourceFile)}`;
|
||||
const outFile = `${inputFiles.filesDir}/${path.basename(inputFiles.sourceFile)}`;
|
||||
const docFile = `${outFile}.doc`;
|
||||
const docxFile = `${outFile}.docx`;
|
||||
const fb2File = `${outFile}.fb2`;
|
||||
|
||||
await fs.copy(inputFiles.sourceFile, docFile);
|
||||
await this.execConverter(this.sofficePath, ['--headless', '--convert-to', 'docx', '--outdir', inputFiles.fileListDir, docFile]);
|
||||
await this.execConverter(this.sofficePath, ['--headless', '--convert-to', 'docx', '--outdir', inputFiles.filesDir, docFile]);
|
||||
|
||||
return await super.convert(docxFile, fb2File, callback);
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ class ConvertDocX extends ConvertBase {
|
||||
if (this.config.useExternalBookConverter &&
|
||||
inputFiles.sourceFileType && inputFiles.sourceFileType.ext == 'zip') {
|
||||
//ищем файл '[Content_Types].xml'
|
||||
for (const file of inputFiles.fileList) {
|
||||
for (const file of inputFiles.files) {
|
||||
if (file == '[Content_Types].xml') {
|
||||
return true;
|
||||
}
|
||||
@@ -37,7 +37,7 @@ class ConvertDocX extends ConvertBase {
|
||||
|
||||
const {inputFiles, callback} = opts;
|
||||
|
||||
const outFile = `${inputFiles.fileListDir}/${path.basename(inputFiles.sourceFile)}`;
|
||||
const outFile = `${inputFiles.filesDir}/${path.basename(inputFiles.sourceFile)}`;
|
||||
const docxFile = `${outFile}.docx`;
|
||||
const fb2File = `${outFile}.fb2`;
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ class ConvertPdf extends ConvertHtml {
|
||||
|
||||
const {inputFiles, callback} = opts;
|
||||
|
||||
const outFile = `${inputFiles.fileListDir}/${utils.randomHexString(10)}.xml`;
|
||||
const outFile = `${inputFiles.filesDir}/${utils.randomHexString(10)}.xml`;
|
||||
|
||||
//конвертируем в xml
|
||||
let perc = 0;
|
||||
|
||||
@@ -18,13 +18,13 @@ class ConvertRtf extends ConvertDocX {
|
||||
|
||||
const {inputFiles, callback} = opts;
|
||||
|
||||
const outFile = `${inputFiles.fileListDir}/${path.basename(inputFiles.sourceFile)}`;
|
||||
const outFile = `${inputFiles.filesDir}/${path.basename(inputFiles.sourceFile)}`;
|
||||
const rtfFile = `${outFile}.rtf`;
|
||||
const docxFile = `${outFile}.docx`;
|
||||
const fb2File = `${outFile}.fb2`;
|
||||
|
||||
await fs.copy(inputFiles.sourceFile, rtfFile);
|
||||
await this.execConverter(this.sofficePath, ['--headless', '--convert-to', 'docx', '--outdir', inputFiles.fileListDir, rtfFile]);
|
||||
await this.execConverter(this.sofficePath, ['--headless', '--convert-to', 'docx', '--outdir', inputFiles.filesDir, rtfFile]);
|
||||
|
||||
return await super.convert(docxFile, fb2File, callback);
|
||||
}
|
||||
|
||||
@@ -3,9 +3,8 @@ const zlib = require('zlib');
|
||||
const crypto = require('crypto');
|
||||
const path = require('path');
|
||||
const utils = require('./utils');
|
||||
const decompress = require('decompress');
|
||||
const decompressGz = require('decompress-gz');
|
||||
const decompressBzip2 = require('decompress-bzip2');
|
||||
const extractZip = require('extract-zip');
|
||||
const unbzip2Stream = require('unbzip2-stream');
|
||||
|
||||
const FileDetector = require('./FileDetector');
|
||||
|
||||
@@ -14,7 +13,7 @@ class FileDecompressor {
|
||||
this.detector = new FileDetector();
|
||||
}
|
||||
|
||||
async decompressFile(filename, outputDir) {
|
||||
async decompressNested(filename, outputDir) {
|
||||
await fs.ensureDir(outputDir);
|
||||
|
||||
const fileType = await this.detector.detectFile(filename);
|
||||
@@ -23,65 +22,88 @@ class FileDecompressor {
|
||||
sourceFile: filename,
|
||||
sourceFileType: fileType,
|
||||
selectedFile: filename,
|
||||
fileListDir: outputDir,
|
||||
fileList: []
|
||||
filesDir: outputDir,
|
||||
files: []
|
||||
};
|
||||
|
||||
if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz')) {
|
||||
return result;
|
||||
}
|
||||
|
||||
//дурной decompress, поэтому в 2 этапа
|
||||
//этап 1
|
||||
let files = [];
|
||||
try {
|
||||
files = await decompress(filename, outputDir);
|
||||
} catch (e) {
|
||||
//
|
||||
}
|
||||
result.files = await this.decompressTar(fileType.ext, filename, outputDir);
|
||||
|
||||
//этап 2
|
||||
if (files.length == 0) {
|
||||
try {
|
||||
files = await decompress(filename, outputDir, {
|
||||
inputFile: filename,
|
||||
plugins: [
|
||||
decompressGz(),
|
||||
decompressBzip2({path: path.basename(filename)}),
|
||||
]
|
||||
});
|
||||
} catch (e) {
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
let sel = filename;
|
||||
let fileList = [];
|
||||
let max = 0;
|
||||
if (files.length) {
|
||||
if (result.files.length) {
|
||||
//ищем файл с максимальным размером
|
||||
for (let file of files) {
|
||||
fileList.push(file.path);
|
||||
if (file.data.length > max) {
|
||||
for (let file of result.files) {
|
||||
if (file.size > max) {
|
||||
sel = `${outputDir}/${file.path}`;
|
||||
max = file.data.length;
|
||||
max = file.size;
|
||||
}
|
||||
}
|
||||
}
|
||||
//дурной decompress
|
||||
if (sel != filename)
|
||||
await fs.chmod(sel, 0o664);
|
||||
|
||||
result.selectedFile = sel;
|
||||
result.fileList = fileList;
|
||||
|
||||
if (sel != filename) {
|
||||
result.nesting = await this.decompressFile(sel, `${outputDir}/${utils.randomHexString(10)}`);
|
||||
result.nesting = await this.decompressNested(sel, `${outputDir}/${utils.randomHexString(10)}`);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
async decompressTar(fileExt, filename, outputDir) {
|
||||
return await this.decompress(fileExt, filename, outputDir);
|
||||
}
|
||||
|
||||
async decompress(fileExt, filename, outputDir) {
|
||||
let files = [];
|
||||
|
||||
switch (fileExt) {
|
||||
case 'zip':
|
||||
files = await this.unZip(filename, outputDir);
|
||||
break;
|
||||
/*case 'bz2':
|
||||
files = await this.unBz2(filename, outputDir);
|
||||
break;
|
||||
case 'gz':
|
||||
files = await this.unGz(filename, outputDir);
|
||||
break;
|
||||
case 'tar':
|
||||
files = await this.unTar(filename, outputDir);
|
||||
break;*/
|
||||
default:
|
||||
throw new Error(`FileDecompressor: неизвестный формат файла '${fileExt}'`);
|
||||
}
|
||||
|
||||
return files;
|
||||
}
|
||||
|
||||
async unZip(filename, outputDir) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const files = [];
|
||||
extractZip(filename, {
|
||||
dir: outputDir,
|
||||
onEntry: (entry) => {
|
||||
files.push({path: entry.fileName, size: entry.uncompressedSize});
|
||||
}
|
||||
}, (err) => {
|
||||
if (err)
|
||||
reject(err);
|
||||
resolve(files);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async unBz2(filename, outputDir) {
|
||||
}
|
||||
|
||||
async unGz(filename, outputDir) {
|
||||
}
|
||||
|
||||
async unTar(filename, outputDir) {
|
||||
}
|
||||
|
||||
async gzipBuffer(buf) {
|
||||
return new Promise((resolve, reject) => {
|
||||
zlib.gzip(buf, {level: 1}, (err, result) => {
|
||||
|
||||
@@ -63,7 +63,14 @@ class ReaderWorker {
|
||||
//decompress
|
||||
wState.set({state: 'decompress', step: 2, progress: 0});
|
||||
decompDir = `${this.config.tempDownloadDir}/${decompDirname}`;
|
||||
const decompFiles = await this.decomp.decompressFile(downloadedFilename, decompDir);
|
||||
let decompFiles = {};
|
||||
try {
|
||||
decompFiles = await this.decomp.decompressNested(downloadedFilename, decompDir);
|
||||
} catch (e) {
|
||||
if (this.config.branch == 'development')
|
||||
console.error(e);
|
||||
throw new Error('Ошибка распаковки');
|
||||
}
|
||||
wState.set({progress: 100});
|
||||
|
||||
//конвертирование в fb2
|
||||
|
||||
Reference in New Issue
Block a user