Эх сурвалжийг харах

Рефакторинг, плюс небольшие изменения - подготовка к использованию внешних конвертеров

Book Pauk 6 жил өмнө
parent
commit
d3ff0edbff

+ 2 - 2
server/core/BookConverter/ConvertFb2.js

@@ -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) {

+ 2 - 2
server/core/BookConverter/ConvertHtml.js

@@ -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};
 
 
         //может это чистый текст?
         //может это чистый текст?

+ 4 - 3
server/core/BookConverter/ConvertSamlib.js

@@ -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};
         }
         }
 
 

+ 6 - 6
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;
         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)
-                throw new Error(`Этот формат файла не поддерживается: ${fileType.mime}`);
+            if (selectedFileType)
+                throw new Error(`Этот формат файла не поддерживается: ${selectedFileType.mime}`);
             else {
             else {
                 throw new Error(`Не удалось определить формат файла: ${url}`);
                 throw new Error(`Не удалось определить формат файла: ${url}`);
             }
             }

+ 20 - 6
server/core/FileDecompressor.js

@@ -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'))
-            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 этапа
         //дурной 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)
-            await fs.chmod(result, 0o664);
+        if (sel != filename)
+            await fs.chmod(sel, 0o664);
+
+        result.selectedFile = sel;
+        result.fileList = fileList;
 
 
         return result;
         return result;
     }
     }

+ 4 - 3
server/core/ReaderWorker.js

@@ -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)