123 lines
4.3 KiB
JavaScript
123 lines
4.3 KiB
JavaScript
const BasePage = require('./BasePage');
|
||
const utils = require('../utils');
|
||
|
||
class SeriesPage extends BasePage {
|
||
constructor(config) {
|
||
super(config);
|
||
|
||
this.id = 'series';
|
||
this.title = 'Серии';
|
||
}
|
||
|
||
sortSeriesBooks(seriesBooks) {
|
||
seriesBooks.sort((a, b) => {
|
||
const dserno = (a.serno || Number.MAX_VALUE) - (b.serno || Number.MAX_VALUE);
|
||
const dtitle = a.title.localeCompare(b.title);
|
||
const dext = a.ext.localeCompare(b.ext);
|
||
return (dserno ? dserno : (dtitle ? dtitle : dext));
|
||
});
|
||
|
||
return seriesBooks;
|
||
}
|
||
|
||
async body(req) {
|
||
const result = {};
|
||
|
||
const query = {
|
||
series: req.query.series || '',
|
||
genre: req.query.genre || '',
|
||
del: '0',
|
||
|
||
all: req.query.all || '',
|
||
depth: 0,
|
||
};
|
||
query.depth = query.series.length + 1;
|
||
|
||
if (query.series == '___others') {
|
||
query.series = '';
|
||
query.depth = 1;
|
||
query.others = true;
|
||
}
|
||
|
||
const entry = [];
|
||
if (query.series && query.series[0] == '=') {
|
||
//книги по серии
|
||
const bookList = await this.webWorker.getSeriesBookList(query.series.substring(1));
|
||
|
||
if (bookList.books) {
|
||
let books = bookList.books;
|
||
const booksAll = this.filterBooks(books);
|
||
const filtered = (query.all ? booksAll : this.filterBooks(books, query));
|
||
const sorted = this.sortSeriesBooks(filtered);
|
||
|
||
if (booksAll.length > filtered.length) {
|
||
entry.push(
|
||
this.makeEntry({
|
||
id: 'all_series_books',
|
||
title: '[Все книги серии]',
|
||
link: this.navLink({
|
||
href: `/${this.id}?series=${encodeURIComponent(query.series)}&all=1`}),
|
||
})
|
||
);
|
||
}
|
||
|
||
for (const book of sorted) {
|
||
const title = `${book.serno ? `${book.serno}. `: ''}${book.title || 'Без названия'} (${book.ext})`;
|
||
|
||
entry.push(
|
||
this.makeEntry({
|
||
id: book._uid,
|
||
title,
|
||
link: this.acqLink({href: `/book?uid=${encodeURIComponent(book._uid)}`}),
|
||
content: {
|
||
'*ATTRS': {type: 'text'},
|
||
'*TEXT': this.bookAuthor(book.author),
|
||
},
|
||
})
|
||
);
|
||
}
|
||
}
|
||
} else {
|
||
if (query.depth == 1 && !query.genre && !query.others) {
|
||
entry.push(
|
||
this.makeEntry({
|
||
id: 'select_genre',
|
||
title: '[Выбрать жанр]',
|
||
link: this.navLink({href: `/genre?from=${this.id}`}),
|
||
})
|
||
);
|
||
}
|
||
|
||
//навигация по каталогу
|
||
const queryRes = await this.opdsQuery('series', query, '[Остальные серии]');
|
||
|
||
for (const rec of queryRes) {
|
||
const e = {
|
||
id: rec.id,
|
||
title: (rec.count ? rec.title : `Серия: ${rec.title}`),
|
||
link: this.navLink({href: `/${this.id}?series=${rec.q}&genre=${encodeURIComponent(query.genre)}`}),
|
||
};
|
||
|
||
let countStr = '';
|
||
if (rec.count)
|
||
countStr = `${rec.count} сери${utils.wordEnding(rec.count, 1)}${(query.genre ? ' (в выбранном жанре)' : '')}`;
|
||
if (!countStr && rec.bookCount && !query.genre)
|
||
countStr = `${rec.bookCount} книг${utils.wordEnding(rec.bookCount, 8)}`;
|
||
|
||
if (countStr) {
|
||
e.content = {
|
||
'*ATTRS': {type: 'text'},
|
||
'*TEXT': countStr,
|
||
};
|
||
}
|
||
|
||
entry.push(this.makeEntry(e));
|
||
}
|
||
}
|
||
|
||
result.entry = entry;
|
||
return this.makeBody(result, req);
|
||
}
|
||
}
|
||
|
||
module.exports = SeriesPage; |