File size: 2,567 Bytes
b1df986 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | import { createLogger } from '../../../../shared/logging/logger'
import type { GenerationResult } from './analysis-step'
import type { OutputMode, VideoJobData } from '../../../../types'
import { renderVideo } from './render-video'
import { renderImages } from './render-images'
import { resolveReusedNarrationForJob } from '../../../manim/narration-reuse'
import type { RenderResult } from './render-step-types'
const logger = createLogger('RenderStep')
export type { RenderResult } from './render-step-types'
export async function handlePreGeneratedCode(
jobId: string,
concept: string,
quality: string,
outputMode: OutputMode,
preGeneratedCode: string,
timings: Record<string, number>,
jobData: VideoJobData
): Promise<RenderResult> {
logger.info('Using pre-generated code from frontend', {
jobId,
outputMode,
codeLength: preGeneratedCode.length,
hasCustomApi: !!jobData.customApiConfig
})
// A code-modal edit or quality change arrives as a new job id with the same renderCacheKey.
// Reuse the server-published voice track instead of silently rendering a silent video.
const reusedNarration = resolveReusedNarrationForJob({
renderCacheKey: jobData.renderCacheKey,
workspaceDirectory: jobData.workspaceDirectory,
jobId,
videoConfig: jobData.videoConfig,
outputMode
})
const codeResult: GenerationResult = {
code: preGeneratedCode,
usedAI: false,
generationType: 'custom-api',
referenceImages: jobData.referenceImages,
narration: reusedNarration
}
const renderResult =
outputMode === 'image'
? await renderImages(
jobId,
concept,
quality,
codeResult,
timings,
jobData.videoConfig,
jobData.customApiConfig,
jobData.promptOverrides,
undefined,
jobData.clientId,
jobData.workspaceDirectory,
jobData.renderCacheKey,
jobData.workspaceOutputDirectory
)
: await renderVideo(
jobId,
concept,
quality,
codeResult,
timings,
jobData.customApiConfig,
jobData.videoConfig,
jobData.promptOverrides,
undefined,
jobData.clientId,
jobData.workspaceDirectory,
jobData.renderCacheKey,
jobData.workspaceOutputDirectory,
jobData.sceneName
)
logger.info('Job completed (pre-generated code)', { jobId, outputMode, timings })
return renderResult
}
export { renderVideo, renderImages }
|