Clip Web videos.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

48 рядки
1.6 KiB

  1. import { spawnSync } from 'child_process';
  2. import { readFileSync, unlinkSync } from 'fs';
  3. import {
  4. ClipVideoParams as BaseClipVideoParams,
  5. CreateClipperParams as CreateBaseClipperParams,
  6. FILE_TYPES,
  7. } from '../../common';
  8. import { VIDEO_TYPE } from './common';
  9. import { constructDefaultDownloadArgs, getFileExtension } from './downloader';
  10. import { DownloaderFailedToStartError, DownloaderNotFoundError } from './errors';
  11. export interface CreateClipperParams extends CreateBaseClipperParams {
  12. type: typeof VIDEO_TYPE;
  13. }
  14. export interface ClipVideoParams extends BaseClipVideoParams {}
  15. export const createVideoClipper = (createClipperParams: Omit<CreateClipperParams, 'type'>) => (clipVideoParams: ClipVideoParams) => {
  16. if (!createClipperParams.downloaderExecutablePath) {
  17. throw new DownloaderNotFoundError('Downloader not found.');
  18. }
  19. const fileExtension = getFileExtension(
  20. createClipperParams.downloaderExecutablePath,
  21. clipVideoParams.url,
  22. );
  23. const cacheFilename = `output.${fileExtension}`; // todo label this on the cache
  24. const downloadArgs = constructDefaultDownloadArgs(
  25. cacheFilename,
  26. clipVideoParams.url,
  27. clipVideoParams.start,
  28. clipVideoParams.end,
  29. );
  30. const downloaderProcess = spawnSync(
  31. createClipperParams.downloaderExecutablePath,
  32. downloadArgs,
  33. );
  34. if (downloaderProcess.error) {
  35. throw new DownloaderFailedToStartError('Downloader failed to start.', { cause: downloaderProcess.error });
  36. }
  37. const output = readFileSync(cacheFilename);
  38. unlinkSync(cacheFilename);
  39. return Promise.resolve({
  40. contentType: FILE_TYPES[fileExtension],
  41. content: output,
  42. });
  43. }