diff --git a/server/core/BookConverter/ConvertBase.js b/server/core/BookConverter/ConvertBase.js index 460d91c3..ad2a7e9c 100644 --- a/server/core/BookConverter/ConvertBase.js +++ b/server/core/BookConverter/ConvertBase.js @@ -1,3 +1,4 @@ +const fs = require('fs-extra'); const iconv = require('iconv-lite'); const chardet = require('chardet'); const textUtils = require('./textUtils'); @@ -5,12 +6,27 @@ const textUtils = require('./textUtils'); class ConvertBase { constructor(config) { this.config = config; + + this.calibrePath = `${config.dataDir}/calibre/ebook-convert`; + this.sofficePath = '/usr/bin/soffice'; + this.pdfToHtmlPath = '/usr/bin/pdftohtml'; } - run(data, opts) {// eslint-disable-line no-unused-vars + async run(data, opts) {// eslint-disable-line no-unused-vars //override } + async checkExternalConverterPresent() { + if (!await fs.pathExists(this.calibrePath)) + throw new Error('Внешний конвертер calibre не найден'); + + if (!await fs.pathExists(this.sofficePath)) + throw new Error('Внешний конвертер LibreOffice не найден'); + + if (!await fs.pathExists(this.pdfToHtmlPath)) + throw new Error('Внешний конвертер pdftohtml не найден'); + } + decode(data) { let selected = textUtils.getEncoding(data); diff --git a/server/core/BookConverter/ConvertDocX.js b/server/core/BookConverter/ConvertDocX.js index 6449a1ed..17c693f3 100644 --- a/server/core/BookConverter/ConvertDocX.js +++ b/server/core/BookConverter/ConvertDocX.js @@ -2,16 +2,29 @@ const ConvertBase = require('./ConvertBase'); class ConvertDocX extends ConvertBase { check(data, opts) { - const {fileType} = opts; + const {inputFiles} = opts; - return (fileType && fileType.ext == 'docx' && this.config.useExternalBookConverter); + if (this.config.useExternalBookConverter && + inputFiles.sourceFileType && inputFiles.sourceFileType.ext == 'zip') { + //ищем файл '[Content_Types].xml' + for (const file of inputFiles.fileList) { + if (file == '[Content_Types].xml') { + return true; + } + } + } + + return false; } - run(data, opts) { + async run(data, opts) { if (!this.check(data, opts)) return false; + await this.checkExternalConverterPresent(); - return data; + + + return false; } } diff --git a/server/core/BookConverter/ConvertFb2.js b/server/core/BookConverter/ConvertFb2.js index d9698382..ec492a0f 100644 --- a/server/core/BookConverter/ConvertFb2.js +++ b/server/core/BookConverter/ConvertFb2.js @@ -8,7 +8,7 @@ class ConvertFb2 extends ConvertBase { return (dataType && dataType.ext == 'xml' && data.toString().indexOf('= 0); } - run(data, opts) { + async run(data, opts) { if (!this.check(data, opts)) return false; diff --git a/server/core/BookConverter/ConvertHtml.js b/server/core/BookConverter/ConvertHtml.js index ed5bade8..9596cff8 100644 --- a/server/core/BookConverter/ConvertHtml.js +++ b/server/core/BookConverter/ConvertHtml.js @@ -17,7 +17,7 @@ class ConvertHtml extends ConvertBase { return false; } - run(data, opts) { + async run(data, opts) { const checkResult = this.check(data, opts); if (!checkResult) return false; diff --git a/server/core/BookConverter/ConvertSamlib.js b/server/core/BookConverter/ConvertSamlib.js index c6e9c37e..474fe0a1 100644 --- a/server/core/BookConverter/ConvertSamlib.js +++ b/server/core/BookConverter/ConvertSamlib.js @@ -19,7 +19,7 @@ class ConvertSamlib extends ConvertBase { return false; } - run(data, opts) { + async run(data, opts) { const checkResult = this.check(data, opts); if (!checkResult) return false; diff --git a/server/core/BookConverter/index.js b/server/core/BookConverter/index.js index 6fdb547a..68d97ba6 100644 --- a/server/core/BookConverter/index.js +++ b/server/core/BookConverter/index.js @@ -3,7 +3,7 @@ const FileDetector = require('../FileDetector'); //порядок важен const convertClassFactory = [ - //require('./ConvertDocX'), + require('./ConvertDocX'), require('./ConvertFb2'), require('./ConvertSamlib'), require('./ConvertHtml'), @@ -25,7 +25,7 @@ class BookConverter { const data = await fs.readFile(inputFiles.selectedFile); let result = false; for (const convert of this.convertFactory) { - result = convert.run(data, {inputFiles, url, callback, dataType: selectedFileType}); + result = await convert.run(data, {inputFiles, url, callback, dataType: selectedFileType}); if (result) { await fs.writeFile(outputFile, result); break; diff --git a/server/core/FileDecompressor.js b/server/core/FileDecompressor.js index ffe2ef0a..a6864f97 100644 --- a/server/core/FileDecompressor.js +++ b/server/core/FileDecompressor.js @@ -19,8 +19,9 @@ class FileDecompressor { let result = { sourceFile: filename, + sourceFileType: fileType, selectedFile: filename, - fileType: fileType, + fileListDir: outputDir, fileList: [] }; @@ -58,10 +59,9 @@ class FileDecompressor { if (files.length) { //ищем файл с максимальным размером for (let file of files) { - const path = `${outputDir}/${file.path}`; - fileList.push(path); + fileList.push(file.path); if (file.data.length > max) { - sel = path; + sel = `${outputDir}/${file.path}`; max = file.data.length; } }