diff --git a/server/core/opds/BasePage.js b/server/core/opds/BasePage.js index 461abc5..e2850a1 100644 --- a/server/core/opds/BasePage.js +++ b/server/core/opds/BasePage.js @@ -89,11 +89,21 @@ class BasePage { }); } - baseLinks(req) { - return [ + baseLinks(req, selfAcq = false) { + const result = [ + this.makeLink({href: `${this.opdsRoot}/opensearch`, rel: 'search', type: 'application/opensearchdescription+xml'}), + this.makeLink({href: `${this.opdsRoot}/search?term={searchTerms}`, rel: 'search', type: 'application/atom+xml'}), + this.navLink({rel: 'start'}), - this.navLink({rel: 'self', href: req.originalUrl, hrefAsIs: true}), ]; + + if (selfAcq) { + result.push(this.acqLink({rel: 'self', href: req.originalUrl, hrefAsIs: true})); + } else { + result.push(this.navLink({rel: 'self', href: req.originalUrl, hrefAsIs: true})); + } + + return result; } makeBody(content, req) { diff --git a/server/core/opds/BookPage.js b/server/core/opds/BookPage.js index c765d1d..b3ad1e8 100644 --- a/server/core/opds/BookPage.js +++ b/server/core/opds/BookPage.js @@ -119,10 +119,7 @@ class BookPage extends BasePage { async body(req) { const result = {}; - result.link = [ - this.navLink({rel: 'start'}), - this.acqLink({rel: 'self', href: req.originalUrl, hrefAsIs: true}), - ]; + result.link = this.baseLinks(req, true); const bookUid = req.query.uid; const entry = []; diff --git a/server/core/opds/OpensearchPage.js b/server/core/opds/OpensearchPage.js new file mode 100644 index 0000000..128868b --- /dev/null +++ b/server/core/opds/OpensearchPage.js @@ -0,0 +1,45 @@ +const BasePage = require('./BasePage'); +const XmlParser = require('../xml/XmlParser'); + +class OpensearchPage extends BasePage { + constructor(config) { + super(config); + + this.id = 'opensearch'; + this.title = 'opensearch'; + } + + async body() { + const xml = new XmlParser(); + const xmlObject = {}; +/* + + + inpx-web + Поиск по каталогу + UTF-8 + UTF-8 + + +*/ + xmlObject['OpenSearchDescription'] = { + '*ATTRS': {xmlns: 'http://a9.com/-/spec/opensearch/1.1/'}, + ShortName: 'inpx-web', + Description: 'Поиск по каталогу', + InputEncoding: 'UTF-8', + OutputEncoding: 'UTF-8', + Url: { + '*ATTRS': { + type: 'application/atom+xml;profile=opds-catalog;kind=navigation', + template: `${this.opdsRoot}/search?term={searchTerms}`, + }, + }, + } + + xml.fromObject(xmlObject); + + return xml.toString({format: true}); + } +} + +module.exports = OpensearchPage; \ No newline at end of file diff --git a/server/core/opds/index.js b/server/core/opds/index.js index f9f28f4..4816ae6 100644 --- a/server/core/opds/index.js +++ b/server/core/opds/index.js @@ -5,6 +5,8 @@ const TitlePage = require('./TitlePage'); const GenrePage = require('./GenrePage'); const BookPage = require('./BookPage'); +const OpensearchPage = require('./OpensearchPage'); + module.exports = function(app, config) { const opdsRoot = '/opds'; config.opdsRoot = opdsRoot; @@ -16,6 +18,8 @@ module.exports = function(app, config) { const genre = new GenrePage(config); const book = new BookPage(config); + const opensearch = new OpensearchPage(config); + const routes = [ ['', root], ['/root', root], @@ -24,6 +28,8 @@ module.exports = function(app, config) { ['/title', title], ['/genre', genre], ['/book', book], + + ['/opensearch', opensearch], ]; const pages = new Map();