Clip Web videos.
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

50 строки
1.7 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. import {retrieveVideoId} from './url';
  12. export interface CreateClipperParams extends CreateBaseClipperParams {
  13. type: typeof VIDEO_TYPE;
  14. }
  15. export interface ClipVideoParams extends BaseClipVideoParams {}
  16. export const createVideoClipper = (createClipperParams: Omit<CreateClipperParams, 'type'>) => (clipVideoParams: ClipVideoParams) => {
  17. if (!createClipperParams.downloaderExecutablePath) {
  18. throw new DownloaderNotFoundError('Downloader not found.');
  19. }
  20. const fileExtension = getFileExtension(
  21. createClipperParams.downloaderExecutablePath,
  22. clipVideoParams.url,
  23. );
  24. const videoId = retrieveVideoId(clipVideoParams.url);
  25. const cacheFilename = `output.${encodeURIComponent(videoId)}.${fileExtension}`;
  26. const downloadArgs = constructDefaultDownloadArgs(
  27. cacheFilename,
  28. clipVideoParams.url,
  29. clipVideoParams.start,
  30. clipVideoParams.end,
  31. );
  32. const downloaderProcess = spawnSync(
  33. createClipperParams.downloaderExecutablePath,
  34. downloadArgs,
  35. );
  36. if (downloaderProcess.error) {
  37. throw new DownloaderFailedToStartError('Downloader failed to start.', { cause: downloaderProcess.error });
  38. }
  39. const output = readFileSync(cacheFilename);
  40. unlinkSync(cacheFilename);
  41. return Promise.resolve({
  42. contentType: FILE_TYPES[fileExtension],
  43. content: output,
  44. });
  45. }