diff --git a/server/core/BookConverter/ConvertFb2.js b/server/core/BookConverter/ConvertFb2.js index e4a84866..d9698382 100644 --- a/server/core/BookConverter/ConvertFb2.js +++ b/server/core/BookConverter/ConvertFb2.js @@ -3,9 +3,9 @@ const iconv = require('iconv-lite'); class ConvertFb2 extends ConvertBase { check(data, opts) { - const {fileType} = opts; + const {dataType} = opts; - return (fileType && fileType.ext == 'xml' && data.toString().indexOf('= 0); + return (dataType && dataType.ext == 'xml' && data.toString().indexOf('= 0); } run(data, opts) { diff --git a/server/core/BookConverter/ConvertHtml.js b/server/core/BookConverter/ConvertHtml.js index fa85937d..ed5bade8 100644 --- a/server/core/BookConverter/ConvertHtml.js +++ b/server/core/BookConverter/ConvertHtml.js @@ -4,9 +4,9 @@ const textUtils = require('./textUtils'); class ConvertHtml extends ConvertBase { 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}; //может это чистый текст? diff --git a/server/core/BookConverter/ConvertSamlib.js b/server/core/BookConverter/ConvertSamlib.js index 40ebd10b..c6e9c37e 100644 --- a/server/core/BookConverter/ConvertSamlib.js +++ b/server/core/BookConverter/ConvertSamlib.js @@ -6,12 +6,13 @@ const ConvertBase = require('./ConvertBase'); class ConvertSamlib extends ConvertBase { check(data, opts) { - const {url} = opts; + const {url, dataType} = opts; 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 == 'zhurnal.lib.ru') { + parsedUrl.hostname == 'zhurnal.lib.ru')) { return {hostname: parsedUrl.hostname}; } diff --git a/server/core/BookConverter/index.js b/server/core/BookConverter/index.js index 6b38935b..6fdb547a 100644 --- a/server/core/BookConverter/index.js +++ b/server/core/BookConverter/index.js @@ -19,13 +19,13 @@ class BookConverter { } } - async convertToFb2(inputFile, outputFile, url, callback) { - const fileType = await this.detector.detectFile(inputFile); + async convertToFb2(inputFiles, outputFile, url, callback) { + const selectedFileType = await this.detector.detectFile(inputFiles.selectedFile); - const data = await fs.readFile(inputFile); + const data = await fs.readFile(inputFiles.selectedFile); let result = false; 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) { await fs.writeFile(outputFile, result); break; @@ -33,8 +33,8 @@ class BookConverter { } if (!result) { - if (fileType) - throw new Error(`Этот формат файла не поддерживается: ${fileType.mime}`); + if (selectedFileType) + throw new Error(`Этот формат файла не поддерживается: ${selectedFileType.mime}`); else { throw new Error(`Не удалось определить формат файла: ${url}`); } diff --git a/server/core/FileDecompressor.js b/server/core/FileDecompressor.js index 46b5eafe..ffe2ef0a 100644 --- a/server/core/FileDecompressor.js +++ b/server/core/FileDecompressor.js @@ -17,8 +17,16 @@ class FileDecompressor { async decompressFile(filename, outputDir) { const fileType = await this.detector.detectFile(filename); - if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz')) - return filename; + let result = { + sourceFile: filename, + selectedFile: filename, + fileType: fileType, + fileList: [] + }; + + if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz')) { + return result; + } //дурной decompress, поэтому в 2 этапа //этап 1 @@ -44,20 +52,26 @@ class FileDecompressor { } } - let result = filename; + let sel = filename; + let fileList = []; let max = 0; if (files.length) { //ищем файл с максимальным размером for (let file of files) { + const path = `${outputDir}/${file.path}`; + fileList.push(path); if (file.data.length > max) { - result = `${outputDir}/${file.path}`; + sel = path; max = file.data.length; } } } //дурной decompress - if (result != filename) - await fs.chmod(result, 0o664); + if (sel != filename) + await fs.chmod(sel, 0o664); + + result.selectedFile = sel; + result.fileList = fileList; return result; } diff --git a/server/core/ReaderWorker.js b/server/core/ReaderWorker.js index 5692f999..ed05a93d 100644 --- a/server/core/ReaderWorker.js +++ b/server/core/ReaderWorker.js @@ -63,13 +63,13 @@ class ReaderWorker { //decompress wState.set({state: 'decompress', step: 2, progress: 0}); 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}); //конвертирование в fb2 wState.set({state: 'convert', step: 3, progress: 0}); convertFilename = `${this.config.tempDownloadDir}/${tempFilename2}`; - await this.bookConverter.convertToFb2(decompFilename, convertFilename, url, progress => { + await this.bookConverter.convertToFb2(decompFiles, convertFilename, url, progress => { wState.set({progress}); }); @@ -83,8 +83,9 @@ class ReaderWorker { wState.finish({path: `/tmp/${finishFilename}`}); } catch (e) { + if (this.config.branch == 'development') + console.error(e); wState.set({state: 'error', error: (errMes ? errMes : e.message)}); - } finally { //clean if (decompDir)