@kimjansheden/payload-video-processor 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -0
- package/dist/admin/VideoField.cjs +737 -0
- package/dist/admin/VideoField.cjs.map +1 -0
- package/dist/admin/VideoField.d.cts +44 -0
- package/dist/admin/VideoField.d.ts +44 -0
- package/dist/admin/VideoField.js +731 -0
- package/dist/admin/VideoField.js.map +1 -0
- package/dist/admin/client.d.cts +4 -0
- package/dist/admin/client.d.ts +4 -0
- package/dist/cli/start-worker.cjs +691 -0
- package/dist/cli/start-worker.cjs.map +1 -0
- package/dist/cli/start-worker.js +678 -0
- package/dist/cli/start-worker.js.map +1 -0
- package/dist/exports/client.cjs +737 -0
- package/dist/exports/client.cjs.map +1 -0
- package/dist/exports/client.js +731 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/index.cjs +1141 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +66 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.js +1125 -0
- package/dist/index.js.map +1 -0
- package/dist/queue/worker.cjs +483 -0
- package/dist/queue/worker.cjs.map +1 -0
- package/dist/queue/worker.d.cts +2 -0
- package/dist/queue/worker.d.ts +2 -0
- package/dist/queue/worker.js +472 -0
- package/dist/queue/worker.js.map +1 -0
- package/dist/styles-GMHOOV63.css +8 -0
- package/dist/types-BjFcE25o.d.cts +78 -0
- package/dist/types-BjFcE25o.d.ts +78 -0
- package/package.json +91 -0
- package/types/index.d.ts +6 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/options.ts","../src/queue/createQueue.ts","../src/queue/job.types.ts","../src/api/shared.ts","../src/api/enqueue.ts","../src/api/status.ts","../src/utils/filesystem.ts","../src/utils/payload.ts","../src/api/removeVariant.ts","../src/api/replaceOriginal.ts","../src/ffmpeg/args.ts","../src/ffmpeg/probe.ts","../src/utils/paths.ts","../src/queue/createWorker.ts","../src/index.ts"],"names":["z","path","bodySchema","fs","ffmpeg","ffprobeStatic","IORedis"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\nimport type { Preset, VideoPluginOptions } from \"./types\";\n\nexport const presetSchema = z.object({\n args: z.array(z.string()),\n label: z.string().optional(),\n enableCrop: z.boolean().optional(),\n});\n\nexport const videoPluginOptionsSchema = z.object({\n presets: z\n .record(presetSchema)\n .refine((value) => Object.keys(value).length > 0, {\n message: \"At least one preset must be defined.\",\n }),\n queue: z\n .object({\n name: z.string().min(1).optional(),\n redisUrl: z.string().optional(),\n concurrency: z.number().int().positive().optional(),\n })\n .optional(),\n access: z.any().optional(),\n resolvePaths: z.any().optional(),\n});\n\nexport type NormalizedPresets = Record<string, Preset>;\n\nexport const normalizePresets = (\n presets: Record<string, Preset>,\n): NormalizedPresets => {\n const entries = Object.entries(presets).map(([name, preset]) => [\n name,\n { ...preset },\n ]);\n return Object.fromEntries(entries);\n};\n\nexport const ensureOptions = (\n options: VideoPluginOptions,\n): VideoPluginOptions =>\n videoPluginOptionsSchema.parse(options) as VideoPluginOptions;\n","import { Queue, QueueEvents } from \"bullmq\";\nimport IORedis from \"ioredis\";\n\nexport type QueueHandles = {\n queue: Queue;\n events: QueueEvents;\n};\n\nexport type QueueFactoryOptions = {\n name: string;\n redisUrl?: string;\n};\n\n/**\n * Create a BullMQ queue and accompanying QueueEvents instance that share a\n * Redis connection pool. Consumers are responsible for closing the queue when\n * the process exits.\n */\nexport const createQueue = ({\n name,\n redisUrl,\n}: QueueFactoryOptions): QueueHandles => {\n const connection = redisUrl\n ? new IORedis(redisUrl, { maxRetriesPerRequest: null })\n : new IORedis({ maxRetriesPerRequest: null });\n\n const queue = new Queue(name, {\n connection,\n });\n\n const events = new QueueEvents(name, {\n connection: connection.duplicate(),\n });\n\n events.on(\"error\", (error) => {\n console.error(\"[video-processor] QueueEvents error\", error);\n });\n\n void events.waitUntilReady();\n\n return { queue, events };\n};\n","import { z } from \"zod\";\n\nexport const cropSchema = z\n .object({\n x: z.number().min(0).max(1),\n y: z.number().min(0).max(1),\n width: z.number().positive().max(1),\n height: z.number().positive().max(1),\n })\n .refine((value) => value.width > 0 && value.height > 0, {\n message: \"Crop width and height must be > 0\",\n });\n\nexport const videoJobSchema = z.object({\n collection: z.string().min(1),\n id: z.union([z.string(), z.number()]).transform((value) => value.toString()),\n preset: z.string().min(1),\n crop: cropSchema.optional(),\n});\n\nexport type VideoJobData = z.infer<typeof videoJobSchema>;\nexport type CropData = z.infer<typeof cropSchema>;\n","import type { PayloadRequest } from \"payload\";\n\nexport type RequestWithBody = PayloadRequest & {\n body?: unknown;\n};\n\nexport const readRequestBody = async (\n req: RequestWithBody,\n): Promise<unknown> => {\n // Prefer the modern web Request API when available (Payload >= 3.3 with Next runtime)\n if (typeof (req as any).json === \"function\") {\n try {\n return await (req as any).json();\n } catch {\n // Fallback to legacy body access if parsing fails\n }\n }\n\n if (typeof req.body !== \"undefined\") {\n return req.body;\n }\n\n return undefined;\n};\n","import type { Queue } from \"bullmq\";\nimport { z } from \"zod\";\nimport type { PayloadRequest } from \"payload\";\nimport type { Preset, AccessControl } from \"../types\";\nimport { videoJobSchema } from \"../queue/job.types\";\nimport { readRequestBody, type RequestWithBody } from \"./shared\";\n\nconst bodySchema = videoJobSchema.extend({\n crop: videoJobSchema.shape.crop.optional(),\n});\n\nexport type EnqueueHandlerArgs = {\n getQueue: () => Queue;\n presets: Record<string, Preset>;\n access?: AccessControl;\n};\n\ntype EnqueueRequest = RequestWithBody & PayloadRequest;\n\nexport const createEnqueueHandler =\n ({ getQueue, presets, access }: EnqueueHandlerArgs) =>\n async (req: EnqueueRequest): Promise<Response> => {\n try {\n if (access?.enqueue) {\n const allowed = await access.enqueue({ req });\n if (!allowed) {\n return Response.json(\n { error: \"Not allowed to enqueue video processing jobs.\" },\n { status: 403 },\n );\n }\n }\n\n const rawBody = await readRequestBody(req);\n const parsed = bodySchema.parse(rawBody);\n\n if (!presets[parsed.preset]) {\n return Response.json(\n { error: `Unknown preset \\`${parsed.preset}\\`.` },\n { status: 400 },\n );\n }\n\n const payloadClient = req.payload;\n const doc = await payloadClient.findByID({\n collection: parsed.collection,\n id: parsed.id,\n });\n\n if (!doc) {\n return Response.json({ error: \"Document not found.\" }, { status: 404 });\n }\n\n const queue = getQueue();\n const job = await queue.add(parsed.preset, parsed, {\n // Keep completed jobs briefly so the status endpoint can report \"completed\"\n // before BullMQ removes the job entry.\n removeOnComplete: { age: 60 },\n removeOnFail: false,\n });\n\n return Response.json({ id: job.id, state: \"queued\" }, { status: 202 });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return Response.json(\n { error: error.message, issues: error.issues },\n { status: 400 },\n );\n }\n\n console.error(\"[video-processor] Enqueue handler failed\", error);\n return Response.json(\n { error: \"Unexpected error while enqueuing video job.\" },\n { status: 500 },\n );\n }\n };\n","import type { Queue } from \"bullmq\";\nimport type { PayloadRequest } from \"payload\";\n\nexport type StatusHandlerArgs = {\n getQueue: () => Queue;\n};\n\ntype StatusRequest = PayloadRequest & {\n params?: {\n jobId?: string;\n };\n};\n\nconst readJobId = (req: StatusRequest): string | undefined => {\n const directParam = req.params?.jobId;\n if (typeof directParam === \"string\" && directParam.length > 0) {\n return directParam;\n }\n\n const routeParam = (req.routeParams as Record<string, unknown> | undefined)\n ?.jobId;\n if (typeof routeParam === \"string\" && routeParam.length > 0) {\n return routeParam;\n }\n\n return undefined;\n};\n\nexport const createStatusHandler =\n ({ getQueue }: StatusHandlerArgs) =>\n async (req: StatusRequest): Promise<Response> => {\n try {\n const jobId = readJobId(req);\n if (!jobId) {\n return Response.json(\n { error: \"jobId parameter is required.\" },\n { status: 400 },\n );\n }\n\n const queue = getQueue();\n const job = await queue.getJob(jobId);\n if (!job) {\n return Response.json({ error: \"Job not found.\" }, { status: 404 });\n }\n\n const state = await job.getState();\n return Response.json({ id: job.id, state, progress: job.progress });\n } catch (error) {\n console.error(\"[video-processor] Status handler failed\", error);\n return Response.json(\n { error: \"Unexpected error while reading job status.\" },\n { status: 500 },\n );\n }\n };\n","import path from \"node:path\";\n\nimport type { CollectionConfig } from \"../types\";\n\nconst safeNormalize = (input: string): string => path.resolve(input);\n\nconst ensureTrailingSep = (input: string): string =>\n input.endsWith(path.sep) ? input : `${input}${path.sep}`;\n\nconst isWithinRoot = (candidate: string, root: string): boolean => {\n const normalizedCandidate = safeNormalize(candidate);\n const normalizedRoot = safeNormalize(root);\n return (\n normalizedCandidate === normalizedRoot ||\n normalizedCandidate.startsWith(ensureTrailingSep(normalizedRoot))\n );\n};\n\nexport const gatherAllowedRoots = ({\n collection,\n doc,\n}: {\n collection?: CollectionConfig | null;\n doc?: Record<string, unknown> | null;\n}): string[] => {\n const roots = new Set<string>();\n roots.add(safeNormalize(process.cwd()));\n\n const staticDirEnv = process.env.STATIC_DIR;\n if (typeof staticDirEnv === \"string\" && staticDirEnv.trim()) {\n roots.add(safeNormalize(staticDirEnv));\n }\n\n const uploadsDirEnv = process.env.PAYLOAD_UPLOADS_DIR;\n if (typeof uploadsDirEnv === \"string\" && uploadsDirEnv.trim()) {\n roots.add(safeNormalize(uploadsDirEnv));\n }\n\n const uploadConfig =\n collection && typeof collection.upload === \"object\"\n ? collection.upload\n : null;\n const staticDirConfig =\n uploadConfig && typeof uploadConfig.staticDir === \"string\"\n ? uploadConfig.staticDir\n : null;\n if (staticDirConfig) {\n roots.add(safeNormalize(staticDirConfig));\n }\n\n const docPath =\n doc && typeof doc.path === \"string\" ? doc.path.trim() : undefined;\n if (docPath && docPath.length > 0) {\n if (path.isAbsolute(docPath)) {\n roots.add(safeNormalize(path.dirname(docPath)));\n } else {\n roots.add(safeNormalize(path.join(process.cwd(), path.dirname(docPath))));\n if (staticDirConfig) {\n roots.add(\n safeNormalize(path.join(staticDirConfig, path.dirname(docPath))),\n );\n }\n }\n }\n\n return Array.from(roots);\n};\n\nexport const resolveAbsolutePath = (\n input: string,\n allowedRoots: string[],\n): string | null => {\n if (!input) return null;\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const normalizedRoots = allowedRoots.map(safeNormalize);\n\n if (path.isAbsolute(trimmed)) {\n const normalized = safeNormalize(trimmed);\n return normalizedRoots.some((root) => isWithinRoot(normalized, root))\n ? normalized\n : null;\n }\n\n for (const root of normalizedRoots) {\n const candidate = safeNormalize(path.join(root, trimmed));\n if (isWithinRoot(candidate, root)) {\n return candidate;\n }\n }\n\n return null;\n};\n","import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport payload, { type Payload, type PayloadRequest } from \"payload\";\nimport type { CollectionConfig, SanitizedCollectionConfig } from \"payload\";\n\nexport type PayloadClient = {\n findByID: (args: { collection: string; id: string }) => Promise<any>;\n update: (args: {\n collection: string;\n id: string;\n data: Record<string, any>;\n }) => Promise<any>;\n getCollectionConfig?: (\n slug: string,\n ) => (CollectionConfig | SanitizedCollectionConfig) | undefined;\n};\n\nlet cachedClient: PayloadClient | null = null;\nlet localInitialized = false;\n\nconst normalizeConfigPath = (configPath: string): string => {\n if (configPath.startsWith(\"file://\")) return configPath;\n return pathToFileURL(path.resolve(configPath)).href;\n};\n\nconst buildAuthHeaders = (token: string): Record<string, string> => ({\n Authorization: `Bearer ${token}`,\n \"X-Payload-API-Key\": token,\n});\n\nconst initLocalPayload = async (): Promise<PayloadClient | null> => {\n const secret = process.env.PAYLOAD_SECRET;\n const mongoURL = process.env.MONGODB_URI;\n\n if (!secret || !mongoURL) {\n return null;\n }\n\n try {\n const configPath = process.env.PAYLOAD_CONFIG_PATH;\n let configModule: unknown;\n\n if (configPath) {\n const imported = await import(normalizeConfigPath(configPath));\n configModule = imported?.default ?? imported;\n }\n\n if (!localInitialized) {\n const initOptions: Record<string, unknown> = {\n secret,\n mongoURL,\n local: true,\n };\n\n if (configModule) {\n initOptions.config = configModule;\n }\n\n await payload.init(initOptions as any);\n localInitialized = true;\n }\n\n const instance: Payload = payload;\n\n return {\n findByID: ({ collection, id }) =>\n instance.findByID({\n collection,\n id,\n }),\n update: ({ collection, id, data }) =>\n instance.update({\n collection,\n id,\n data,\n }),\n getCollectionConfig: (slug: string) =>\n instance.collections?.[slug]?.config,\n } satisfies PayloadClient;\n } catch (error) {\n console.warn(\n \"[video-processor] Failed to initialize Payload locally, falling back to REST client.\",\n error,\n );\n return null;\n }\n};\n\nconst initRestClient = async (): Promise<PayloadClient> => {\n const baseUrl =\n process.env.PAYLOAD_REST_URL ||\n process.env.PAYLOAD_PUBLIC_URL ||\n process.env.PAYLOAD_SERVER_URL;\n const token = process.env.PAYLOAD_ADMIN_TOKEN;\n\n if (!baseUrl || !token) {\n throw new Error(\n \"Unable to establish Payload REST client. Provide PAYLOAD_REST_URL (or PAYLOAD_PUBLIC_URL) and PAYLOAD_ADMIN_TOKEN.\",\n );\n }\n\n const base = baseUrl.replace(/\\/$/, \"\");\n const headers = buildAuthHeaders(token);\n\n const request = async <T>(url: string, init?: RequestInit): Promise<T> => {\n const response = await fetch(url, {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...headers,\n ...init?.headers,\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `Payload REST request failed (${response.status}): ${text}`,\n );\n }\n\n return (await response.json()) as T;\n };\n\n return {\n findByID: async ({ collection, id }) => {\n const result = await request<{ doc?: any }>(\n `${base}/api/${collection}/${id}`,\n );\n return (result as any).doc ?? result;\n },\n update: async ({ collection, id, data }) => {\n const result = await request<{ doc?: any }>(\n `${base}/api/${collection}/${id}`,\n {\n method: \"PATCH\",\n body: JSON.stringify(data),\n },\n );\n return (result as any).doc ?? result;\n },\n } satisfies PayloadClient;\n};\n\nexport const getPayloadClient = async (): Promise<PayloadClient> => {\n if (cachedClient) return cachedClient;\n\n const localClient = await initLocalPayload();\n if (localClient) {\n cachedClient = localClient;\n return localClient;\n }\n\n const restClient = await initRestClient();\n cachedClient = restClient;\n return restClient;\n};\n\nexport const getCollectionConfigFromRequest = (\n req: PayloadRequest,\n slug: string,\n): CollectionConfig | null => {\n const payloadInstance = req.payload as Payload & {\n config?: Payload[\"config\"];\n };\n\n const collections = (payloadInstance as any)?.collections;\n const fromCollections = collections?.[slug];\n if (fromCollections) {\n if (typeof fromCollections.config === \"object\") {\n return fromCollections.config as CollectionConfig;\n }\n if (typeof fromCollections === \"object\") {\n return fromCollections as CollectionConfig;\n }\n }\n\n const configured = Array.isArray(payloadInstance.config?.collections)\n ? payloadInstance.config?.collections\n : undefined;\n\n if (configured) {\n const match = configured.find(\n (collection) => collection && collection.slug === slug,\n );\n if (match) {\n return match as CollectionConfig;\n }\n }\n\n return null;\n};\n","import fs from \"node:fs/promises\";\n\nimport { z } from \"zod\";\nimport type { PayloadRequest } from \"payload\";\n\nimport type { AccessControl, VariantRecord } from \"../types\";\nimport { gatherAllowedRoots, resolveAbsolutePath } from \"../utils/filesystem\";\nimport { getCollectionConfigFromRequest } from \"../utils/payload\";\nimport { readRequestBody, type RequestWithBody } from \"./shared\";\n\nconst bodySchema = z\n .object({\n collection: z.string().min(1, \"collection is required\"),\n id: z.string().min(1, \"id is required\"),\n preset: z.string().min(1).optional(),\n variantId: z.string().min(1).optional(),\n variantIndex: z\n .union([z.number().int().nonnegative(), z.string().regex(/^\\d+$/)])\n .optional(),\n })\n .superRefine((value, ctx) => {\n if (\n typeof value.variantIndex === \"undefined\" &&\n !value.variantId &&\n !value.preset\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"preset, variantId or variantIndex must be provided to remove a variant.\",\n path: [\"variantIndex\"],\n });\n }\n });\n\ntype RemoveRequest = RequestWithBody & PayloadRequest;\n\nexport const createRemoveVariantHandler =\n ({ access }: { access?: AccessControl }) =>\n async (req: RemoveRequest): Promise<Response> => {\n try {\n const rawBody = await readRequestBody(req);\n const parsed = bodySchema.parse(rawBody);\n const variantIndex =\n typeof parsed.variantIndex === \"number\"\n ? parsed.variantIndex\n : typeof parsed.variantIndex === \"string\"\n ? Number(parsed.variantIndex)\n : undefined;\n\n if (Number.isNaN(variantIndex)) {\n return Response.json(\n { error: \"variantIndex must be a non-negative integer.\" },\n { status: 400 },\n );\n }\n\n if (access?.removeVariant) {\n const allowed = await access.removeVariant({\n req,\n collection: parsed.collection,\n id: parsed.id,\n preset: parsed.preset,\n variantId: parsed.variantId,\n variantIndex,\n });\n if (!allowed) {\n return Response.json(\n { error: \"Not allowed to remove video variants.\" },\n { status: 403 },\n );\n }\n }\n\n const payloadClient = req.payload;\n const doc = await payloadClient\n .findByID({\n collection: parsed.collection,\n id: parsed.id,\n })\n .catch((error: unknown) => {\n console.error(\"[video-processor] Failed to load document\", error);\n return null;\n });\n\n if (!doc) {\n return Response.json({ error: \"Document not found.\" }, { status: 404 });\n }\n\n const variants: VariantRecord[] = Array.isArray(doc.variants)\n ? doc.variants\n : [];\n\n let targetIndex =\n typeof variantIndex === \"number\" ? variantIndex : Number.NaN;\n\n if (Number.isNaN(targetIndex) && parsed.variantId) {\n targetIndex = variants.findIndex(\n (variant: VariantRecord | null | undefined) =>\n Boolean(\n variant &&\n typeof variant === \"object\" &&\n (variant as any).id === parsed.variantId,\n ),\n );\n }\n\n if (Number.isNaN(targetIndex) && parsed.preset) {\n targetIndex = variants.findIndex(\n (variant: VariantRecord | null | undefined) =>\n Boolean(\n variant &&\n typeof variant === \"object\" &&\n variant.preset === parsed.preset,\n ),\n );\n }\n\n if (!Number.isInteger(targetIndex) || targetIndex < 0) {\n return Response.json({ error: \"Variant not found.\" }, { status: 404 });\n }\n\n const targetVariant = variants[targetIndex];\n if (!targetVariant || typeof targetVariant !== \"object\") {\n return Response.json({ error: \"Variant not found.\" }, { status: 404 });\n }\n\n const collectionConfig = getCollectionConfigFromRequest(\n req,\n parsed.collection,\n );\n const allowedRoots = gatherAllowedRoots({\n collection: collectionConfig,\n doc,\n });\n\n const variantPath =\n typeof (targetVariant as any).path === \"string\"\n ? (targetVariant as any).path.trim()\n : \"\";\n let resolvedVariantPath: string | null = null;\n if (variantPath) {\n resolvedVariantPath = resolveAbsolutePath(variantPath, allowedRoots);\n if (!resolvedVariantPath) {\n return Response.json(\n { error: \"Variant path is outside allowed directories.\" },\n { status: 400 },\n );\n }\n }\n\n const nextVariants = variants.filter(\n (_variant, index) => index !== targetIndex,\n );\n\n if (resolvedVariantPath) {\n await fs.rm(resolvedVariantPath).catch(() => {\n console.warn(\n `[video-processor] Could not remove variant file at ${resolvedVariantPath}`,\n );\n });\n } else {\n const fallbackUrl =\n typeof (targetVariant as any).url === \"string\"\n ? (targetVariant as any).url\n : \"\";\n const fallbackFilename = fallbackUrl.split(\"/\").pop();\n if (fallbackFilename) {\n const fallbackPath = resolveAbsolutePath(\n fallbackFilename,\n allowedRoots,\n );\n if (fallbackPath) {\n await fs.rm(fallbackPath).catch(() => {\n console.warn(\n `[video-processor] Could not remove fallback variant file at ${fallbackPath}`,\n );\n });\n }\n }\n }\n\n const updated = await payloadClient.update({\n collection: parsed.collection,\n id: doc.id ?? parsed.id,\n data: { variants: nextVariants },\n });\n\n return Response.json({ success: true, doc: updated });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return Response.json(\n { error: error.message, issues: error.issues },\n { status: 400 },\n );\n }\n console.error(\"[video-processor] Failed to remove variant\", error);\n return Response.json(\n { error: \"Unable to remove video variant.\" },\n { status: 500 },\n );\n }\n };\n","import path from \"node:path\";\nimport fs from \"node:fs/promises\";\n\nimport { z } from \"zod\";\nimport type { PayloadRequest } from \"payload\";\n\nimport type { AccessControl, VariantRecord } from \"../types\";\nimport { gatherAllowedRoots, resolveAbsolutePath } from \"../utils/filesystem\";\nimport { getCollectionConfigFromRequest } from \"../utils/payload\";\nimport { readRequestBody, type RequestWithBody } from \"./shared\";\n\nconst bodySchema = z.object({\n collection: z.string().min(1, \"collection is required\"),\n id: z.string().min(1, \"id is required\"),\n preset: z.string().min(1).optional(),\n});\n\ntype ReplaceRequest = RequestWithBody & PayloadRequest;\n\nexport const createReplaceOriginalHandler =\n ({ access }: { access?: AccessControl }) =>\n async (req: ReplaceRequest): Promise<Response> => {\n try {\n const rawBody = await readRequestBody(req);\n const parsed = bodySchema.parse(rawBody);\n\n if (access?.replaceOriginal) {\n const allowed = await access.replaceOriginal({\n req,\n collection: parsed.collection,\n id: parsed.id,\n preset: parsed.preset,\n });\n if (!allowed) {\n return Response.json(\n { error: \"Not allowed to replace original video.\" },\n { status: 403 },\n );\n }\n }\n\n const payloadClient = req.payload;\n const doc = await payloadClient\n .findByID({\n collection: parsed.collection,\n id: parsed.id,\n })\n .catch((error: unknown) => {\n console.error(\n \"[video-processor] Failed to load document for replace-original\",\n error,\n );\n return null;\n });\n\n if (!doc) {\n return Response.json({ error: \"Document not found.\" }, { status: 404 });\n }\n\n const variants: VariantRecord[] = Array.isArray(doc.variants)\n ? [...doc.variants]\n : [];\n\n if (variants.length === 0) {\n return Response.json(\n { error: \"No variants are available for replacement.\" },\n { status: 400 },\n );\n }\n\n const targetVariant = parsed.preset\n ? variants.find((variant) => variant?.preset === parsed.preset)\n : variants[0];\n\n if (!targetVariant) {\n return Response.json(\n { error: \"Requested variant was not found.\" },\n { status: 404 },\n );\n }\n\n const collectionConfig = getCollectionConfigFromRequest(\n req,\n parsed.collection,\n );\n const allowedRoots = gatherAllowedRoots({\n collection: collectionConfig,\n doc,\n });\n\n const variantPath =\n typeof targetVariant.path === \"string\" ? targetVariant.path.trim() : \"\";\n if (!variantPath) {\n return Response.json(\n { error: \"Variant does not expose a file path.\" },\n { status: 400 },\n );\n }\n\n const resolvedVariantPath = resolveAbsolutePath(\n variantPath,\n allowedRoots,\n );\n if (!resolvedVariantPath) {\n return Response.json(\n { error: \"Variant path is outside allowed directories.\" },\n { status: 400 },\n );\n }\n\n const originalPath =\n typeof doc.path === \"string\" && doc.path.trim().length > 0\n ? doc.path.trim()\n : typeof doc.filename === \"string\" && doc.filename.trim().length > 0\n ? doc.filename.trim()\n : \"\";\n\n const resolvedOriginalPath = originalPath\n ? resolveAbsolutePath(originalPath, allowedRoots)\n : null;\n\n if (!resolvedOriginalPath) {\n return Response.json(\n { error: \"Original file path could not be resolved.\" },\n { status: 400 },\n );\n }\n\n await fs.rm(resolvedOriginalPath).catch(() => undefined);\n await fs.mkdir(path.dirname(resolvedOriginalPath), { recursive: true });\n await fs.rename(resolvedVariantPath, resolvedOriginalPath);\n\n const updateData: Record<string, unknown> = {\n variants: variants.filter(\n (variant) => variant?.preset !== targetVariant.preset,\n ),\n };\n\n if (typeof targetVariant.size === \"number\") {\n updateData.filesize = targetVariant.size;\n }\n if (typeof targetVariant.duration === \"number\") {\n updateData.duration = targetVariant.duration;\n }\n if (typeof targetVariant.width === \"number\") {\n updateData.width = targetVariant.width;\n }\n if (typeof targetVariant.height === \"number\") {\n updateData.height = targetVariant.height;\n }\n if (typeof targetVariant.bitrate === \"number\") {\n updateData.bitrate = targetVariant.bitrate;\n }\n\n const updated = await payloadClient.update({\n collection: parsed.collection,\n id: doc.id ?? parsed.id,\n data: updateData,\n });\n\n return Response.json({ success: true, doc: updated });\n } catch (error) {\n if (error instanceof z.ZodError) {\n return Response.json(\n { error: error.message, issues: error.issues },\n { status: 400 },\n );\n }\n\n console.error(\"[video-processor] Failed to replace original\", error);\n return Response.json(\n { error: \"Unable to replace original video file.\" },\n { status: 500 },\n );\n }\n };\n","import { CropRect } from \"../types\";\nimport type { CropData } from \"../queue/job.types\";\n\nexport type Dimensions = {\n width?: number;\n height?: number;\n};\n\nexport type BuildArgsInput = {\n presetArgs: string[];\n crop?: CropRect | CropData;\n dimensions?: Dimensions;\n defaultCrf?: number;\n};\n\nexport type BuildArgsResult = {\n globalOptions: string[];\n outputOptions: string[];\n};\n\nconst FASTSTART_FLAGS = [\"-movflags\", \"+faststart\"];\nconst CRF_FLAG = \"-crf\";\n\nconst hasCrf = (args: string[]): boolean => {\n for (let i = 0; i < args.length; i += 1) {\n if (args[i] === CRF_FLAG) {\n return true;\n }\n }\n\n return false;\n};\n\nconst hasFaststart = (args: string[]): boolean => {\n for (let i = 0; i < args.length; i += 1) {\n if (args[i] === \"-movflags\") {\n const value = args[i + 1];\n if (typeof value === \"string\" && value.includes(\"faststart\")) {\n return true;\n }\n }\n }\n\n return false;\n};\n\nconst extractFilters = (\n args: string[],\n): { rest: string[]; filters: string[] } => {\n const rest: string[] = [];\n const filters: string[] = [];\n\n for (let i = 0; i < args.length; i += 1) {\n const current = args[i];\n if (current === \"-vf\" || current === \"-filter:v\") {\n const value = args[i + 1];\n if (typeof value === \"string\") {\n filters.push(value);\n }\n i += 1;\n } else {\n rest.push(current);\n }\n }\n\n return { rest, filters };\n};\n\nconst clamp = (value: number, min: number, max: number): number => {\n if (Number.isNaN(value)) return min;\n if (value < min) return min;\n if (value > max) return max;\n return value;\n};\n\nconst buildCropFilter = (\n crop: CropRect | CropData,\n dimensions?: Dimensions,\n): string | undefined => {\n if (!dimensions?.width || !dimensions?.height) return undefined;\n\n const cropWidth = Math.max(1, Math.round(dimensions.width * crop.width));\n const cropHeight = Math.max(1, Math.round(dimensions.height * crop.height));\n\n const maxX = Math.max(0, dimensions.width - cropWidth);\n const maxY = Math.max(0, dimensions.height - cropHeight);\n\n const x = clamp(Math.round(dimensions.width * crop.x), 0, maxX);\n const y = clamp(Math.round(dimensions.height * crop.y), 0, maxY);\n\n return `crop=${cropWidth}:${cropHeight}:${x}:${y}`;\n};\n\n/**\n * Build ffmpeg argument lists from preset args, injecting defaults such as CRF\n * and faststart flags. Crop instructions are folded into the video filter chain\n * while preserving any filters defined by the preset.\n */\nexport const buildFfmpegArgs = ({\n presetArgs,\n crop,\n dimensions,\n defaultCrf = 24,\n}: BuildArgsInput): BuildArgsResult => {\n const args = [...presetArgs];\n const { rest, filters } = extractFilters(args);\n\n if (!hasCrf(rest)) {\n rest.push(CRF_FLAG, String(defaultCrf));\n }\n\n if (!hasFaststart(rest)) {\n rest.push(...FASTSTART_FLAGS);\n }\n\n if (crop) {\n const cropFilter = buildCropFilter(crop, dimensions);\n if (cropFilter) {\n filters.push(cropFilter);\n }\n }\n\n if (filters.length > 0) {\n rest.push(\"-vf\", filters.join(\",\"));\n }\n\n return {\n globalOptions: [\"-y\"],\n outputOptions: rest,\n };\n};\n","import ffmpeg from \"fluent-ffmpeg\";\nimport ffprobeStatic from \"ffprobe-static\";\n\nexport type VideoMetadata = {\n width?: number;\n height?: number;\n duration?: number;\n bitrate?: number;\n};\n\nif (ffprobeStatic.path) {\n ffmpeg.setFfprobePath(ffprobeStatic.path);\n}\n\nexport const probeVideo = async (filePath: string): Promise<VideoMetadata> =>\n new Promise((resolve, reject) => {\n ffmpeg.ffprobe(filePath, (error, metadata) => {\n if (error) {\n reject(error);\n return;\n }\n\n const videoStream = metadata.streams.find(\n (stream) => stream.codec_type === \"video\",\n );\n const width = videoStream?.width;\n const height = videoStream?.height;\n\n const durationRaw = videoStream?.duration ?? metadata.format?.duration;\n const duration =\n typeof durationRaw !== \"undefined\" ? Number(durationRaw) : undefined;\n\n const bitrateRaw = videoStream?.bit_rate ?? metadata.format?.bit_rate;\n const bitrate =\n typeof bitrateRaw !== \"undefined\" ? Number(bitrateRaw) : undefined;\n\n resolve({\n width: width ?? undefined,\n height: height ?? undefined,\n duration: Number.isNaN(duration) ? undefined : duration,\n bitrate: Number.isNaN(bitrate) ? undefined : bitrate,\n });\n });\n });\n","import path from \"node:path\";\nimport type { ResolvePathsArgs, ResolvePathsResult } from \"../types\";\n\nconst normalizeUrl = (input?: string, filename?: string): string => {\n if (!input) return filename ?? \"\";\n const parts = input.split(\"?\");\n const base = parts[0];\n const query = parts[1] ? `?${parts.slice(1).join(\"?\")}` : \"\";\n const lastSlash = base.lastIndexOf(\"/\");\n if (lastSlash === -1) {\n return filename ?? base;\n }\n\n const prefix = base.slice(0, lastSlash);\n const sanitized = filename ?? base.slice(lastSlash + 1);\n return `${prefix}/${sanitized}${query}`;\n};\n\nexport const defaultResolvePaths = ({\n original,\n presetName,\n}: ResolvePathsArgs): ResolvePathsResult => {\n const originalFilename = original.filename ?? path.basename(original.path);\n const extension =\n path.extname(originalFilename) || path.extname(original.path) || \".mp4\";\n const baseName = path.basename(originalFilename, extension);\n const variantFilename = `${baseName}_${presetName}${extension || \".mp4\"}`;\n\n const originalDir = path.dirname(original.path);\n const absoluteDir = path.isAbsolute(original.path)\n ? originalDir\n : path.join(process.cwd(), originalDir);\n\n const url = normalizeUrl(original.url, variantFilename);\n\n return {\n dir: absoluteDir,\n filename: variantFilename,\n url,\n };\n};\n\nexport const buildStoredPath = (\n originalPath: string,\n variantFilename: string,\n): string => {\n const originalDir = path.dirname(originalPath);\n return path.join(originalDir, variantFilename);\n};\n\nexport const buildWritePath = (dir: string, filename: string): string =>\n path.join(dir, filename);\n","import path from \"node:path\";\nimport { mkdir, stat } from \"node:fs/promises\";\nimport ffmpeg from \"fluent-ffmpeg\";\nimport ffmpegStatic from \"ffmpeg-static\";\nimport ffprobeStatic from \"ffprobe-static\";\nimport { Worker } from \"bullmq\";\nimport IORedis from \"ioredis\";\nimport type { VideoPluginOptions, VariantRecord } from \"../types\";\nimport { ensureOptions } from \"../options\";\nimport { videoJobSchema, type VideoJobData } from \"./job.types\";\nimport { buildFfmpegArgs } from \"../ffmpeg/args\";\nimport { probeVideo } from \"../ffmpeg/probe\";\nimport {\n buildStoredPath,\n buildWritePath,\n defaultResolvePaths,\n} from \"../utils/paths\";\nimport { getPayloadClient } from \"../utils/payload\";\n\nconst envFfmpegPath = process.env.FFMPEG_BIN?.trim();\nconst ffmpegBinary =\n envFfmpegPath && envFfmpegPath.length > 0\n ? envFfmpegPath\n : typeof ffmpegStatic === \"string\"\n ? ffmpegStatic\n : null;\nif (ffmpegBinary) {\n ffmpeg.setFfmpegPath(ffmpegBinary);\n}\nif (ffprobeStatic.path) {\n ffmpeg.setFfprobePath(ffprobeStatic.path);\n}\n\nexport const createWorker = async (\n rawOptions: VideoPluginOptions,\n): Promise<Worker<VideoJobData>> => {\n const options = ensureOptions(rawOptions);\n const presets = options.presets;\n const queueName = options.queue?.name ?? \"video-transcode\";\n const concurrency = options.queue?.concurrency ?? 1;\n const redisUrl = options.queue?.redisUrl ?? process.env.REDIS_URL;\n\n const connection = redisUrl\n ? new IORedis(redisUrl, { maxRetriesPerRequest: null })\n : new IORedis({ maxRetriesPerRequest: null });\n\n const worker = new Worker<VideoJobData>(\n queueName,\n async (job) => {\n const parsed = videoJobSchema.parse(job.data);\n const preset = presets[parsed.preset];\n if (!preset) {\n throw new Error(`Unknown preset ${parsed.preset}`);\n }\n\n job.updateProgress(5);\n\n const client = await getPayloadClient();\n const document = await client.findByID({\n collection: parsed.collection,\n id: parsed.id,\n });\n\n if (!document) {\n throw new Error(\n `Document ${parsed.id} in collection ${parsed.collection} not found`,\n );\n }\n\n const originalPath: string | undefined = document?.path;\n const filename: string | undefined = document?.filename;\n const url: string | undefined = document?.url;\n\n if (!originalPath) {\n throw new Error(\"Source document does not expose a `path` property.\");\n }\n\n const absoluteInputPath = path.isAbsolute(originalPath)\n ? originalPath\n : path.join(process.cwd(), originalPath);\n\n const inputMetadata = await probeVideo(absoluteInputPath);\n job.updateProgress(15);\n\n const resolvePaths = options.resolvePaths ?? defaultResolvePaths;\n const collectionConfig =\n client.getCollectionConfig?.(parsed.collection) ?? null;\n\n const resolved = resolvePaths({\n doc: document,\n collection: collectionConfig,\n collectionSlug: parsed.collection,\n original: {\n filename: filename ?? path.basename(originalPath),\n path: originalPath,\n url: url ?? \"\",\n },\n presetName: parsed.preset,\n });\n\n const writeDir = resolved.dir;\n const writeFilename = resolved.filename;\n const targetUrl = resolved.url;\n const writePath = buildWritePath(writeDir, writeFilename);\n\n await mkdir(writeDir, { recursive: true });\n\n const { globalOptions, outputOptions } = buildFfmpegArgs({\n presetArgs: preset.args,\n crop: parsed.crop,\n dimensions: {\n width: inputMetadata.width,\n height: inputMetadata.height,\n },\n });\n\n await new Promise<void>((resolve, reject) => {\n const command = ffmpeg(absoluteInputPath);\n globalOptions.forEach((option) => command.addOption(option));\n command.outputOptions(outputOptions);\n command.output(writePath);\n command.on(\"progress\", (progress) => {\n if (typeof progress.percent === \"number\") {\n const bounded = Math.min(95, 15 + progress.percent * 0.7);\n void job.updateProgress(bounded);\n }\n });\n command.on(\"end\", () => resolve());\n command.on(\"error\", (error) => reject(error));\n command.run();\n });\n\n const fileStats = await stat(writePath);\n const outputMetadata = await probeVideo(writePath);\n\n const storedPath = buildStoredPath(originalPath, writeFilename);\n const variant: VariantRecord = {\n preset: parsed.preset,\n url: targetUrl,\n path: storedPath,\n size: fileStats.size,\n duration: outputMetadata.duration ?? inputMetadata.duration,\n width: outputMetadata.width ?? inputMetadata.width,\n height: outputMetadata.height ?? inputMetadata.height,\n bitrate: outputMetadata.bitrate,\n createdAt: new Date().toISOString(),\n };\n\n const existingVariants: VariantRecord[] = Array.isArray(document.variants)\n ? document.variants\n : [];\n\n const nextVariants = [\n ...existingVariants.filter((item) => item?.preset !== variant.preset),\n variant,\n ];\n\n await client.update({\n collection: parsed.collection,\n id: parsed.id,\n data: {\n variants: nextVariants,\n },\n });\n\n await job.updateProgress(100);\n\n return variant;\n },\n {\n connection,\n concurrency,\n },\n );\n\n worker.on(\"failed\", (job, error) => {\n console.error(`[video-processor] Job ${job?.id} failed`, error);\n });\n\n worker.on(\"completed\", (job) => {\n console.log(`[video-processor] Job ${job.id} completed`);\n });\n\n await worker.waitUntilReady();\n console.log(`[video-processor] Worker listening on queue ${queueName}`);\n\n const shutdown = async () => {\n await worker.close();\n await connection.quit();\n };\n\n process.once(\"SIGINT\", () => {\n void shutdown().then(() => process.exit(0));\n });\n process.once(\"SIGTERM\", () => {\n void shutdown().then(() => process.exit(0));\n });\n\n return worker;\n};\n","import { ensureOptions, normalizePresets } from \"./options\";\nimport type {\n VideoPluginOptions,\n Preset,\n PayloadPluginFactory,\n PayloadConfig,\n VideoVariantFieldConfig,\n FieldConfig,\n CollectionConfig,\n} from \"./types\";\nimport { createQueue } from \"./queue/createQueue\";\nimport { createEnqueueHandler } from \"./api/enqueue\";\nimport { createStatusHandler } from \"./api/status\";\nimport { createRemoveVariantHandler } from \"./api/removeVariant\";\nimport { createReplaceOriginalHandler } from \"./api/replaceOriginal\";\nexport { createWorker } from \"./queue/createWorker\";\nexport { defaultResolvePaths } from \"./utils/paths\";\nexport type {\n Preset,\n VideoPluginOptions,\n VariantRecord,\n PayloadPluginFactory,\n PayloadConfig,\n} from \"./types\";\n\n// Client entry used by Payload's import map. The `client` export is a thin\n// wrapper that re-exports the actual VideoField component so that Next can\n// treat it as a proper client reference (`.../client#VideoField`), matching\n// the pattern used by official Payload plugins.\nconst adminFieldPath =\n \"@kimjansheden/payload-video-processor/client#VideoField\";\n\nconst acceptsVideoUploads = (collection: CollectionConfig): boolean => {\n const upload = collection.upload;\n if (!upload) return false;\n\n if (upload === true) {\n return false;\n }\n\n const mimeTypes = Array.isArray(upload?.mimeTypes) ? upload.mimeTypes : [];\n return mimeTypes.some((type: string) => type.startsWith(\"video/\"));\n};\n\nconst createVariantsField = (): FieldConfig => ({\n name: \"variants\",\n type: \"array\",\n label: \"Video variants\",\n admin: {\n readOnly: true,\n },\n defaultValue: [],\n fields: [\n {\n name: \"preset\",\n label: \"Preset\",\n type: \"text\",\n admin: { readOnly: true },\n },\n {\n name: \"url\",\n label: \"URL\",\n type: \"text\",\n admin: { readOnly: true },\n },\n {\n name: \"path\",\n label: \"Path\",\n type: \"text\",\n admin: { readOnly: true },\n },\n {\n name: \"size\",\n label: \"Size (bytes)\",\n type: \"number\",\n admin: { readOnly: true },\n },\n {\n name: \"duration\",\n label: \"Duration (s)\",\n type: \"number\",\n admin: { readOnly: true },\n },\n {\n name: \"width\",\n label: \"Width\",\n type: \"number\",\n admin: { readOnly: true },\n },\n {\n name: \"height\",\n label: \"Height\",\n type: \"number\",\n admin: { readOnly: true },\n },\n {\n name: \"bitrate\",\n label: \"Bitrate\",\n type: \"number\",\n admin: { readOnly: true },\n },\n {\n name: \"createdAt\",\n label: \"Created\",\n type: \"date\",\n admin: { readOnly: true },\n },\n ],\n});\n\nconst buildAdminPresetMap = (presets: Record<string, Preset>) =>\n Object.fromEntries(\n Object.entries(presets).map(([name, preset]) => [\n name,\n {\n label: preset.label ?? name,\n enableCrop: Boolean(preset.enableCrop),\n },\n ]),\n );\n\nconst trimTrailingSlash = (value: string): string =>\n value.endsWith(\"/\") ? value.slice(0, -1) : value;\n\n// In Payload, custom endpoints are mounted under `config.routes.api` automatically.\n// Paths provided here should be relative to that base (i.e., do NOT include `/api`).\nconst getApiBasePath = (_config: PayloadConfig): string => \"\";\n\nconst pluginFactory = (\n rawOptions: VideoPluginOptions,\n): PayloadPluginFactory => {\n const options = ensureOptions(rawOptions);\n const presets = normalizePresets(options.presets);\n\n const plugin: PayloadPluginFactory = (config: PayloadConfig) => {\n const queueName = options.queue?.name ?? \"video-transcode\";\n const redisUrl = options.queue?.redisUrl ?? process.env.REDIS_URL;\n const apiBase = getApiBasePath(config); // empty string; paths are relative to the API base\n const endpointEnqueuePath = `${apiBase}/video-queue/enqueue`;\n const endpointStatusBase = `${apiBase}/video-queue/status`;\n const endpointReplaceOriginalPath = `${apiBase}/video-queue/replace-original`;\n const endpointRemoveVariantPath = `${apiBase}/video-queue/remove-variant`;\n\n const routesApiBase = trimTrailingSlash(config.routes?.api ?? \"/api\");\n const clientEnqueuePath = `${routesApiBase}/video-queue/enqueue`;\n const clientStatusBase = `${routesApiBase}/video-queue/status`;\n const clientReplaceOriginalPath = `${routesApiBase}/video-queue/replace-original`;\n const clientRemoveVariantPath = `${routesApiBase}/video-queue/remove-variant`;\n\n console.log(\n `[payload-video-processor] enabled (queue: ${queueName}, presets: ${Object.keys(presets).length})`,\n );\n\n const queueRef: { queue?: ReturnType<typeof createQueue> } = {};\n const getQueue = () => {\n if (!queueRef.queue) {\n queueRef.queue = createQueue({ name: queueName, redisUrl });\n }\n return queueRef.queue.queue;\n };\n\n const collections = (config.collections ?? []).map(\n (collection: CollectionConfig) => {\n if (!acceptsVideoUploads(collection)) {\n return collection;\n }\n\n const fields: FieldConfig[] = [...(collection.fields ?? [])];\n\n const hasVariantsField = fields.some(\n (field) => \"name\" in field && field.name === \"variants\",\n );\n if (!hasVariantsField) {\n fields.push(createVariantsField());\n }\n\n const hasControlField = fields.some(\n (field) => \"name\" in field && field.name === \"videoProcessing\",\n );\n if (!hasControlField) {\n const clientProps = {\n presets: buildAdminPresetMap(presets),\n enqueuePath: clientEnqueuePath,\n statusPath: clientStatusBase,\n replaceOriginalPath: clientReplaceOriginalPath,\n removeVariantPath: clientRemoveVariantPath,\n queueName,\n collectionSlug: collection.slug,\n } satisfies VideoVariantFieldConfig;\n\n const controlField: FieldConfig = {\n name: \"videoProcessing\",\n type: \"ui\",\n label: \"Video processing\",\n admin: {\n components: {\n Field: {\n path: adminFieldPath,\n clientProps,\n },\n },\n position: \"sidebar\",\n },\n custom: clientProps,\n };\n fields.push(controlField);\n }\n\n return {\n ...collection,\n fields,\n } satisfies CollectionConfig;\n },\n );\n\n const endpoints = [\n {\n method: \"post\",\n path: endpointEnqueuePath,\n handler: createEnqueueHandler({\n getQueue,\n presets,\n access: options.access,\n }),\n },\n {\n method: \"get\",\n path: `${endpointStatusBase}/:jobId`,\n handler: createStatusHandler({ getQueue }),\n },\n {\n method: \"post\",\n path: endpointReplaceOriginalPath,\n handler: createReplaceOriginalHandler({ access: options.access }),\n },\n {\n method: \"post\",\n path: endpointRemoveVariantPath,\n handler: createRemoveVariantHandler({ access: options.access }),\n },\n ] satisfies NonNullable<PayloadConfig[\"endpoints\"]>;\n\n const existingEndpoints = Array.isArray(config.endpoints)\n ? config.endpoints\n : [];\n\n return {\n ...config,\n collections,\n endpoints: [...existingEndpoints, ...endpoints],\n };\n };\n\n return plugin;\n};\n\nexport default pluginFactory;\n"]}
|