| import { v4 as uuidv4, validate as uuidValidate } from "uuid" |
| import { HfInference } from "@huggingface/inference" |
|
|
| |
|
|
| import { VideoAPIRequest, Video } from "../types.mts" |
| import { getValidNumber } from "./getValidNumber.mts" |
| import { getValidResolution } from "./getValidResolution.mts" |
| import { parseShotRequest } from "./parseShotRequest.mts" |
| import { generateSeed } from "./generateSeed.mts" |
| import { sequenceFormatVersion } from "../config.mts" |
|
|
| |
| |
|
|
| export const parseVideoRequest = async (ownerId: string, request: VideoAPIRequest): Promise<Video> => { |
| |
| |
| const id = uuidv4() |
|
|
| if (typeof request.prompt === "string" && request.prompt.length > 0) { |
| console.log("we have a valid prompt:", request.prompt) |
| |
| request.sequence = { |
| videoPrompt: request.prompt, |
| } |
| request.shots = [{ |
| shotPrompt: request.prompt, |
| environmentPrompt: "", |
| photographyPrompt: "", |
| actionPrompt: "", |
| }] |
| } |
|
|
| |
| const video: Video = { |
| |
| id, |
|
|
| ownerId, |
|
|
| |
| videoPrompt: `${request.sequence.videoPrompt || ''}`, |
|
|
| |
| backgroundAudioPrompt: `${request.sequence.backgroundAudioPrompt || ''}`, |
|
|
| |
| foregroundAudioPrompt: `${request.sequence.foregroundAudioPrompt || ''}`, |
|
|
| |
| actorPrompt: `${request.sequence.actorPrompt || ''}`, |
|
|
| |
| actorVoicePrompt: `${request.sequence.actorVoicePrompt || ''}`, |
|
|
| |
| actorDialoguePrompt: `${request.sequence.actorDialoguePrompt || ''}`, |
|
|
| seed: getValidNumber(request.sequence.seed, 0, 2147483647, generateSeed()), |
|
|
| noise: request.sequence.noise === true, |
| noiseAmount: request.sequence.noise === true ? 2 : 0, |
|
|
| steps: getValidNumber(request.sequence.steps, 10, 50, 45), |
|
|
| fps: getValidNumber(request.sequence.fps, 8, 60, 30), |
|
|
| resolution: getValidResolution(request.sequence.resolution), |
|
|
| outroTransition: 'staticfade', |
| outroDurationMs: 3000, |
|
|
| |
| version: sequenceFormatVersion, |
| fileName: `${ownerId}_${id}.mp4`, |
| status: "pending", |
| hasAssembledVideo: false, |
| hasGeneratedSpecs: false, |
| nbCompletedShots: 0, |
| progressPercent: 0, |
| createdAt: new Date().toISOString(), |
| completedAt: null, |
| completed: false, |
| error: '', |
|
|
|
|
| |
|
|
| shots: [], |
| } |
|
|
| |
| const maybeShots = Array.isArray(request.shots) ? request.shots : [] |
|
|
| |
| for (const maybeShot of maybeShots) { |
| |
| try { |
| const shot = await parseShotRequest(video, maybeShot) |
| video.shots.push(shot) |
| } catch (err) { |
| console.log(`error parsing shot: `, maybeShot) |
| } |
|
|
| } |
|
|
| return video |
| } |