Parcourir la source

Начата работа над opds

Book Pauk il y a 2 ans
Parent
commit
8a71c4040c
4 fichiers modifiés avec 83 ajouts et 0 suppressions
  1. 30 0
      server/core/opds/BasePage.js
  2. 17 0
      server/core/opds/RootPage.js
  3. 34 0
      server/core/opds/index.js
  4. 2 0
      server/index.js

+ 30 - 0
server/core/opds/BasePage.js

@@ -0,0 +1,30 @@
+const XmlParser = require('../xml/XmlParser');
+
+class BasePage {
+    constructor(config) {        
+        this.config = config;
+
+        this.rootTag = 'feed';
+    }
+
+    makeBody(content) {
+        if (!this.id)
+            throw new Error('makeBody: no id');
+
+        content.id = this.id;
+
+        const xml = new XmlParser();
+        const xmlObject = {};        
+        xmlObject[this.rootTag] = content;
+
+        xml.fromObject(xmlObject);
+
+        return xml.toString({format: true});
+    }
+
+    async body() {
+        throw new Error('Body not implemented');
+    }
+}
+
+module.exports = BasePage;

+ 17 - 0
server/core/opds/RootPage.js

@@ -0,0 +1,17 @@
+const BasePage = require('./BasePage');
+
+class RootPage extends BasePage {
+    constructor(config) {
+        super(config);
+
+        this.id = 'root';
+    }
+
+    async body() {
+        const result = {};
+        
+        return this.makeBody(result);
+    }
+}
+
+module.exports = RootPage;

+ 34 - 0
server/core/opds/index.js

@@ -0,0 +1,34 @@
+const path = require('path');
+
+const RootPage = require('./RootPage');
+
+module.exports = function(app, config) {
+    const root = new RootPage(config);
+
+    const pages = new Map([
+        ['opds', root]
+    ]);
+
+    const opds = async(req, res, next) => {
+        try {
+            const pageName = path.basename(req.path);
+            const page = pages.get(pageName);
+
+            if (page) {
+                res.set('Content-Type', 'application/atom+xml; charset=utf-8');
+
+                const result = await page.body(req, res);
+
+                if (result !== false)
+                    res.send(result);
+            } else {
+                next();
+            }
+        } catch (e) {
+            res.status(500).send({error: e.message});
+        }
+    };
+
+    app.get(['/opds', '/opds/*'], opds);
+};
+

+ 2 - 0
server/index.js

@@ -5,6 +5,7 @@ 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'))();
@@ -154,6 +155,7 @@ async function main() {
     if (devModule)
         devModule.logQueries(app);
 
+    opds(app, config);
     initStatic(app, config);
     
     const { WebSocketController } = require('./controllers');