From 6111b6acb38ea0d9d2774bdb5b4d53a94490b350 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Wed, 3 Jun 2026 15:35:32 +0000 Subject: [PATCH] refactor(transcode): replace any types in Encore methods with generated EncoreJobRequest/Response Replaces implicit any with proper generated types from @osaas/client-services: - encore.ts: import EncoreJobResponse and use in createFetch - transcode.ts: use EncoreJobRequest for job body, EncoreJobResponse[] in JobList - vodpipeline.ts: use EncoreJobRequest for job body, cast response as EncoreJobResponse - index.ts: re-export EncoreJobRequest and EncoreJobResponse for consumers Closes #133. Part of Eyevinn/osaas-app#4345. Co-Authored-By: Claude --- packages/transcode/src/encore.ts | 6 ++--- packages/transcode/src/index.ts | 4 ++++ packages/transcode/src/transcode.ts | 33 +++++++++++++++++++-------- packages/transcode/src/vodpipeline.ts | 14 ++++++++---- 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/packages/transcode/src/encore.ts b/packages/transcode/src/encore.ts index 404c814..31d6170 100644 --- a/packages/transcode/src/encore.ts +++ b/packages/transcode/src/encore.ts @@ -8,6 +8,7 @@ import { removeInstance, valueOrSecret } from '@osaas/client-core'; +import type { EncoreJobResponse } from '@osaas/client-services'; import { ValkeyDb } from '@osaas/client-db'; import { delay } from './util'; @@ -481,7 +482,7 @@ export class Encore { ); const jobId = Math.random().toString(36).substring(7); const encoreJobUrl = new URL('/encoreJobs', instance.url); - const data = await createFetch(encoreJobUrl, { + const data = await createFetch(encoreJobUrl, { method: 'POST', body: JSON.stringify({ profile: profile || 'program', @@ -501,8 +502,7 @@ export class Encore { 'Content-Type': 'application/json' } }); - const encoreJob = JSON.parse(data); - Log().debug(encoreJob); + Log().debug(data); } public async destroy() { diff --git a/packages/transcode/src/index.ts b/packages/transcode/src/index.ts index 6663404..27a77a0 100644 --- a/packages/transcode/src/index.ts +++ b/packages/transcode/src/index.ts @@ -1,6 +1,10 @@ /** @module @osaas/client-transcode */ export { EncoreCallbackListener, EncorePackager, Encore } from './encore'; export type { FileOutput } from './encore'; +export type { + EncoreJobRequest, + EncoreJobResponse +} from '@osaas/client-services'; export { QueuePool } from './pool'; export { vmafCompare } from './vmaf'; export { createStreamingPackage } from './packager'; diff --git a/packages/transcode/src/transcode.ts b/packages/transcode/src/transcode.ts index 92024ba..fcf1bb6 100644 --- a/packages/transcode/src/transcode.ts +++ b/packages/transcode/src/transcode.ts @@ -1,5 +1,9 @@ import { Context, Log } from '@osaas/client-core'; -import { getEncoreInstance } from '@osaas/client-services'; +import { + getEncoreInstance, + type EncoreJobRequest, + type EncoreJobResponse +} from '@osaas/client-services'; import { range } from './util'; export interface IDRKeyFrame { @@ -157,7 +161,18 @@ export async function transcode( reconnect_on_network_error: '1' }; } - const encoreJob: any = { + const encoreJob: Partial & { + baseName?: string; + seekTo?: number; + duration?: number; + inputs?: { type: string; copyTs?: boolean; uri: string; params?: object }[]; + profileParams?: { + keyframes?: string; + audioMixPreset?: string; + utcnowstring?: string; + }; + progressCallbackUri?: string; + } = { externalId: opts.externalId, profile, baseName, @@ -183,7 +198,7 @@ export async function transcode( const keyframes = opts.injectIDRKeyFrames.map((kf) => smpteTimecodeToFrames(kf.smpteTimeCode, frameRate) ); - encoreJob['profileParams'] = { + encoreJob.profileParams = { keyframes: `expr:not(mod(n,96))` + keyframes.map((f) => `+eq(n,${f})`).join('') }; @@ -192,17 +207,17 @@ export async function transcode( } } if (opts.audioMixPreset) { - encoreJob['profileParams'] = { - ...encoreJob['profileParams'], + encoreJob.profileParams = { + ...encoreJob.profileParams, audioMixPreset: opts.audioMixPreset }; } if (opts.callBackUrl) { - encoreJob['progressCallbackUri'] = opts.callBackUrl.toString(); + encoreJob.progressCallbackUri = opts.callBackUrl.toString(); } if (opts.insertCreationDateUtc) { - encoreJob['profileParams'] = { - ...encoreJob['profileParams'], + encoreJob.profileParams = { + ...encoreJob.profileParams, utcnowstring: formatUtcDateString() }; } @@ -281,7 +296,7 @@ export async function getTranscodeJob( interface JobList { _embedded: { - encoreJobs: any[]; + encoreJobs: EncoreJobResponse[]; }; page: { size: number; diff --git a/packages/transcode/src/vodpipeline.ts b/packages/transcode/src/vodpipeline.ts index 63f935e..0215e07 100644 --- a/packages/transcode/src/vodpipeline.ts +++ b/packages/transcode/src/vodpipeline.ts @@ -21,7 +21,9 @@ import { createEyevinnEncoreCallbackListenerInstance, createEyevinnEncorePackagerInstance, createMinioMinioInstance, - createValkeyIoValkeyInstance + createValkeyIoValkeyInstance, + type EncoreJobRequest, + type EncoreJobResponse } from '@osaas/client-services'; import * as Minio from 'minio'; import { delay } from './util'; @@ -483,7 +485,11 @@ export async function createVod( if (sourceUrl.protocol === 's3:' && !pipeline.inputStorage) { throw new Error('Input storage bucket required for S3 input'); } - const job = { + const job: Partial & { + baseName?: string; + progressCallbackUri?: string; + inputs?: { uri: string; seekTo?: number; copyTs?: boolean; type: string }[]; + } = { externalId, profile: vodOptions?.profile || 'program', outputFolder: '/usercontent/', @@ -507,7 +513,7 @@ export async function createVod( body: JSON.stringify(job) }); if (response.ok) { - const createdJob = (await response.json()) as { id: string }; + const createdJob = (await response.json()) as EncoreJobResponse; const sourceName = basename(source, extname(source)); const outputFolder = new URL(pipeline.output).pathname; const vod = { @@ -516,7 +522,7 @@ export async function createVod( pipeline.outputBucketName, outputFolder, sourceName, - createdJob.id, + createdJob.id!, 'index.m3u8' )}` };