소스 검색

Подготовка к запуску внешних конвертеров, для обработки файлов pdf, doc, epub, mobi и пр.

Book Pauk 6 년 전
부모
커밋
a96eb50784
5개의 변경된 파일63개의 추가작업 그리고 2개의 파일을 삭제
  1. 2 0
      server/config/base.js
  2. 2 1
      server/config/configSaver.js
  3. 18 0
      server/core/BookConverter/ConvertDocX.js
  4. 1 0
      server/core/BookConverter/index.js
  5. 40 1
      server/core/utils.js

+ 2 - 0
server/config/base.js

@@ -21,6 +21,8 @@ module.exports = {
     maxTempPublicDirSize: 512*1024*1024,//512Мб
     maxUploadPublicDirSize: 200*1024*1024,//100Мб
 
+    useExternalBookConverter: false,
+
     servers: [
         {
             serverName: '1',

+ 2 - 1
server/config/configSaver.js

@@ -5,7 +5,8 @@ const propsToSave = [
     'maxUploadFileSize',
     'maxTempPublicDirSize',
     'maxUploadPublicDirSize',
-
+    'useExternalBookConverter',
+    
     'servers',
 ];
 

+ 18 - 0
server/core/BookConverter/ConvertDocX.js

@@ -0,0 +1,18 @@
+const ConvertBase = require('./ConvertBase');
+
+class ConvertDocX extends ConvertBase {
+    check(data, opts) {
+        const {fileType} = opts;
+
+        return (fileType && fileType.ext == 'docx' && this.config.useExternalBookConverter);
+    }
+
+    run(data, opts) {
+        if (!this.check(data, opts))
+            return false;
+
+        return data;
+    }
+}
+
+module.exports = ConvertDocX;

+ 1 - 0
server/core/BookConverter/index.js

@@ -3,6 +3,7 @@ const FileDetector = require('../FileDetector');
 
 //порядок важен
 const convertClassFactory = [
+    //require('./ConvertDocX'),
     require('./ConvertFb2'),
     require('./ConvertSamlib'),
     require('./ConvertHtml'),

+ 40 - 1
server/core/utils.js

@@ -1,3 +1,4 @@
+const { spawn } = require('child_process');
 const fs = require('fs-extra');
 const crypto = require('crypto');
 
@@ -13,8 +14,46 @@ async function touchFile(filename) {
     await fs.utimes(filename, Date.now()/1000, Date.now()/1000);
 }
 
+function spawnProcess(cmd, opts) {
+    let {args, killAfter, onData} = opts;
+    killAfter = (killAfter ? killAfter : 30*1000);
+    onData = (onData ? onData : () => {});
+    args = (args ? args : []);
+
+    return new Promise(async(resolve, reject) => {
+        let resolved = false;
+        const proc = spawn(cmd, args);
+
+        let stdout = '';
+        proc.stdout.on('data', (data) => {
+            stdout += data;
+            onData(data);
+        });
+
+        let stderr = '';
+        proc.stderr.on('data', (data) => {
+            stderr += data;
+            onData(data);
+        });
+
+        proc.on('close', (code) => {
+            resolved = true;
+            resolve({status: 'close', code, stdout, stderr});
+        });
+
+        proc.on('error', (error) => {
+            reject({status: 'error', error, stdout, stderr});
+        });
+
+        await sleep(killAfter);
+        if (!resolved)
+            reject({status: 'killed', stdout, stderr});
+    });
+}
+
 module.exports = {
     sleep,
     randomHexString,
-    touchFile
+    touchFile,
+    spawnProcess
 };