Add default video length setting and inherit duration when extending.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-09-03 19:44:28 -05:00
co-authored by Cursor
parent a6756c1f1a
commit 86e23499a9
5 changed files with 116 additions and 25 deletions
+8 -2
View File
@@ -2,7 +2,7 @@ import { existsSync } from 'node:fs'
import { addStudioJob, kickStudioQueue, listStudioJobs, videoJobsBusy } from '~/server/utils/studioQueue'
import { persistLoraFields, parsePostedLoraStack, listStudioLoras } from '~/server/utils/loras'
import { readLoraStack } from '~/utils/loras'
import { parseExtendDuration } from '~/server/utils/extendChain'
import { clipPartDuration, clampVideoDuration } from '~/utils/videoDuration'
import { defaultVideoSteps, isLtxWorkflow, LTX_DISABLED_MESSAGE, ltxWorkflowEnabled, parseVideoWorkflow } from '~/utils/videoModels'
import { composePromptParts } from '~/utils/promptParts'
import { nextFamilyPartName } from '~/server/utils/library'
@@ -25,7 +25,13 @@ export default defineEventHandler(async (event) => {
const destFolder = publicLibrary(event).folders.find(folder => folder.id === source.folderId)
const folderLocked = Boolean(destFolder?.protected && !destFolder.unlocked)
const durationSeconds = parseExtendDuration(body?.duration)
const parent = source.parentClipId
? (() => { try { return getClip(owner, source.parentClipId!) } catch { return null } })()
: null
const inherited = clipPartDuration(source, parent)
const durationSeconds = body?.duration == null
? inherited
: clampVideoDuration(body.duration, inherited)
const promptPre = body && Object.prototype.hasOwnProperty.call(body, 'promptPre')
? String(body.promptPre || '').trim()
: String(source.promptPre || '').trim()
+10 -5
View File
@@ -6,6 +6,7 @@ import { parsePostedLoraStack, listStudioLoras, persistLoraFields, ensureComfyLo
import { readLoraStack } from '~/utils/loras'
import { clampVideoCfg } from '~/utils/generationPresets'
import { defaultVideoSteps, isLtxWorkflow, LTX_DISABLED_MESSAGE, ltxWorkflowEnabled, parseVideoWorkflow } from '~/utils/videoModels'
import { clampVideoDuration, clipPartDuration } from '~/utils/videoDuration'
import { createJob, emitJob, type Job } from '~/server/utils/jobs'
import {
clipTitle,
@@ -25,10 +26,8 @@ import { writePendingJob } from '~/server/utils/pending'
const SAMPLERS = new Set(['res_multistep', 'euler', 'dpmpp_2m'])
const SCHEDULERS = new Set(['simple', 'ddim_uniform', 'sgm_uniform'])
export function parseExtendDuration(raw: unknown) {
const seconds = Number(raw)
if (!Number.isFinite(seconds)) return 5
return Math.min(120, Math.max(0.5, Math.round(seconds * 10) / 10))
export function parseExtendDuration(raw: unknown, fallback = 5) {
return clampVideoDuration(raw, fallback)
}
function frameLength(seconds: number, fps: number) {
@@ -71,7 +70,13 @@ export async function beginExtendFromClip(params: {
throw createError({ statusCode: 404, statusMessage: 'Source video is missing' })
}
const prompt = String(params.prompt || '').trim()
const durationSeconds = parseExtendDuration(params.duration)
const parent = source.parentClipId
? (() => { try { return getClip(params.ownerKey, source.parentClipId!) } catch { return null } })()
: null
const inherited = clipPartDuration(source, parent)
const durationSeconds = params.duration == null
? inherited
: parseExtendDuration(params.duration, inherited)
const promptPre = params.promptPre != null
? String(params.promptPre).trim()
: String(source.promptPre || '').trim()