diff --git a/src/video-types/youtube/clipper.ts b/src/video-types/youtube/clipper.ts index 1c4c2c1..180df5e 100644 --- a/src/video-types/youtube/clipper.ts +++ b/src/video-types/youtube/clipper.ts @@ -8,6 +8,7 @@ import { import { VIDEO_TYPE } from './common'; import { constructDefaultDownloadArgs, getFileExtension } from './downloader'; import { DownloaderFailedToStartError, DownloaderNotFoundError } from './errors'; +import {retrieveVideoId} from './url'; export interface CreateClipperParams extends CreateBaseClipperParams { type: typeof VIDEO_TYPE; @@ -24,7 +25,8 @@ export const createVideoClipper = (createClipperParams: Omit 0) { + throw new Error(errorMessage); + } + return result.stdout.toString('utf-8').trim(); }; diff --git a/src/video-types/youtube/errors.ts b/src/video-types/youtube/errors.ts index 716def2..377b833 100644 --- a/src/video-types/youtube/errors.ts +++ b/src/video-types/youtube/errors.ts @@ -1,3 +1,5 @@ export class DownloaderNotFoundError extends Error {} export class DownloaderFailedToStartError extends Error {} + +export class InvalidVideoIdError extends Error {} diff --git a/src/video-types/youtube/url.ts b/src/video-types/youtube/url.ts new file mode 100644 index 0000000..27c01fd --- /dev/null +++ b/src/video-types/youtube/url.ts @@ -0,0 +1,19 @@ +import { InvalidVideoIdError } from './errors'; + +const STANDARD_YOUTUBE_VIDEO_ID_LENGTH = 11 as const; + +export const RE_YOUTUBE = /^.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v?:i?=|&v?:i?=))([^#&?]*).*/im; + +export const retrieveVideoId = (videoId: string): string => { + if (typeof (videoId as unknown) !== 'string') { + throw new InvalidVideoIdError('The video ID must be a string.'); + } + if (videoId.length === STANDARD_YOUTUBE_VIDEO_ID_LENGTH) { + return videoId; + } + const matchId = videoId.match(RE_YOUTUBE); + if (matchId && matchId.length > 1) { + return matchId[1]; + } + throw new InvalidVideoIdError('Impossible to retrieve Youtube video ID.'); +};