diff --git a/client/components/Reader/Reader.vue b/client/components/Reader/Reader.vue
index 857edca9..07c93487 100644
--- a/client/components/Reader/Reader.vue
+++ b/client/components/Reader/Reader.vue
@@ -318,6 +318,7 @@ class Reader extends Vue {
this.enableSitesFilter = settings.enableSitesFilter;
this.showNeedUpdateNotify = settings.showNeedUpdateNotify;
this.splitToPara = settings.splitToPara;
+ this.djvuQuality = settings.djvuQuality;
this.readerActionByKeyCode = utils.userHotKeysObjectSwap(settings.userHotKeys);
this.$root.readerActionByKeyEvent = (event) => {
@@ -973,10 +974,11 @@ class Reader extends Vue {
if (!book) {
book = await readerApi.loadBook({
url,
+ uploadFileName,
+ enableSitesFilter: this.enableSitesFilter,
skipHtmlCheck: (this.splitToPara ? true : false),
isText: (this.splitToPara ? true : false),
- enableSitesFilter: this.enableSitesFilter,
- uploadFileName
+ djvuQuality: this.djvuQuality,
},
(state) => {
progress.setState(state);
diff --git a/client/components/Reader/SettingsPage/SettingsPage.vue b/client/components/Reader/SettingsPage/SettingsPage.vue
index 582c415c..2f08064a 100644
--- a/client/components/Reader/SettingsPage/SettingsPage.vue
+++ b/client/components/Reader/SettingsPage/SettingsPage.vue
@@ -549,7 +549,7 @@ class SettingsPage extends Vue {
margin-bottom: 5px;
}
-.label-1 {
+.label-1, .label-7 {
width: 75px;
}
@@ -561,7 +561,7 @@ class SettingsPage extends Vue {
width: 100px;
}
-.label-1, .label-2, .label-3, .label-4, .label-5, .label-6 {
+.label-1, .label-2, .label-3, .label-4, .label-5, .label-6, .label-7 {
display: flex;
flex-direction: column;
justify-content: center;
diff --git a/client/components/Reader/SettingsPage/include/ConvertTab.inc b/client/components/Reader/SettingsPage/include/ConvertTab.inc
index e59a86a7..2441be44 100644
--- a/client/components/Reader/SettingsPage/include/ConvertTab.inc
+++ b/client/components/Reader/SettingsPage/include/ConvertTab.inc
@@ -3,10 +3,25 @@
Настройки конвертирования применяются ко всем
вновь открываемым или обновляемым файлам
+
+
-
Сайты
+
Текст
+
+
+
+ Опция принудительно включает эвристику разбиения текста на
+ параграфы в случае, если формат файла определен как html,
+ xml или txt. Возможна нечитабельная разметка текста.
+
+
+
+
+
+
+
Сайты
@@ -21,19 +36,21 @@
+
+
+
+
+
-
Текст
+
Качество
-
+
- Опция принудительно включает эвристику разбиения текста на
- параграфы в случае, если формат файла определен как html,
- xml или txt. Возможна нечитабельная разметка текста.
+ Качество конвертирования Djvu в Fb2. Чем значение выше, тем больше
+ размер итогового файла. Если сервер отказывается конвертировать
+ слишком большой файл, то попробуйте понизить качество.
-
+
-
-
-
diff --git a/client/store/modules/reader.js b/client/store/modules/reader.js
index 2d104c68..a776633d 100644
--- a/client/store/modules/reader.js
+++ b/client/store/modules/reader.js
@@ -253,6 +253,7 @@ const settingDefaults = {
imageFitWidth: true,
enableSitesFilter: true,
splitToPara: false,
+ djvuQuality: 20,
showServerStorageMessages: true,
showWhatsNewDialog: true,
diff --git a/server/controllers/ReaderController.js b/server/controllers/ReaderController.js
index 763d9016..6f521a60 100644
--- a/server/controllers/ReaderController.js
+++ b/server/controllers/ReaderController.js
@@ -23,6 +23,7 @@ class ReaderController extends BaseController {
skipHtmlCheck: (request.hasOwnProperty('skipHtmlCheck') ? request.skipHtmlCheck : false),
isText: (request.hasOwnProperty('isText') ? request.isText : false),
uploadFileName: (request.hasOwnProperty('uploadFileName') ? request.uploadFileName : false),
+ djvuQuality: (request.hasOwnProperty('djvuQuality') ? request.djvuQuality : false),
});
const state = this.workerState.getState(workerId);
return (state ? state : {});
diff --git a/server/core/Reader/BookConverter/ConvertDjvu.js b/server/core/Reader/BookConverter/ConvertDjvu.js
index 35a87e8e..e794700c 100644
--- a/server/core/Reader/BookConverter/ConvertDjvu.js
+++ b/server/core/Reader/BookConverter/ConvertDjvu.js
@@ -16,7 +16,12 @@ class ConvertDjvu extends ConvertJpegPng {
if (!this.check(data, opts))
return false;
- const {inputFiles, callback, abort} = opts;
+ let {inputFiles, callback, abort, djvuQuality} = opts;
+
+ djvuQuality = (djvuQuality && djvuQuality <= 100 && djvuQuality >= 10 ? djvuQuality : 20);
+ let jpegQuality = djvuQuality;
+ let tiffQuality = djvuQuality + 30;
+ tiffQuality = (tiffQuality < 85 ? tiffQuality : 85);
const ddjvuPath = '/usr/bin/ddjvu';
if (!await fs.pathExists(ddjvuPath))
@@ -40,7 +45,7 @@ class ConvertDjvu extends ConvertJpegPng {
//конвертируем в tiff
let perc = 0;
- await this.execConverter(ddjvuPath, ['-format=tiff', '-quality=50', '-verbose', inputFiles.sourceFile, tifFile], () => {
+ await this.execConverter(ddjvuPath, ['-format=tiff', `-quality=${tiffQuality}`, '-verbose', inputFiles.sourceFile, tifFile], () => {
perc = (perc < 100 ? perc + 1 : 40);
callback(perc);
}, abort);
@@ -57,16 +62,24 @@ class ConvertDjvu extends ConvertJpegPng {
await fs.remove(tifFile);
//конвертируем в jpg
- await this.execConverter(mogrifyPath, ['-quality', '20', '-scale', '2048>', '-verbose', '-format', 'jpg', `${dir}*.tif`], () => {
+ await this.execConverter(mogrifyPath, ['-quality', jpegQuality, '-scale', '2048>', '-verbose', '-format', 'jpg', `${dir}*.tif`], () => {
perc = (perc < 100 ? perc + 1 : 40);
callback(perc);
}, abort);
+ limitSize = 2*this.config.maxUploadFileSize;
+ let jpgFilesSize = 0;
//ищем изображения
let files = [];
await utils.findFiles(async(file) => {
- if (path.extname(file) == '.jpg')
+ if (path.extname(file) == '.jpg') {
+ jpgFilesSize += (await fs.stat(file)).size;
+ if (jpgFilesSize > limitSize) {
+ throw new Error(`Файл для конвертирования слишком большой|FORLOG| jpgFilesSize: ${jpgFilesSize} > ${limitSize}`);
+ }
+
files.push({name: file, base: path.basename(file)});
+ }
}, dir);
files.sort((a, b) => a.base.localeCompare(b.base));