Skip to content

src/youtube-upload-video.ts

38 lines · 1.7 KB · TypeScript
Raw
import {
	uploadVideo,
	type YouTubeUploadVideoParams,
	type YouTubeUploadVideoResult,
} from './youtube.ts'

export type { YouTubeUploadVideoParams, YouTubeUploadVideoResult } from './youtube.ts'
export { uploadVideo }

/**
 * Upload a video to YouTube via the resumable upload protocol. Maps videoUrl/title aliases; rejects unknown keys.
 *
 * Use this alias when you only need upload, not the full `./youtube` helper namespace.
 * Fetches media from `videoUrl` in Range chunks (works with Cloudflare R2 object API URLs).
 *
 * @param params.account - Google account alias (`youtube-brand` or `youtube-plus`).
 * @param params.videoUrl - Fetchable video URL (for example a Cloudflare R2 object API URL).
 * @param params.title - Video title.
 * @param params.privacyStatus - Optional privacy (`public`, `unlisted`, `private`). Defaults to private.
 * @param params.dryRun - Probe the video URL and return without uploading.
 * @returns Uploaded video id, title, privacy, and byte count.
 * @example
 * import uploadVideo from 'kody:@kentcdodds/google/youtube-upload-video'
 * const result = await uploadVideo({
 *   account: 'youtube-plus',
 *   videoUrl: 'https://api.cloudflare.com/client/v4/accounts/…/r2/buckets/kcd-promo-videos/objects/ep/promo/bluesky.mp4',
 *   videoFetchHeaders: { Authorization: 'Bearer {{secret:cloudflareApiToken}}' },
 *   title: 'Promo title',
 *   privacyStatus: 'private',
 *   dryRun: true,
 * })
 * // => { id: 'dry-run', title: 'Promo title', privacyStatus: 'private', bytes: 123456, dryRun: true }
 */
export default async function youtubeUploadVideo(
	params: YouTubeUploadVideoParams,
): Promise<YouTubeUploadVideoResult> {
	return await uploadVideo(params)
}