Clip Web videos.
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

63 řádky
1.8 KiB

  1. import { EventEmitter } from 'events';
  2. import { spawnSync } from 'child_process';
  3. import { readFileSync, unlinkSync } from 'fs';
  4. import { CreateBaseClipperParams, FILE_TYPES, VideoClipEventEmitter } from '../../common';
  5. import { getFileExtension, constructDefaultDownloadArgs } from './utilities';
  6. export interface CreateYouTubeClipperParams extends CreateBaseClipperParams {
  7. downloaderExecutablePath?: string;
  8. }
  9. export class YouTubeVideoClipEventEmitter extends EventEmitter implements VideoClipEventEmitter {
  10. constructor(private readonly params: CreateYouTubeClipperParams) {
  11. super();
  12. }
  13. process() {
  14. if (!this.params.downloaderExecutablePath) {
  15. this.emit('error', new Error('Downloader not found.'));
  16. this.emit('end');
  17. return;
  18. }
  19. const fileExtension = getFileExtension(
  20. this.params.downloaderExecutablePath,
  21. this.params.url,
  22. );
  23. const cacheFilename = `output.${fileExtension}`; // todo label this on the cache
  24. const downloadArgs = constructDefaultDownloadArgs(
  25. cacheFilename,
  26. this.params.url,
  27. this.params.start,
  28. this.params.end,
  29. );
  30. this.emit('process', {
  31. type: 'download',
  32. phase: 'start',
  33. command: `${this.params.downloaderExecutablePath} ${downloadArgs.join(' ')}`,
  34. });
  35. const downloaderProcess = spawnSync(
  36. this.params.downloaderExecutablePath,
  37. downloadArgs,
  38. );
  39. if (downloaderProcess.error) {
  40. this.emit('error', downloaderProcess.error);
  41. this.emit('end');
  42. return;
  43. }
  44. this.emit('process', {
  45. type: 'download',
  46. phase: 'success',
  47. });
  48. const output = readFileSync(cacheFilename);
  49. unlinkSync(cacheFilename);
  50. this.emit('success', {
  51. contentType: FILE_TYPES[fileExtension],
  52. content: output,
  53. });
  54. this.emit('end');
  55. }
  56. }