|
@@ -0,0 +1,114 @@
|
|
|
+const BasePage = require('./BasePage');
|
|
|
+
|
|
|
+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 = JSON.parse(bookList.books);
|
|
|
+ const booksAll = this.filterBooks(books, {del: 0});
|
|
|
+ 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})`;
|
|
|
+
|
|
|
+ const e = {
|
|
|
+ id: book._uid,
|
|
|
+ title,
|
|
|
+ link: this.acqLink({href: `/book?uid=${encodeURIComponent(book._uid)}`}),
|
|
|
+ };
|
|
|
+
|
|
|
+ if (query.all) {
|
|
|
+ e.content = {
|
|
|
+ '*ATTRS': {type: 'text'},
|
|
|
+ '*TEXT': this.bookAuthor(book.author),
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ entry.push(
|
|
|
+ this.makeEntry(e)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } 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) {
|
|
|
+ entry.push(
|
|
|
+ this.makeEntry({
|
|
|
+ id: rec.id,
|
|
|
+ title: rec.title,
|
|
|
+ link: this.navLink({href: `/${this.id}?series=${rec.q}&genre=${encodeURIComponent(query.genre)}`}),
|
|
|
+ })
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ result.entry = entry;
|
|
|
+ return this.makeBody(result, req);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+module.exports = SeriesPage;
|