import { readFileSync } from 'node:fs' import { execFile } from 'node:child_process' import { promisify } from 'node:util' import { getClip, getStill, clipVideoPath, stillPath } from '../library' import { imageDimensions } from '../resolution' import { resolveSize } from '~/shared/studio2/input.mjs' const exec = promisify(execFile) export async function resolveRequestSize(owner: string, request: any) { const video=['video','extend'].includes(request.mode) let dimensions:any if (video && request.startClipId) { getClip(owner,request.startClipId) const result=await exec('ffprobe',['-v','error','-select_streams','v:0','-show_entries','stream=width,height','-of','json',clipVideoPath(owner,request.startClipId)],{windowsHide:true,timeout:15000}) dimensions=JSON.parse(result.stdout).streams?.[0] } else { const id=request.imageAId || request.identityStillId if (id) { getStill(owner,id) dimensions=imageDimensions(readFileSync(stillPath(owner,id))) if (!dimensions) throw new Error('Cannot measure the source still.') } } if (video && request.startClipId && !dimensions?.width) throw new Error('Cannot measure the previous clip.') Object.assign(request.settings,resolveSize(request.settings.aspect,dimensions)) }