index.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. const fs = require('fs-extra');
  2. const FileDetector = require('../../FileDetector');
  3. //порядок важен
  4. const convertClassFactory = [
  5. require('./ConvertEpub'),
  6. require('./ConvertDjvu'),
  7. require('./ConvertPdf'),
  8. require('./ConvertRtf'),
  9. require('./ConvertDocX'),
  10. require('./ConvertFb3'),
  11. require('./ConvertDoc'),
  12. require('./ConvertMobi'),
  13. require('./ConvertFb2'),
  14. require('./ConvertSamlib'),
  15. require('./ConvertSites'),
  16. require('./ConvertHtml'),
  17. ];
  18. class BookConverter {
  19. constructor(config) {
  20. this.detector = new FileDetector();
  21. this.convertFactory = [];
  22. for (const convertClass of convertClassFactory) {
  23. this.convertFactory.push(new convertClass(config));
  24. }
  25. }
  26. async convertToFb2(inputFiles, outputFile, opts, callback, abort) {
  27. if (abort && abort())
  28. throw new Error('abort');
  29. const selectedFileType = await this.detector.detectFile(inputFiles.selectedFile);
  30. const data = await fs.readFile(inputFiles.selectedFile);
  31. const convertOpts = Object.assign({}, opts, {inputFiles, callback, abort, dataType: selectedFileType});
  32. let result = false;
  33. for (const convert of this.convertFactory) {
  34. result = await convert.run(data, convertOpts);
  35. if (result) {
  36. await fs.writeFile(outputFile, result);
  37. break;
  38. }
  39. }
  40. if (!result && inputFiles.nesting) {
  41. result = await this.convertToFb2(inputFiles.nesting, outputFile, opts, callback, abort);
  42. }
  43. if (!result) {
  44. if (selectedFileType)
  45. throw new Error(`Этот формат файла не поддерживается: ${selectedFileType.mime}`);
  46. else {
  47. throw new Error(`Не удалось определить формат файла: ${opts.url}`);
  48. }
  49. }
  50. callback(100);
  51. return result;
  52. }
  53. }
  54. module.exports = BookConverter;