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 }