From d6341a1276353cc698080d2968e1b3e96a292075 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 10 Oct 2024 19:32:10 +0200 Subject: [PATCH] Create msd file format (#39) * Create msd file format --- packages/api/src/contract.ts | 13 ++++++---- .../artisan/src/consumer/workers/package.ts | 21 ++++++++++------ .../artisan/src/consumer/workers/transcode.ts | 24 +++++++++++-------- packages/artisan/src/producer/index.ts | 2 +- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/packages/api/src/contract.ts b/packages/api/src/contract.ts index 9b3b7318..aa330ba0 100644 --- a/packages/api/src/contract.ts +++ b/packages/api/src/contract.ts @@ -40,11 +40,14 @@ export const postTranscodeBodySchema = z.object({ export const postPackageBodySchema = z.object({ assetId: z.string(), - segmentSize: z.number().optional().openapi({ - default: 4, - description: - "Segment size, must be equal or a multiple of the segmentSize defined in transcode.", - }), + segmentSize: z + .number() + .optional() + .openapi({ + description: + "Segment size. When defined, must be equal or a multiple of the segmentSize defined in transcode. " + + "When not defined, will take the original segmentSize from transcode.", + }), tag: z.string().optional().openapi({ description: "An arbitrary tag, used to group jobs.", }), diff --git a/packages/artisan/src/consumer/workers/package.ts b/packages/artisan/src/consumer/workers/package.ts index aaec692e..e4febff2 100644 --- a/packages/artisan/src/consumer/workers/package.ts +++ b/packages/artisan/src/consumer/workers/package.ts @@ -12,12 +12,16 @@ import { streamSchema } from "@mixwave/shared/artisan"; import type { Job } from "bullmq"; import type { Code } from "iso-language-codes"; -const metaSchema = z.record(z.string(), streamSchema); +const metaSchema = z.object({ + version: z.number(), + streams: z.record(z.string(), streamSchema), + segmentSize: z.number(), +}); export type PackageData = { params: { assetId: string; - segmentSize: number; + segmentSize?: number; name: string; }; metadata: { @@ -39,16 +43,19 @@ export default async function (job: Job) { const dir = dirSync(); await downloadFolder(dir.name, `transcode/${params.assetId}`); - const metaFile = await metaSchema.parseAsync( + const meta = await metaSchema.parseAsync( JSON.parse(await readFile(`${dir.name}/meta.json`, "utf8")), ); + // If we do not specify the segmentSize, grab it from the meta file. + const segmentSize = params.segmentSize ?? meta.segmentSize; + const outDir = dirSync(); const packagerParams: string[][] = []; - for (const key of Object.keys(metaFile)) { - const stream = metaFile[key]; + for (const key of Object.keys(meta.streams)) { + const stream = meta.streams[key]; const file = parseFilePath(key); if (stream.type === "video") { @@ -90,9 +97,9 @@ export default async function (job: Job) { packagerArgs.push( "--segment_duration", - params.segmentSize.toString(), + segmentSize.toString(), "--fragment_duration", - params.segmentSize.toString(), + segmentSize.toString(), "--hls_master_playlist_output", "master_tmp.m3u8", ); diff --git a/packages/artisan/src/consumer/workers/transcode.ts b/packages/artisan/src/consumer/workers/transcode.ts index db892e29..1d229482 100644 --- a/packages/artisan/src/consumer/workers/transcode.ts +++ b/packages/artisan/src/consumer/workers/transcode.ts @@ -27,16 +27,20 @@ export default async function (job: Job) { const childrenValues = await fakeJob.getChildrenValues(); - const meta = Object.entries(childrenValues).reduce>( - (acc, [key, value]) => { - if (key.startsWith("bull:ffmpeg")) { - const ffmpegResult: FfmpegResult = value; - acc[ffmpegResult.name] = ffmpegResult.stream; - } - return acc; - }, - {}, - ); + const meta = { + version: 1, + streams: Object.entries(childrenValues).reduce>( + (acc, [key, value]) => { + if (key.startsWith("bull:ffmpeg")) { + const ffmpegResult: FfmpegResult = value; + acc[ffmpegResult.name] = ffmpegResult.stream; + } + return acc; + }, + {}, + ), + segmentSize: params.segmentSize, + }; await job.log(`Writing meta.json (${JSON.stringify(meta)})`); diff --git a/packages/artisan/src/producer/index.ts b/packages/artisan/src/producer/index.ts index dd131383..dcbe5053 100644 --- a/packages/artisan/src/producer/index.ts +++ b/packages/artisan/src/producer/index.ts @@ -137,7 +137,7 @@ type AddPackageJobData = { export async function addPackageJob({ assetId, - segmentSize = 4, + segmentSize, name = "hls", tag, }: AddPackageJobData) {