index.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. const basicAuth = require('express-basic-auth');
  2. const RootPage = require('./RootPage');
  3. const AuthorPage = require('./AuthorPage');
  4. const SeriesPage = require('./SeriesPage');
  5. const TitlePage = require('./TitlePage');
  6. const GenrePage = require('./GenrePage');
  7. const BookPage = require('./BookPage');
  8. const OpensearchPage = require('./OpensearchPage');
  9. const SearchPage = require('./SearchPage');
  10. const SearchHelpPage = require('./SearchHelpPage');
  11. const log = new (require('../AppLogger'))().log;//singleton
  12. module.exports = function(app, config) {
  13. if (!config.opds || !config.opds.enabled)
  14. return;
  15. const opdsRoot = config.opds.root || '/opds';
  16. config.opdsRoot = opdsRoot;
  17. const root = new RootPage(config);
  18. const author = new AuthorPage(config);
  19. const series = new SeriesPage(config);
  20. const title = new TitlePage(config);
  21. const genre = new GenrePage(config);
  22. const book = new BookPage(config);
  23. const opensearch = new OpensearchPage(config);
  24. const search = new SearchPage(config);
  25. const searchHelp = new SearchHelpPage(config);
  26. const routes = [
  27. ['', root],
  28. ['/root', root],
  29. ['/author', author],
  30. ['/series', series],
  31. ['/title', title],
  32. ['/genre', genre],
  33. ['/book', book],
  34. ['/opensearch', opensearch],
  35. ['/search', search],
  36. ['/search-help', searchHelp],
  37. ];
  38. const pages = new Map();
  39. for (const r of routes) {
  40. pages.set(`${opdsRoot}${r[0]}`, r[1]);
  41. }
  42. const opds = async(req, res, next) => {
  43. try {
  44. const page = pages.get(req.path);
  45. if (page) {
  46. res.set('Content-Type', 'application/atom+xml; charset=utf-8');
  47. const result = await page.body(req, res);
  48. if (result !== false)
  49. res.send(result);
  50. } else {
  51. next();
  52. }
  53. } catch (e) {
  54. log(LM_ERR, `OPDS: ${e.message}, url: ${req.originalUrl}`);
  55. res.status(500).send({error: e.message});
  56. }
  57. };
  58. const opdsPaths = [opdsRoot, `${opdsRoot}/*`];
  59. if (config.opds.password) {
  60. if (!config.opds.user)
  61. throw new Error('User must not be empty if password set');
  62. app.use(opdsPaths, basicAuth({
  63. users: {[config.opds.user]: config.opds.password},
  64. challenge: true,
  65. }));
  66. }
  67. app.get(opdsPaths, opds);
  68. };