Book Pauk пре 2 година
родитељ
комит
870f95a51f

+ 13 - 3
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) {

+ 1 - 4
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 = [];

+ 45 - 0
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 = {};        
+/*
+<?xml version="1.0" encoding="utf-8"?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
+  <ShortName>inpx-web</ShortName>
+  <Description>Поиск по каталогу</Description>
+  <InputEncoding>UTF-8</InputEncoding>
+  <OutputEncoding>UTF-8</OutputEncoding>
+  <Url type="application/atom+xml;profile=opds-catalog;kind=navigation" template="/opds/search?term={searchTerms}"/>
+</OpenSearchDescription>
+*/        
+        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;

+ 6 - 0
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();