Преглед на файлове

Работа над opds

Book Pauk преди 2 години
родител
ревизия
037b42a5b4
променени са 3 файла, в които са добавени 63 реда и са изтрити 6 реда
  1. 38 4
      server/core/opds/BasePage.js
  2. 24 1
      server/core/opds/RootPage.js
  3. 1 1
      server/index.js

+ 38 - 4
server/core/opds/BasePage.js

@@ -1,21 +1,55 @@
+const WebWorker = require('../WebWorker');//singleton
 const XmlParser = require('../xml/XmlParser');
 
 class BasePage {
     constructor(config) {        
         this.config = config;
 
+        this.webWorker = new WebWorker(config);
         this.rootTag = 'feed';
+        this.opdsRoot = '/opds';
+    }
+
+    makeEntry(entry = {}) {
+        if (!entry.id)
+            throw new Error('makeEntry: no id');
+        if (!entry.title)
+            throw new Error('makeEntry: no title');
+
+        const result = {
+            updated: (new Date()).toISOString().substring(0, 19) + 'Z',
+        };
+
+        return Object.assign(result, entry);
+    }
+
+    makeLink(attrs) {
+        return {'*ATTRS': attrs};
+    }
+
+    navLink(attrs) {
+        return this.makeLink({
+            href: this.opdsRoot + (attrs.href || ''),
+            rel: attrs.rel || '',
+            type: 'application/atom+xml; profile=opds-catalog; kind=navigation',
+        });
     }
 
     makeBody(content) {
-        if (!this.id)
-            throw new Error('makeBody: no id');
+        const base = this.makeEntry({id: this.id, title: this.title});
+        base['*ATTRS'] = {
+            'xmlns': 'http://www.w3.org/2005/Atom',
+            'xmlns:dc': 'http://purl.org/dc/terms/',
+            'xmlns:opds': 'http://opds-spec.org/2010/catalog',
+        };
 
-        content.id = this.id;
+        base.link = [
+            this.navLink({rel: 'start'}),
+        ];
 
         const xml = new XmlParser();
         const xmlObject = {};        
-        xmlObject[this.rootTag] = content;
+        xmlObject[this.rootTag] = Object.assign(base, content);
 
         xml.fromObject(xmlObject);
 

+ 24 - 1
server/core/opds/RootPage.js

@@ -5,11 +5,34 @@ class RootPage extends BasePage {
         super(config);
 
         this.id = 'root';
+        this.title = '';
     }
 
     async body() {
         const result = {};
-        
+        const ww = this.webWorker;
+
+        if (!this.title) {
+            const dbConfig = await ww.dbConfig();
+            const collection = dbConfig.inpxInfo.collection.split('\n');
+            this.title = collection[0].trim();
+            if (!this.title)
+                this.title = 'Неизвестная коллекция';
+        }
+
+        result.link = [
+            this.navLink({rel: 'start'}),
+            this.navLink({rel: 'self'}),
+        ];
+
+        result.entry = [
+            this.makeEntry({
+                id: 'author',
+                title: 'Авторы', 
+                link: this.navLink({rel: 'subsection', href: '/author'}),
+            }),
+        ];
+
         return this.makeBody(result);
     }
 }

+ 1 - 1
server/index.js

@@ -5,7 +5,6 @@ const express = require('express');
 const http = require('http');
 const WebSocket = require ('ws');
 
-const opds = require('./core/opds');
 const utils = require('./core/utils');
 
 const ayncExit = new (require('./core/AsyncExit'))();
@@ -155,6 +154,7 @@ async function main() {
     if (devModule)
         devModule.logQueries(app);
 
+    const opds = require('./core/opds');
     opds(app, config);
     initStatic(app, config);