index.js 1.7 KB

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