26 lines
1.3 KiB
TypeScript
26 lines
1.3 KiB
TypeScript
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,undefined,request.engine))
|
|
}
|