|
- import { spawnSync } from 'child_process';
- import { readFileSync, unlinkSync } from 'fs';
- import {
- ClipVideoParams as BaseClipVideoParams,
- CreateClipperParams as CreateBaseClipperParams,
- FILE_TYPES,
- } from '../../common';
- import { VIDEO_TYPE } from './common';
- import { constructDefaultDownloadArgs, getFileExtension } from './downloader';
- import { DownloaderFailedToStartError, DownloaderNotFoundError } from './errors';
-
- export interface CreateClipperParams extends CreateBaseClipperParams {
- type: typeof VIDEO_TYPE;
- }
-
- export interface ClipVideoParams extends BaseClipVideoParams {}
-
- export const createVideoClipper = (createClipperParams: Omit<CreateClipperParams, 'type'>) => (clipVideoParams: ClipVideoParams) => {
- if (!createClipperParams.downloaderExecutablePath) {
- throw new DownloaderNotFoundError('Downloader not found.');
- }
-
- const fileExtension = getFileExtension(
- createClipperParams.downloaderExecutablePath,
- clipVideoParams.url,
- );
- const cacheFilename = `output.${fileExtension}`; // todo label this on the cache
- const downloadArgs = constructDefaultDownloadArgs(
- cacheFilename,
- clipVideoParams.url,
- clipVideoParams.start,
- clipVideoParams.end,
- );
- const downloaderProcess = spawnSync(
- createClipperParams.downloaderExecutablePath,
- downloadArgs,
- );
- if (downloaderProcess.error) {
- throw new DownloaderFailedToStartError('Downloader failed to start.', { cause: downloaderProcess.error });
- }
- const output = readFileSync(cacheFilename);
- unlinkSync(cacheFilename);
- return Promise.resolve({
- contentType: FILE_TYPES[fileExtension],
- content: output,
- });
- }
|