index.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. const RootPage = require('./RootPage');
  2. const AuthorPage = require('./AuthorPage');
  3. const SeriesPage = require('./SeriesPage');
  4. const TitlePage = require('./TitlePage');
  5. const GenrePage = require('./GenrePage');
  6. const BookPage = require('./BookPage');
  7. const OpensearchPage = require('./OpensearchPage');
  8. const SearchPage = require('./SearchPage');
  9. module.exports = function(app, config) {
  10. const opdsRoot = '/opds';
  11. config.opdsRoot = opdsRoot;
  12. const root = new RootPage(config);
  13. const author = new AuthorPage(config);
  14. const series = new SeriesPage(config);
  15. const title = new TitlePage(config);
  16. const genre = new GenrePage(config);
  17. const book = new BookPage(config);
  18. const opensearch = new OpensearchPage(config);
  19. const search = new SearchPage(config);
  20. const routes = [
  21. ['', root],
  22. ['/root', root],
  23. ['/author', author],
  24. ['/series', series],
  25. ['/title', title],
  26. ['/genre', genre],
  27. ['/book', book],
  28. ['/opensearch', opensearch],
  29. ['/search', search],
  30. ];
  31. const pages = new Map();
  32. for (const r of routes) {
  33. pages.set(`${opdsRoot}${r[0]}`, r[1]);
  34. }
  35. const opds = async(req, res, next) => {
  36. try {
  37. const page = pages.get(req.path);
  38. if (page) {
  39. res.set('Content-Type', 'application/atom+xml; charset=utf-8');
  40. const result = await page.body(req, res);
  41. if (result !== false)
  42. res.send(result);
  43. } else {
  44. next();
  45. }
  46. } catch (e) {
  47. res.status(500).send({error: e.message});
  48. if (config.branch == 'development') {
  49. console.error({error: e.message, url: req.originalUrl});
  50. }
  51. }
  52. };
  53. app.get([opdsRoot, `${opdsRoot}/*`], opds);
  54. };