`,
+ end: `
`,
+ },
+ 'archiveofourown.org': {
+ converter: 'cutter',
+ begin: ``,
+ end: ``,
+ }
+};
+
+class ConvertSites extends ConvertHtml {
+ check(data, opts) {
+ const {url, dataType} = opts;
+
+ const parsedUrl = new URL(url);
+ if (dataType && dataType.ext == 'html') {
+ if (sitesFilter[parsedUrl.hostname])
+ return {hostname: parsedUrl.hostname};
+ }
+
+ return false;
+ }
+
+ async run(data, opts) {
+ if (!opts.enableSitesFilter)
+ return false;
+
+ const checkResult = this.check(data, opts);
+ if (!checkResult)
+ return false;
+
+ const {hostname} = checkResult;
+
+ let text = this.decode(data).toString();
+
+ text = this[sitesFilter[hostname].converter](text, sitesFilter[hostname]);
+
+ if (text === false)
+ return false;
+
+ return await super.run(Buffer.from(text), {skipCheck: true, cutTitle: true});
+ }
+
+ getTitle(text) {
+ let title = '';
+ const m = text.match(/
([\s\S]*?)<\/title>/);
+ if (m)
+ title = m[1];
+
+ return `${title.trim()}`;
+ }
+
+ cutter(text, opts) {
+ const title = this.getTitle(text);
+ const l = text.indexOf(opts.begin);
+ const r = text.indexOf(opts.end);
+ if (l < 0 || r < 0 || r <= l)
+ return false;
+
+ return text.substring(l, r) + title;
+ }
+}
+
+module.exports = ConvertSites;
diff --git a/server/core/BookConverter/index.js b/server/core/BookConverter/index.js
index 433c94b8..66657a25 100644
--- a/server/core/BookConverter/index.js
+++ b/server/core/BookConverter/index.js
@@ -11,6 +11,7 @@ const convertClassFactory = [
require('./ConvertMobi'),
require('./ConvertFb2'),
require('./ConvertSamlib'),
+ require('./ConvertSites'),
require('./ConvertHtml'),
];
@@ -24,13 +25,14 @@ class BookConverter {
}
}
- async convertToFb2(inputFiles, outputFile, url, callback) {
+ async convertToFb2(inputFiles, outputFile, opts, callback) {
const selectedFileType = await this.detector.detectFile(inputFiles.selectedFile);
const data = await fs.readFile(inputFiles.selectedFile);
+ const convertOpts = Object.assign({}, opts, {inputFiles, callback, dataType: selectedFileType});
let result = false;
for (const convert of this.convertFactory) {
- result = await convert.run(data, {inputFiles, url, callback, dataType: selectedFileType});
+ result = await convert.run(data, convertOpts);
if (result) {
await fs.writeFile(outputFile, result);
break;
@@ -38,14 +40,14 @@ class BookConverter {
}
if (!result && inputFiles.nesting) {
- result = await this.convertToFb2(inputFiles.nesting, outputFile, url, callback);
+ result = await this.convertToFb2(inputFiles.nesting, outputFile, opts, callback);
}
if (!result) {
if (selectedFileType)
throw new Error(`Этот формат файла не поддерживается: ${selectedFileType.mime}`);
else {
- throw new Error(`Не удалось определить формат файла: ${url}`);
+ throw new Error(`Не удалось определить формат файла: ${opts.url}`);
}
}
diff --git a/server/core/ReaderWorker.js b/server/core/ReaderWorker.js
index 1a2868b2..24038693 100644
--- a/server/core/ReaderWorker.js
+++ b/server/core/ReaderWorker.js
@@ -32,7 +32,8 @@ class ReaderWorker {
}
}
- async loadBook(url, wState) {
+ async loadBook(opts, wState) {
+ const url = opts.url;
let errMes = '';
let decompDir = '';
let downloadedFilename = '';
@@ -77,7 +78,7 @@ class ReaderWorker {
//конвертирование в fb2
wState.set({state: 'convert', step: 3, progress: 0});
convertFilename = `${this.config.tempDownloadDir}/${tempFilename2}`;
- await this.bookConverter.convertToFb2(decompFiles, convertFilename, url, progress => {
+ await this.bookConverter.convertToFb2(decompFiles, convertFilename, opts, progress => {
wState.set({progress});
});
@@ -105,12 +106,12 @@ class ReaderWorker {
}
}
- loadBookUrl(url) {
+ loadBookUrl(opts) {
const workerId = workerState.generateWorkerId();
const wState = workerState.getControl(workerId);
wState.set({state: 'start'});
- this.loadBook(url, wState);
+ this.loadBook(opts, wState);
return workerId;
}
diff --git a/server/dev.js b/server/dev.js
index df75cc84..7782d385 100644
--- a/server/dev.js
+++ b/server/dev.js
@@ -20,7 +20,7 @@ function webpackDevMiddleware(app) {
function logQueries(app) {
app.use(function(req, res, next) {
const start = Date.now();
- log(`${req.method} ${req.originalUrl} ${JSON.stringify(req.body).substr(0, 2000)}`);
+ log(`${req.method} ${req.originalUrl} ${JSON.stringify(req.body).substr(0, 4000)}`);
//log(`${JSON.stringify(req.headers, null, 2)}`)
res.once('finish', () => {
log(`${Date.now() - start}ms`);