index.js 2.1 KB

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