export const FREE_PLAN = { monthlyQuota: 14, maxFileSizeBytes: 30 * 1024 * 1024, maxBatchSize: 3, watermarkOptional: true, } as const; export const RESOLUTIONS = [ { value: "1920x1080", label: "1920x1080 (16:9)", width: 1920, height: 1080 }, { value: "1280x720", label: "1280x720 (16:9)", width: 1280, height: 720 }, { value: "854x480", label: "854x480 (16:9)", width: 854, height: 480 }, { value: "720x720", label: "720x720 (1:1)", width: 720, height: 720 }, { value: "640x360", label: "640x360 (16:9)", width: 640, height: 360 }, { value: "426x240", label: "426x240 (16:9)", width: 426, height: 240 }, ] as const; export const YOUTUBE_CATEGORIES = [ { id: "10", name: "Music" }, { id: "1", name: "Film & Animation" }, { id: "2", name: "Autos & Vehicles" }, { id: "15", name: "Pets & Animals" }, { id: "17", name: "Sports" }, { id: "19", name: "Travel & Events" }, { id: "20", name: "Gaming" }, { id: "22", name: "People & Blogs" }, { id: "23", name: "Comedy" }, { id: "24", name: "Entertainment" }, { id: "25", name: "News & Politics" }, { id: "26", name: "Howto & Style" }, { id: "27", name: "Education" }, { id: "28", name: "Science & Technology" }, { id: "29", name: "Nonprofits & Activism" }, ] as const; export const QUEUE_NAME = "video-jobs"; export function getResolution(value: string) { return RESOLUTIONS.find((r) => r.value === value); } export function isAllowedResolution(value: string): boolean { return RESOLUTIONS.some((r) => r.value === value); } export function filenameWithoutExtension(filename: string): string { const lastDot = filename.lastIndexOf("."); return lastDot > 0 ? filename.slice(0, lastDot) : filename; } export function parseTags(input: string): string[] { const tags: string[] = []; const regex = /"([^"]+)"|([^,\s]+)/g; let match: RegExpExecArray | null; while ((match = regex.exec(input)) !== null) { const tag = (match[1] || match[2]).trim(); if (tag) tags.push(tag); } return tags.slice(0, 500); }