{"version":3,"sources":["../src/index.ts","../src/process.ts","../src/errors.ts","../src/utils.ts","../src/owned-tasks.ts","../src/probe.ts","../src/presets.ts","../src/video.ts","../src/progress.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { inspectConfiguration, probeMedia } from './probe.js';\nimport { errors, FfmpegError, renderError } from './errors.js';\nimport { presets, sizes, ratios, audioChannels } from './presets.js';\nimport type {\n  FfmpegConfiguration,\n  FfmpegOperationSettings,\n  FfmpegSettings,\n  LegacyCallback,\n  ResolvedSettings,\n} from './types.js';\nimport { resolveSettings, resolveOperationSettings, isRemoteInput } from './utils.js';\nimport { parseProgress, Video } from './video.js';\nimport { runOwnedTasks } from './owned-tasks.js';\n\nexport * from './types.js';\nexport { FfmpegError, Video, errors, presets, sizes, ratios, audioChannels, parseProgress };\n\ninterface FfmpegFactory {\n  (input: string, settings?: FfmpegSettings): Promise<Video>;\n  (input: string, callback: LegacyCallback<Video>): void;\n  (input: string, settings: FfmpegSettings, callback: LegacyCallback<Video>): void;\n  new (input: string, settings?: FfmpegSettings): Promise<Video>;\n  new (input: string, callback: LegacyCallback<Video>): object;\n  new (input: string, settings: FfmpegSettings, callback: LegacyCallback<Video>): object;\n  bin: string;\n  ffprobeBin: string;\n}\n\nasync function initializeVideo(input: string, settings: FfmpegSettings): Promise<Video> {\n  const resolved = resolveSettings(settings, {\n    ffmpegPath: ffmpeg.bin,\n    ffprobePath: ffmpeg.ffprobeBin,\n  });\n  const [configuration, metadata] = await runOwnedTasks(resolved, [\n    (ownedSettings) => inspectConfiguration(ownedSettings),\n    (ownedSettings) => probeMedia(input, ownedSettings),\n  ] as const);\n  return new Video(input, resolved, configuration, metadata);\n}\n\nfunction validateInput(input: unknown): asserts input is string {\n  if (input === undefined || input === null || input === '')\n    throw renderError('empty_input_filepath');\n  if (typeof input !== 'string') throw renderError('input_filepath_must_be_string');\n  if (!isRemoteInput(input) && !existsSync(input)) throw renderError('fileinput_not_exist', input);\n}\n\nconst factory = function (\n  input: string,\n  settingsOrCallback?: FfmpegSettings | LegacyCallback<Video>,\n  maybeCallback?: LegacyCallback<Video>,\n): Promise<Video> | void {\n  validateInput(input);\n  const callback = typeof settingsOrCallback === 'function' ? settingsOrCallback : maybeCallback;\n  const settings = typeof settingsOrCallback === 'function' ? {} : (settingsOrCallback ?? {});\n  const promise = initializeVideo(input, settings);\n  if (!callback) return promise;\n  void promise.then(\n    (video) => callback(null, video),\n    (error: unknown) => callback(error instanceof Error ? error : new Error(String(error)), null),\n  );\n} as FfmpegFactory;\n\nfactory.bin = 'ffmpeg';\nfactory.ffprobeBin = 'ffprobe';\n\nexport const ffmpeg = factory;\nexport function create(input: string, settings: FfmpegSettings = {}): Promise<Video> {\n  validateInput(input);\n  return initializeVideo(input, settings);\n}\n\nexport interface FfmpegClient {\n  readonly configuration: FfmpegConfiguration;\n  open(input: string, settings?: FfmpegOperationSettings): Promise<Video>;\n}\n\nclass InstanceFfmpegClient implements FfmpegClient {\n  private readonly baseSettings: ResolvedSettings;\n  private readonly lifetimeSignal: AbortSignal | undefined;\n  private readonly cachedConfiguration: FfmpegConfiguration;\n\n  constructor(settings: ResolvedSettings, configuration: FfmpegConfiguration) {\n    const { signal, ...baseSettings } = settings;\n    this.lifetimeSignal = signal;\n    this.baseSettings = {\n      ...baseSettings,\n      ...(settings.env ? { env: { ...settings.env } } : {}),\n    };\n    this.cachedConfiguration = structuredClone(configuration);\n  }\n\n  get configuration(): FfmpegConfiguration {\n    return structuredClone(this.cachedConfiguration);\n  }\n\n  open(input: string, settings: FfmpegOperationSettings = {}): Promise<Video> {\n    validateInput(input);\n    const resolved = resolveOperationSettings(settings, this.baseSettings);\n    const signals = [this.lifetimeSignal, resolved.signal].filter(\n      (signal): signal is AbortSignal => signal !== undefined,\n    );\n    const signal = signals.length > 1 ? AbortSignal.any(signals) : signals[0];\n    if (signal) resolved.signal = signal;\n    else delete resolved.signal;\n    return probeMedia(input, resolved).then(\n      (metadata) => new Video(input, resolved, structuredClone(this.cachedConfiguration), metadata),\n    );\n  }\n}\n\nexport async function createClient(settings: FfmpegSettings = {}): Promise<FfmpegClient> {\n  const resolved = resolveSettings(settings, {\n    ffmpegPath: ffmpeg.bin,\n    ffprobePath: ffmpeg.ffprobeBin,\n  });\n  const configuration = await inspectConfiguration(resolved);\n  return new InstanceFfmpegClient(resolved, configuration);\n}\nexport default ffmpeg;\n","import { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport { FfmpegError, renderError } from './errors.js';\nimport type { ProcessResult, ResolvedSettings } from './types.js';\nimport { quoteForDisplay } from './utils.js';\n\ninterface RunOptions {\n  acceptExitCodes?: number[];\n  onStderr?: (chunk: string) => void;\n  /** Preserve complete stdout and fail when maxBuffer is exceeded. */\n  stdout?: 'tail' | 'full';\n}\n\nexport class ByteCollector {\n  private chunks: Buffer[] = [];\n  private bytes = 0;\n\n  constructor(\n    private readonly maxBytes: number,\n    private readonly mode: 'tail' | 'full',\n  ) {}\n\n  add(value: string, encoding: BufferEncoding): boolean {\n    const chunk = Buffer.from(value, encoding);\n    if (this.mode === 'full' && this.bytes + chunk.length > this.maxBytes) return false;\n    if (this.mode === 'tail' && chunk.length >= this.maxBytes) {\n      this.chunks = [chunk.subarray(chunk.length - this.maxBytes)];\n      this.bytes = this.maxBytes;\n      return true;\n    }\n\n    this.chunks.push(chunk);\n    this.bytes += chunk.length;\n    if (this.mode === 'tail') {\n      while (this.bytes > this.maxBytes) {\n        const first = this.chunks.at(0);\n        if (!first) throw new Error('ByteCollector invariant violated');\n        const excess = this.bytes - this.maxBytes;\n        if (first.length <= excess) {\n          this.chunks.shift();\n          this.bytes -= first.length;\n        } else {\n          this.chunks[0] = first.subarray(excess);\n          this.bytes -= excess;\n        }\n      }\n    }\n    return true;\n  }\n\n  toString(encoding: BufferEncoding): string {\n    return Buffer.concat(this.chunks, this.bytes).toString(encoding);\n  }\n}\n\nexport function terminateProcessTree(\n  child: Pick<ChildProcess, 'pid' | 'kill'>,\n  signal: NodeJS.Signals,\n  platform: NodeJS.Platform = process.platform,\n  spawnProcess: typeof spawn = spawn,\n  killGroup: (pid: number, signal: NodeJS.Signals) => boolean = (pid, groupSignal) =>\n    process.kill(pid, groupSignal),\n): void {\n  if (platform === 'win32' && child.pid) {\n    const args = ['/pid', String(child.pid), '/t'];\n    if (signal === 'SIGKILL') args.push('/f');\n    const taskkill = spawnProcess('taskkill.exe', args, {\n      shell: false,\n      windowsHide: true,\n      stdio: 'ignore',\n    });\n    taskkill.once('error', () => child.kill(signal));\n    return;\n  }\n  if (platform !== 'win32' && child.pid) {\n    try {\n      killGroup(-child.pid, signal);\n      return;\n    } catch {\n      // The child may have exited between the status check and the signal.\n    }\n  }\n  child.kill(signal);\n}\n\nexport function runProcess(\n  command: string,\n  args: string[],\n  settings: ResolvedSettings,\n  options: RunOptions = {},\n): Promise<ProcessResult> {\n  return new Promise((resolve, reject) => {\n    const stdout = new ByteCollector(settings.maxBuffer, options.stdout ?? 'tail');\n    const stderr = new ByteCollector(settings.maxBuffer, 'tail');\n    let settled = false;\n    let timedOut = false;\n    let aborted = false;\n    let outputLimitExceeded = false;\n    let forceKillTimer: NodeJS.Timeout | undefined;\n\n    const child = spawn(command, args, {\n      cwd: settings.cwd,\n      env: settings.env,\n      shell: false,\n      windowsHide: true,\n      detached: process.platform !== 'win32',\n      stdio: ['ignore', 'pipe', 'pipe'],\n    });\n\n    const stop = (): void => {\n      if (child.exitCode === null && child.signalCode === null) {\n        terminateProcessTree(child, 'SIGTERM');\n        forceKillTimer = setTimeout(() => terminateProcessTree(child, 'SIGKILL'), 2_000);\n        forceKillTimer.unref();\n      }\n    };\n\n    const timeout =\n      settings.timeout > 0\n        ? setTimeout(() => {\n            timedOut = true;\n            stop();\n          }, settings.timeout)\n        : undefined;\n    timeout?.unref();\n\n    const onAbort = (): void => {\n      aborted = true;\n      stop();\n    };\n    if (settings.signal?.aborted) onAbort();\n    else settings.signal?.addEventListener('abort', onAbort, { once: true });\n\n    child.stdout.setEncoding(settings.encoding);\n    child.stderr.setEncoding(settings.encoding);\n    child.stdout.on('data', (chunk: string) => {\n      if (!outputLimitExceeded && !stdout.add(chunk, settings.encoding)) {\n        outputLimitExceeded = true;\n        stop();\n      }\n    });\n    child.stderr.on('data', (chunk: string) => {\n      stderr.add(chunk, settings.encoding);\n      options.onStderr?.(chunk);\n    });\n\n    child.on('error', (cause: NodeJS.ErrnoException) => {\n      if (settled) return;\n      settled = true;\n      cleanup();\n      reject(\n        new FfmpegError(114, renderError('executable_not_found', command).message, {\n          cause,\n          stderr: stderr.toString(settings.encoding),\n        }),\n      );\n    });\n\n    child.on('close', (code) => {\n      if (settled) return;\n      settled = true;\n      cleanup();\n      const stderrText = stderr.toString(settings.encoding);\n      if (outputLimitExceeded) {\n        const error = renderError('process_output_limit', settings.maxBuffer);\n        reject(new FfmpegError(error.code, error.message, { stderr: stderrText }));\n        return;\n      }\n      if (timedOut) {\n        const error = renderError('process_timeout', settings.timeout);\n        reject(new FfmpegError(error.code, error.message, { stderr: stderrText }));\n        return;\n      }\n      if (aborted) {\n        const error = renderError('process_aborted');\n        reject(new FfmpegError(error.code, error.message, { stderr: stderrText }));\n        return;\n      }\n      const exitCode = code ?? -1;\n      if (!(options.acceptExitCodes ?? [0]).includes(exitCode)) {\n        const error = renderError('process_failed', exitCode);\n        reject(new FfmpegError(error.code, error.message, { stderr: stderrText }));\n        return;\n      }\n      resolve({\n        command,\n        args,\n        code: exitCode,\n        stdout: stdout.toString(settings.encoding),\n        stderr: stderrText,\n      });\n    });\n\n    function cleanup(): void {\n      if (timeout) clearTimeout(timeout);\n      if (forceKillTimer) clearTimeout(forceKillTimer);\n      try {\n        settings.signal?.removeEventListener('abort', onAbort);\n      } catch {\n        // Cleanup must never escape a child-process event handler.\n      }\n    }\n  });\n}\n\nexport function displayCommand(command: string, args: string[]): string {\n  return [command, ...args].map(quoteForDisplay).join(' ');\n}\n","import { format } from 'node:util';\n\nconst definitions = {\n  empty_input_filepath: [100, 'The input file path cannot be empty'],\n  input_filepath_must_be_string: [101, 'The input file path must be a string'],\n  invalid_option_name: [102, 'The option \"%s\" is invalid. Check the available options'],\n  fileinput_not_exist: [103, 'The input file does not exist: %s'],\n  format_not_supported: [104, 'The format \"%s\" is not supported by this FFmpeg build'],\n  audio_channel_is_invalid: [105, 'The audio channel \"%s\" is not valid'],\n  mkdir: [106, 'Could not create directory: %s'],\n  extract_frame_invalid_everyN_options: [\n    107,\n    'Specify only one of every_n_frames, every_n_seconds, or every_n_percentage',\n  ],\n  invalid_watermark: [108, 'The watermark \"%s\" does not exist'],\n  invalid_watermark_position: [109, 'Invalid watermark position \"%s\"'],\n  size_format: [110, 'The size \"%s\" is not supported'],\n  resolution_square_not_defined: [111, 'The square-pixel resolution is not defined'],\n  command_already_exists: [112, 'The command \"%s\" already exists'],\n  codec_not_supported: [113, 'The codec \"%s\" is not supported by this FFmpeg build'],\n  executable_not_found: [114, 'Could not start executable \"%s\"'],\n  process_failed: [115, 'FFmpeg exited with code %s'],\n  process_timeout: [116, 'FFmpeg timed out after %s ms'],\n  process_aborted: [117, 'FFmpeg was aborted'],\n  invalid_probe_output: [118, 'ffprobe returned invalid JSON'],\n  process_output_limit: [119, 'Process stdout exceeded maxBuffer (%s bytes)'],\n  invalid_numeric_option: [120, 'The option \"%s\" must be %s'],\n  invalid_time: [121, 'The %s value \"%s\" is invalid'],\n  invalid_aspect_ratio: [122, 'The aspect ratio \"%s\" is invalid'],\n  invalid_option_value: [123, 'The value supplied for option \"%s\" is invalid'],\n  unsafe_output_path: [124, 'The output path \"%s\" is unsafe because it begins with \"-\"'],\n  invalid_color: [125, 'The FFmpeg color \"%s\" is invalid'],\n} as const;\n\nexport type ErrorName = keyof typeof definitions;\n\nexport class FfmpegError extends Error {\n  readonly code: number;\n  readonly msg: string;\n  override readonly cause?: unknown;\n  readonly stderr?: string;\n\n  constructor(code: number, message: string, options?: { cause?: unknown; stderr?: string }) {\n    super(message);\n    this.name = 'FfmpegError';\n    this.code = code;\n    this.msg = message;\n    if (options && 'cause' in options) this.cause = options.cause;\n    if (options?.stderr !== undefined) this.stderr = options.stderr;\n  }\n}\n\nexport function renderError(\n  name: ErrorName,\n  ...parameters: Array<string | number | undefined>\n): FfmpegError {\n  const [code, template] = definitions[name];\n  return new FfmpegError(code, format(template, ...parameters));\n}\n\nexport const errors = Object.fromEntries(\n  Object.entries(definitions).map(([name, [code, msg]]) => [name, { code, msg }]),\n) as Record<ErrorName, { code: number; msg: string }>;\n","import { isAbsolute, join } from 'node:path';\nimport { renderError } from './errors.js';\nimport type { FfmpegOperationSettings, FfmpegSettings, ResolvedSettings } from './types.js';\n\nconst defaultSettings = {\n  encoding: 'utf8',\n  timeout: 0,\n  maxBuffer: 16 * 1024 * 1024,\n  overwrite: false,\n} as const;\n\nexport function resolveSettings(\n  settings: FfmpegSettings = {},\n  defaults: { ffmpegPath: string; ffprobePath: string },\n): ResolvedSettings {\n  const rawSettings: unknown = settings;\n  if (rawSettings === null || typeof rawSettings !== 'object' || Array.isArray(rawSettings)) {\n    throw renderError('invalid_option_value', 'settings');\n  }\n  const valid = new Set([\n    'encoding',\n    'timeout',\n    'maxBuffer',\n    'ffmpegPath',\n    'ffprobePath',\n    'overwrite',\n    'signal',\n    'cwd',\n    'env',\n  ]);\n  for (const key of Object.keys(settings)) {\n    if (!valid.has(key)) throw renderError('invalid_option_name', key);\n  }\n\n  if (!Buffer.isEncoding(settings.encoding ?? defaultSettings.encoding)) {\n    throw renderError('invalid_option_value', 'encoding');\n  }\n  if (\n    settings.timeout !== undefined &&\n    (!Number.isFinite(settings.timeout) || settings.timeout < 0)\n  ) {\n    throw renderError(\n      'invalid_numeric_option',\n      'timeout',\n      'a finite number greater than or equal to 0',\n    );\n  }\n  if (\n    settings.maxBuffer !== undefined &&\n    (!Number.isSafeInteger(settings.maxBuffer) || settings.maxBuffer <= 0)\n  ) {\n    throw renderError('invalid_numeric_option', 'maxBuffer', 'a positive safe integer');\n  }\n  for (const [name, value] of [\n    ['ffmpegPath', settings.ffmpegPath],\n    ['ffprobePath', settings.ffprobePath],\n  ] as const) {\n    if (value !== undefined && (typeof value !== 'string' || value.trim() === '')) {\n      throw renderError('invalid_option_value', name);\n    }\n  }\n  if (settings.overwrite !== undefined && typeof settings.overwrite !== 'boolean') {\n    throw renderError('invalid_option_value', 'overwrite');\n  }\n  if (settings.cwd !== undefined && (typeof settings.cwd !== 'string' || settings.cwd === '')) {\n    throw renderError('invalid_option_value', 'cwd');\n  }\n  const rawEnvironment = (settings as { env?: unknown }).env;\n  if (\n    rawEnvironment !== undefined &&\n    (rawEnvironment === null || typeof rawEnvironment !== 'object' || Array.isArray(rawEnvironment))\n  ) {\n    throw renderError('invalid_option_value', 'env');\n  }\n  const rawSignal: unknown = settings.signal;\n  if (\n    rawSignal !== undefined &&\n    (!(rawSignal instanceof AbortSignal) ||\n      typeof rawSignal.aborted !== 'boolean' ||\n      typeof rawSignal.addEventListener !== 'function' ||\n      typeof rawSignal.removeEventListener !== 'function')\n  ) {\n    throw renderError('invalid_option_value', 'signal');\n  }\n\n  const ffmpegPath = settings.ffmpegPath ?? defaults.ffmpegPath;\n  return {\n    ...defaultSettings,\n    ...settings,\n    ffmpegPath,\n    ffprobePath: settings.ffprobePath ?? inferFfprobePath(ffmpegPath, defaults.ffprobePath),\n  };\n}\n\nexport function resolveOperationSettings(\n  settings: FfmpegOperationSettings = {},\n  defaults: ResolvedSettings,\n): ResolvedSettings {\n  const rawSettings: unknown = settings;\n  if (rawSettings === null || typeof rawSettings !== 'object' || Array.isArray(rawSettings)) {\n    throw renderError('invalid_option_value', 'settings');\n  }\n  const valid = new Set(['encoding', 'timeout', 'maxBuffer', 'overwrite', 'signal']);\n  for (const key of Object.keys(settings)) {\n    if (!valid.has(key)) throw renderError('invalid_option_name', key);\n  }\n  const merged: FfmpegSettings = {\n    ...defaults,\n    ...settings,\n    ffmpegPath: defaults.ffmpegPath,\n    ffprobePath: defaults.ffprobePath,\n  };\n  if (defaults.cwd === undefined) delete merged.cwd;\n  else merged.cwd = defaults.cwd;\n  if (defaults.env === undefined) delete merged.env;\n  else merged.env = defaults.env;\n  return resolveSettings(merged, {\n    ffmpegPath: defaults.ffmpegPath,\n    ffprobePath: defaults.ffprobePath,\n  });\n}\n\nfunction inferFfprobePath(ffmpegPath: string, fallback: string): string {\n  if (fallback !== 'ffprobe') return fallback;\n  if (!isAbsolute(ffmpegPath)) return fallback;\n  const suffix = process.platform === 'win32' ? '.exe' : '';\n  return join(ffmpegPath, '..', `ffprobe${suffix}`);\n}\n\nexport function durationToSeconds(duration: string | number): number {\n  if (typeof duration === 'number') return Number.isFinite(duration) ? duration : 0;\n  if (/^\\d+(?:\\.\\d+)?$/.test(duration)) return Number(duration);\n  const match = /^(\\d+):(\\d{2}):(\\d{2}(?:\\.\\d+)?)$/.exec(duration);\n  if (!match) return 0;\n  return Number(match[1]) * 3600 + Number(match[2]) * 60 + Number(match[3]);\n}\n\nexport function formatDuration(seconds: number): string {\n  if (!Number.isFinite(seconds) || seconds < 0) return '';\n  const hours = Math.floor(seconds / 3600);\n  const minutes = Math.floor((seconds % 3600) / 60);\n  const remaining = seconds % 60;\n  return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${remaining\n    .toFixed(2)\n    .padStart(5, '0')}`;\n}\n\nexport function gcd(a: number, b: number): number {\n  let left = Math.abs(Math.trunc(a));\n  let right = Math.abs(Math.trunc(b));\n  while (right !== 0) [left, right] = [right, left % right];\n  return left || 1;\n}\n\nexport function parseRatio(value?: string): { x: number; y: number; value: number } | undefined {\n  if (!value || value === 'N/A' || value === '0:1') return undefined;\n  const match = /^(\\d+):(\\d+)$/.exec(value);\n  if (!match || Number(match[2]) === 0) return undefined;\n  const x = Number(match[1]);\n  const y = Number(match[2]);\n  return { x, y, value: x / y };\n}\n\nexport function parseRate(value?: string): number {\n  if (!value) return 0;\n  const [numerator = '0', denominator = '1'] = value.split('/');\n  const divisor = Number(denominator);\n  return divisor === 0 ? 0 : Number(numerator) / divisor;\n}\n\nexport function quoteForDisplay(value: string): string {\n  return /^[A-Za-z0-9_./:=+-]+$/.test(value) ? value : JSON.stringify(value);\n}\n\nexport function isRemoteInput(input: string): boolean {\n  return /^[a-z][a-z\\d+.-]*:\\/\\//i.test(input);\n}\n\nexport function assertSafeOutput(value: unknown, name = 'destination'): asserts value is string {\n  if (typeof value !== 'string' || value.length === 0) {\n    throw renderError('invalid_option_value', name);\n  }\n  if (value.startsWith('-')) throw renderError('unsafe_output_path', value);\n}\n\nexport function ffmpegColor(value: unknown): string {\n  if (typeof value !== 'string' || value.length === 0) {\n    throw renderError('invalid_color', String(value));\n  }\n  const [color, alpha, extra] = value.split('@');\n  const validColor =\n    /^[A-Za-z]+$/.test(color ?? '') ||\n    /^(?:(?:0x|#)?[\\dA-Fa-f]{6}(?:[\\dA-Fa-f]{2})?)$/.test(color ?? '');\n  const validAlpha =\n    alpha === undefined ||\n    /^(?:0(?:\\.\\d+)?|1(?:\\.0+)?)$/.test(alpha) ||\n    /^0x[\\dA-Fa-f]{2}$/.test(alpha);\n  if (!validColor || !validAlpha || extra !== undefined) throw renderError('invalid_color', value);\n  return value;\n}\n\nexport function asBitrate(value: string | number): string {\n  const text = String(value).trim();\n  if (!/^\\d+(?:\\.\\d+)?(?:[kKmMgG])?$/.test(text) || Number.parseFloat(text) <= 0) {\n    throw renderError(\n      'invalid_numeric_option',\n      'bitrate',\n      'a positive number with an optional K, M, or G suffix',\n    );\n  }\n  return /^\\d+(?:\\.\\d+)?$/.test(text) ? `${text}k` : text;\n}\n","import type { ResolvedSettings } from './types.js';\n\ntype OwnedTask<T> = (settings: ResolvedSettings) => Promise<T>;\n\n/** Run sibling operations under one lifetime and preserve the first failure. */\nexport async function runOwnedTasks<T extends readonly unknown[]>(\n  settings: ResolvedSettings,\n  tasks: { [K in keyof T]: OwnedTask<T[K]> },\n): Promise<T> {\n  const controller = new AbortController();\n  const signal = settings.signal\n    ? AbortSignal.any([settings.signal, controller.signal])\n    : controller.signal;\n  const ownedSettings = { ...settings, signal };\n  const promises = tasks.map((task) => Promise.resolve().then(() => task(ownedSettings)));\n\n  try {\n    return (await Promise.all(promises)) as unknown as T;\n  } catch (error) {\n    controller.abort();\n    await Promise.allSettled(promises);\n    throw error;\n  }\n}\n","import { runProcess } from './process.js';\nimport { FfmpegError, renderError } from './errors.js';\nimport type {\n  FfmpegConfiguration,\n  FfprobeResult,\n  FfprobeStream,\n  MediaMetadata,\n  ResolvedSettings,\n} from './types.js';\nimport { formatDuration, gcd, parseRate, parseRatio } from './utils.js';\nimport { runOwnedTasks } from './owned-tasks.js';\n\nfunction unique(values: string[]): string[] {\n  return [...new Set(values)].sort();\n}\n\nfunction aliases(value: string): string[] {\n  return value.split(',').filter(Boolean);\n}\n\nexport async function inspectConfiguration(\n  settings: ResolvedSettings,\n): Promise<FfmpegConfiguration> {\n  const [formatsResult, encodersResult] = await runOwnedTasks(settings, [\n    (ownedSettings) =>\n      runProcess(settings.ffmpegPath, ['-hide_banner', '-formats'], ownedSettings, {\n        stdout: 'full',\n      }),\n    (ownedSettings) =>\n      runProcess(settings.ffmpegPath, ['-hide_banner', '-encoders'], ownedSettings, {\n        stdout: 'full',\n      }),\n  ] as const);\n  const formatsText = `${formatsResult.stdout}\\n${formatsResult.stderr}`;\n  const encodersText = `${encodersResult.stdout}\\n${encodersResult.stderr}`;\n  const decode: string[] = [];\n  const encodeFormats: string[] = [];\n\n  for (const line of formatsText.split(/\\r?\\n/)) {\n    const match = /^\\s([D. ])([E. ])\\s+(\\S+)/.exec(line);\n    if (!match) continue;\n    const names = aliases(match[3] ?? '');\n    if (match[1] === 'D') decode.push(...names);\n    if (match[2] === 'E') encodeFormats.push(...names);\n  }\n\n  const encoders: string[] = [];\n  for (const line of encodersText.split(/\\r?\\n/)) {\n    const match = /^\\s*[VAS][A-Z.]{5}\\s+(\\S+)/.exec(line);\n    if (match?.[1]) encoders.push(match[1]);\n  }\n\n  const configuration = /configuration:\\s*(.+)/.exec(`${formatsText}\\n${encodersText}`)?.[1] ?? '';\n  const modules = [...configuration.matchAll(/--enable-([\\w-]+)/g)].map((match) => match[1] ?? '');\n  const formats = { encode: unique(encodeFormats), decode: unique(decode) };\n  const codecs = { encode: unique(encoders) };\n  return {\n    modules: unique(modules),\n    encode: unique([...formats.encode, ...codecs.encode, 'copy']),\n    decode: formats.decode,\n    formats,\n    codecs,\n  };\n}\n\nexport async function probeMedia(\n  input: string,\n  settings: ResolvedSettings,\n): Promise<MediaMetadata> {\n  const result = await runProcess(\n    settings.ffprobePath,\n    [\n      '-v',\n      'error',\n      '-print_format',\n      'json',\n      '-show_format',\n      '-show_streams',\n      '-show_chapters',\n      input,\n    ],\n    settings,\n    { stdout: 'full' },\n  );\n\n  let raw: FfprobeResult;\n  try {\n    raw = JSON.parse(result.stdout) as FfprobeResult;\n  } catch (cause) {\n    const error = renderError('invalid_probe_output');\n    throw new FfmpegError(error.code, error.message, { cause, stderr: result.stderr });\n  }\n  return toLegacyMetadata(input, raw);\n}\n\nfunction numeric(value: string | number | undefined): number {\n  const parsed = Number(value ?? 0);\n  return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction streamByType(raw: FfprobeResult, type: string): FfprobeStream | undefined {\n  return raw.streams?.find((stream) => stream.codec_type === type);\n}\n\nfunction toRatio(value: string | undefined, width: number, height: number) {\n  const parsed = parseRatio(value);\n  const divisor = parsed ? 1 : gcd(width, height);\n  const x = parsed?.x ?? (width > 0 ? width / divisor : 0);\n  const y = parsed?.y ?? (height > 0 ? height / divisor : 0);\n  return x > 0 && y > 0 ? { x, y, string: `${x}:${y}`, value: x / y } : {};\n}\n\nexport function toLegacyMetadata(input: string, raw: FfprobeResult): MediaMetadata {\n  const format = raw.format ?? {};\n  const tags = format.tags ?? {};\n  const video = streamByType(raw, 'video');\n  const audio = streamByType(raw, 'audio');\n  const width = video?.width ?? 0;\n  const height = video?.height ?? 0;\n  const pixelRatio = parseRatio(video?.sample_aspect_ratio);\n  const pixel = pixelRatio?.value ?? (width > 0 ? 1 : 0);\n  const resolutionSquare =\n    width > 0 && height > 0 && pixel > 0\n      ? pixel > 1\n        ? { w: Math.round(width * pixel), h: height }\n        : { w: width, h: Math.round(height / pixel) }\n      : {};\n  const seconds = numeric(format.duration);\n  const rotation =\n    numeric(video?.tags?.rotate) ||\n    numeric(video?.side_data_list?.find((item) => item.rotation)?.rotation);\n  const channelCount = audio?.channels ?? 0;\n\n  return {\n    filename: format.filename ?? input,\n    title: tags.title ?? video?.tags?.title ?? '',\n    artist: tags.artist ?? '',\n    album: tags.album ?? '',\n    track: tags.track ?? '',\n    date: tags.date ?? tags.creation_time ?? '',\n    synched: numeric(format.start_time ?? video?.start_time) === 0,\n    duration: { raw: formatDuration(seconds), seconds },\n    video: {\n      container: (format.format_name ?? '').split(',')[0] ?? '',\n      bitrate: Math.round(numeric(video?.bit_rate ?? format.bit_rate) / 1000),\n      stream: video?.index ?? 0,\n      codec: video?.codec_name ?? '',\n      resolution: { w: width, h: height },\n      resolutionSquare,\n      aspect: toRatio(video?.display_aspect_ratio, width, height),\n      rotate: rotation,\n      fps: parseRate(video?.avg_frame_rate ?? video?.r_frame_rate),\n      pixelString: video?.sample_aspect_ratio ?? (width > 0 ? '1:1' : ''),\n      pixel,\n    },\n    audio: {\n      codec: audio?.codec_name ?? '',\n      bitrate: Math.round(numeric(audio?.bit_rate) / 1000),\n      sample_rate: numeric(audio?.sample_rate),\n      stream: audio?.index ?? 0,\n      channels: {\n        raw:\n          audio?.channel_layout ??\n          (channelCount === 2 ? 'stereo' : channelCount === 1 ? 'mono' : ''),\n        value: channelCount,\n      },\n    },\n    raw,\n  };\n}\n","export const sizes = {\n  SQCIF: '128x96',\n  QCIF: '176x144',\n  CIF: '352x288',\n  '4CIF': '704x576',\n  QQVGA: '160x120',\n  QVGA: '320x240',\n  VGA: '640x480',\n  SVGA: '800x600',\n  XGA: '1024x768',\n  UXGA: '1600x1200',\n  QXGA: '2048x1536',\n  SXGA: '1280x1024',\n  QSXGA: '2560x2048',\n  HSXGA: '5120x4096',\n  WVGA: '852x480',\n  WXGA: '1366x768',\n  WSXGA: '1600x1024',\n  WUXGA: '1920x1200',\n  WOXGA: '2560x1600',\n  WQSXGA: '3200x2048',\n  WQUXGA: '3840x2400',\n  WHSXGA: '6400x4096',\n  WHUXGA: '7680x4800',\n  CGA: '320x200',\n  EGA: '640x350',\n  HD480: '852x480',\n  HD720: '1280x720',\n  HD1080: '1920x1080',\n} as const;\n\nexport const ratios = {\n  '4:3': 4 / 3,\n  '3:2': 3 / 2,\n  '14:9': 14 / 9,\n  '16:9': 16 / 9,\n  '21:9': 21 / 9,\n} as const;\n\nexport const audioChannels = { mono: 1, stereo: 2 } as const;\n\nexport const presets = { size: sizes, ratio: ratios, audio_channel: audioChannels } as const;\n","import { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport { existsSync } from 'node:fs';\nimport { mkdir, readdir, stat } from 'node:fs/promises';\nimport { basename, dirname, extname, join } from 'node:path';\nimport { FfmpegError, renderError } from './errors.js';\nimport { displayCommand, runProcess } from './process.js';\nimport type {\n  ExtractFrameSettings,\n  FfmpegConfiguration,\n  LegacyCallback,\n  MediaOperationContext,\n  MediaOperationKind,\n  MediaMetadata,\n  ProcessResult,\n  Progress,\n  ResolvedSettings,\n  WatermarkSettings,\n} from './types.js';\nimport { asBitrate, assertSafeOutput, durationToSeconds, ffmpegColor, gcd } from './utils.js';\nimport { effectiveDuration, ProgressStreamParser } from './progress.js';\n\nexport { effectiveDuration, parseProgress, ProgressStreamParser } from './progress.js';\n\ninterface VideoOptions {\n  audio?: {\n    disabled?: boolean;\n    codec?: string;\n    frequency?: number;\n    channels?: number;\n    bitrate?: string | number;\n    quality?: string | number;\n  };\n  video?: {\n    disabled?: boolean;\n    format?: string;\n    codec?: string;\n    bitrate?: string | number;\n    framerate?: number;\n    startTime?: number;\n    duration?: number;\n    aspect?: number | string;\n    size?: string;\n    keepPixelAspectRatio?: boolean;\n    keepAspectRatio?: boolean;\n    paddingColor?: string;\n    quality?: string | number;\n    watermark?: { path: string; overlay: string };\n  };\n  metadata?: Record<string, string | number>;\n  threads?: number;\n}\n\ninterface BuilderState {\n  commands: string[];\n  inputs: string[];\n  filtersComplex: string[];\n  options: VideoOptions;\n}\n\ninterface OperationPlan {\n  args: string[];\n  progressDuration: number;\n  context: MediaOperationContext;\n}\n\ninterface Dimension {\n  width: number;\n  height: number;\n  aspect?: { x: number; y: number; string: string };\n}\n\ninterface VideoEvents {\n  start: [command: string, context: MediaOperationContext];\n  progress: [progress: Progress, context: MediaOperationContext];\n  stderr: [chunk: string, context: MediaOperationContext];\n  end: [result: ProcessResult, context: MediaOperationContext];\n  error: [error: unknown, context: MediaOperationContext];\n}\n\ninterface FileFingerprint {\n  size: number;\n  mtimeMs: number;\n  ctimeMs: number;\n}\n\nconst positions = new Set(['NE', 'NC', 'NW', 'SE', 'SC', 'SW', 'C', 'CE', 'CW']);\n\nfunction settle<T>(promise: Promise<T>, callback?: LegacyCallback<T>): Promise<T> | void {\n  if (!callback) return promise;\n  void promise.then(\n    (value) => callback(null, value),\n    (error: unknown) => callback(error instanceof Error ? error : new Error(String(error)), null),\n  );\n}\n\nfunction numericTime(value: string | number, name: string, allowZero: boolean): number {\n  let validText = typeof value === 'number';\n  if (typeof value === 'string') {\n    validText = /^\\d+(?:\\.\\d+)?$/.test(value);\n    const clock = /^(\\d+):(\\d{2}):(\\d{2}(?:\\.\\d+)?)$/.exec(value);\n    if (clock) validText = Number(clock[2]) < 60 && Number(clock[3]) < 60;\n  }\n  const seconds = durationToSeconds(value);\n  if (!validText || !Number.isFinite(seconds) || seconds < 0 || (!allowZero && seconds === 0)) {\n    throw renderError('invalid_time', name, value);\n  }\n  return seconds;\n}\n\nfunction finiteNumber(value: string | number, name: string, minimum = 0): number {\n  if (typeof value === 'string' && value.trim() === '') {\n    throw renderError(\n      'invalid_numeric_option',\n      name,\n      `a finite number greater than or equal to ${minimum}`,\n    );\n  }\n  const numeric = typeof value === 'number' ? value : Number(value);\n  if (!Number.isFinite(numeric) || numeric < minimum) {\n    throw renderError(\n      'invalid_numeric_option',\n      name,\n      `a finite number greater than or equal to ${minimum}`,\n    );\n  }\n  return numeric;\n}\n\nfunction positiveNumber(value: number, name: string): number {\n  if (!Number.isFinite(value) || value <= 0) {\n    throw renderError('invalid_numeric_option', name, 'a finite number greater than 0');\n  }\n  return value;\n}\n\nexport class Video extends EventEmitter<VideoEvents> {\n  readonly file_path: string;\n  readonly info_configuration: FfmpegConfiguration;\n  readonly metadata: MediaMetadata;\n\n  private commands: string[] = [];\n  private inputs: string[];\n  private filtersComplex: string[] = [];\n  private options: VideoOptions = {};\n\n  constructor(\n    filePath: string,\n    private readonly settings: ResolvedSettings,\n    configuration: FfmpegConfiguration,\n    metadata: MediaMetadata,\n  ) {\n    super();\n    this.file_path = filePath;\n    this.inputs = [filePath];\n    this.info_configuration = configuration;\n    this.metadata = metadata;\n  }\n\n  addCommand(command: string, argument?: string | number): this {\n    this.commands.push(command);\n    if (argument !== undefined) this.commands.push(String(argument));\n    return this;\n  }\n\n  /** Alias that better describes arbitrary modern FFmpeg arguments. */\n  addOutputOption(command: string, argument?: string | number): this {\n    return this.addCommand(command, argument);\n  }\n\n  addInput(input: string): this {\n    this.inputs.push(input);\n    return this;\n  }\n\n  addFilterComplex(filter: string): this {\n    this.filtersComplex.push(filter);\n    return this;\n  }\n\n  setDisableAudio(): this {\n    (this.options.audio ??= {}).disabled = true;\n    return this;\n  }\n\n  setDisableVideo(): this {\n    (this.options.video ??= {}).disabled = true;\n    return this;\n  }\n\n  setVideoFormat(format: string): this {\n    if (!this.info_configuration.formats.encode.includes(format)) {\n      throw renderError('format_not_supported', format);\n    }\n    (this.options.video ??= {}).format = format;\n    return this;\n  }\n\n  setVideoCodec(codec: string): this {\n    if (codec !== 'copy' && !this.info_configuration.codecs.encode.includes(codec)) {\n      throw renderError('codec_not_supported', codec);\n    }\n    (this.options.video ??= {}).codec = codec;\n    return this;\n  }\n\n  setVideoBitRate(bitrate: string | number): this {\n    asBitrate(bitrate);\n    (this.options.video ??= {}).bitrate = bitrate;\n    return this;\n  }\n\n  setVideoFrameRate(framerate: number): this {\n    (this.options.video ??= {}).framerate = positiveNumber(framerate, 'video frame rate');\n    return this;\n  }\n\n  setVideoStartTime(time: string | number): this {\n    (this.options.video ??= {}).startTime = numericTime(time, 'start time', true);\n    return this;\n  }\n\n  setVideoDuration(duration: string | number): this {\n    (this.options.video ??= {}).duration = numericTime(duration, 'duration', false);\n    return this;\n  }\n\n  setVideoAspectRatio(aspect: string | number): this {\n    let value: string | number;\n    if (aspect === 'source') {\n      value = this.metadata.video.aspect.string ?? '';\n      if (!value) throw renderError('invalid_aspect_ratio', aspect);\n    } else if (typeof aspect === 'string') {\n      const match = /^(\\d+):(\\d+)$/.exec(aspect);\n      if (!match || Number(match[1]) <= 0 || Number(match[2]) <= 0) {\n        throw renderError('invalid_aspect_ratio', aspect);\n      }\n      value = `${Number(match[1])}:${Number(match[2])}`;\n    } else {\n      if (!Number.isFinite(aspect) || aspect <= 0)\n        throw renderError('invalid_aspect_ratio', aspect);\n      value = aspect;\n    }\n    (this.options.video ??= {}).aspect = value;\n    return this;\n  }\n\n  setVideoSize(\n    size: string,\n    keepPixelAspectRatio = false,\n    keepAspectRatio = false,\n    paddingColor = 'black',\n  ): this {\n    ffmpegColor(paddingColor);\n    Object.assign((this.options.video ??= {}), {\n      size,\n      keepPixelAspectRatio,\n      keepAspectRatio,\n      paddingColor,\n    });\n    return this;\n  }\n\n  setVideoQuality(quality: string | number): this {\n    (this.options.video ??= {}).quality = finiteNumber(quality, 'video quality');\n    return this;\n  }\n\n  setAudioCodec(codec: string): this {\n    const resolvedCodec =\n      codec === 'mp3' && this.info_configuration.codecs.encode.includes('libmp3lame')\n        ? 'libmp3lame'\n        : codec;\n    if (\n      resolvedCodec !== 'copy' &&\n      !this.info_configuration.codecs.encode.includes(resolvedCodec)\n    ) {\n      throw renderError('codec_not_supported', codec);\n    }\n    (this.options.audio ??= {}).codec = resolvedCodec;\n    return this;\n  }\n\n  setAudioFrequency(frequency: number): this {\n    (this.options.audio ??= {}).frequency = positiveNumber(frequency, 'audio frequency');\n    return this;\n  }\n\n  setAudioChannels(channels: number): this {\n    if (!Number.isSafeInteger(channels) || channels <= 0) {\n      throw renderError('audio_channel_is_invalid', channels);\n    }\n    (this.options.audio ??= {}).channels = channels;\n    return this;\n  }\n\n  setAudioBitRate(bitrate: string | number): this {\n    asBitrate(bitrate);\n    (this.options.audio ??= {}).bitrate = bitrate;\n    return this;\n  }\n\n  setAudioQuality(quality: string | number): this {\n    (this.options.audio ??= {}).quality = finiteNumber(quality, 'audio quality');\n    return this;\n  }\n\n  setMetadata(key: string, value: string | number): this;\n  setMetadata(values: Record<string, string | number>): this;\n  setMetadata(\n    keyOrValues: string | Record<string, string | number>,\n    value?: string | number,\n  ): this {\n    const values = typeof keyOrValues === 'string' ? { [keyOrValues]: value ?? '' } : keyOrValues;\n    Object.assign((this.options.metadata ??= {}), values);\n    return this;\n  }\n\n  setThreads(threads: number): this {\n    if (!Number.isFinite(threads) || threads < 0) {\n      throw renderError(\n        'invalid_numeric_option',\n        'threads',\n        'a finite number greater than or equal to 0',\n      );\n    }\n    this.options.threads = Math.trunc(threads);\n    return this;\n  }\n\n  setWatermark(watermarkPath: string, settings: WatermarkSettings = {}): this {\n    (this.options.video ??= {}).watermark = this.resolveWatermark(watermarkPath, settings);\n    return this;\n  }\n\n  private resolveWatermark(\n    watermarkPath: string,\n    settings: WatermarkSettings,\n  ): NonNullable<NonNullable<VideoOptions['video']>['watermark']> {\n    if (!existsSync(watermarkPath)) throw renderError('invalid_watermark', watermarkPath);\n    const position = settings.position ?? 'SW';\n    if (!positions.has(position)) throw renderError('invalid_watermark_position', position);\n    for (const [name, value] of [\n      ['margin_nord', settings.margin_nord],\n      ['margin_sud', settings.margin_sud],\n      ['margin_east', settings.margin_east],\n      ['margin_west', settings.margin_west],\n    ] as const) {\n      if (value !== undefined) finiteNumber(value, name);\n    }\n    return {\n      path: watermarkPath,\n      overlay: watermarkOverlay(position, settings),\n    };\n  }\n\n  getCommand(destination: string): { command: string; args: string[]; display: string } {\n    const args = this.buildArgs(destination, this.currentBuilder());\n    return {\n      command: this.settings.ffmpegPath,\n      args,\n      display: displayCommand(this.settings.ffmpegPath, args),\n    };\n  }\n\n  save(destination: string): Promise<string>;\n  save(destination: string, callback: LegacyCallback<string>): void;\n  save(destination: string, callback?: LegacyCallback<string>): Promise<string> | void {\n    const context = this.createOperationContext('save', destination);\n    return this.runOperation(\n      context,\n      async (builder) => {\n        const plan = this.createSavePlan(destination, builder, context);\n        await this.execute(plan);\n        return destination;\n      },\n      callback,\n    );\n  }\n\n  fnExtractSoundToMP3(destination: string): Promise<string>;\n  fnExtractSoundToMP3(destination: string, callback: LegacyCallback<string>): void;\n  fnExtractSoundToMP3(\n    destination: string,\n    callback?: LegacyCallback<string>,\n  ): Promise<string> | void {\n    const extension =\n      extname(destination).toLowerCase() === '.mp3'\n        ? destination\n        : join(dirname(destination), `${basename(destination, extname(destination))}.mp3`);\n    const context = this.createOperationContext('audio', extension);\n    return this.runOperation(\n      context,\n      async () => {\n        assertSafeOutput(extension);\n        await this.execute({\n          args: [\n            this.settings.overwrite ? '-y' : '-n',\n            '-hide_banner',\n            '-i',\n            this.file_path,\n            '-vn',\n            '-ar',\n            '44100',\n            '-ac',\n            '2',\n            '-b:a',\n            '192k',\n            '-c:a',\n            'libmp3lame',\n            extension,\n          ],\n          progressDuration: this.metadata.duration.seconds,\n          context,\n        });\n        return extension;\n      },\n      callback,\n    );\n  }\n\n  fnExtractFrameToJPG(destinationFolder: string): Promise<string[]>;\n  fnExtractFrameToJPG(destinationFolder: string, settings: ExtractFrameSettings): Promise<string[]>;\n  fnExtractFrameToJPG(destinationFolder: string, callback: LegacyCallback<string[]>): void;\n  fnExtractFrameToJPG(\n    destinationFolder: string,\n    settings: ExtractFrameSettings,\n    callback: LegacyCallback<string[]>,\n  ): void;\n  fnExtractFrameToJPG(\n    destinationFolder: string,\n    settingsOrCallback: ExtractFrameSettings | LegacyCallback<string[]> = {},\n    maybeCallback?: LegacyCallback<string[]>,\n  ): Promise<string[]> | void {\n    const callback = typeof settingsOrCallback === 'function' ? settingsOrCallback : maybeCallback;\n    const settings = {\n      ...(typeof settingsOrCallback === 'function' ? {} : settingsOrCallback),\n    };\n    const context = this.createOperationContext('frames', destinationFolder);\n    return this.runOperation(\n      context,\n      async () => this.extractFrames(destinationFolder, settings, context),\n      callback,\n    );\n  }\n\n  fnAddWatermark(watermarkPath: string): Promise<string>;\n  fnAddWatermark(watermarkPath: string, callback: LegacyCallback<string>): void;\n  fnAddWatermark(watermarkPath: string, settings: WatermarkSettings): Promise<string>;\n  fnAddWatermark(\n    watermarkPath: string,\n    settings: WatermarkSettings,\n    callback: LegacyCallback<string>,\n  ): void;\n  fnAddWatermark(watermarkPath: string, destination: string): Promise<string>;\n  fnAddWatermark(\n    watermarkPath: string,\n    destination: string,\n    callback: LegacyCallback<string>,\n  ): void;\n  fnAddWatermark(\n    watermarkPath: string,\n    destination: string,\n    settings: WatermarkSettings,\n  ): Promise<string>;\n  fnAddWatermark(\n    watermarkPath: string,\n    destination: string,\n    settings: WatermarkSettings,\n    callback: LegacyCallback<string>,\n  ): void;\n  fnAddWatermark(\n    watermarkPath: string,\n    ...args: Array<string | WatermarkSettings | LegacyCallback<string>>\n  ): Promise<string> | void {\n    let destination: string | undefined;\n    let watermarkSettings: WatermarkSettings = {};\n    let callback: LegacyCallback<string> | undefined;\n    for (const argument of args) {\n      if (typeof argument === 'string') destination = argument;\n      else if (typeof argument === 'function') callback = argument;\n      else watermarkSettings = { ...argument };\n    }\n    const resolvedDestination =\n      destination ??\n      join(\n        dirname(this.file_path),\n        `${basename(this.file_path, extname(this.file_path))}_watermark_${basename(\n          watermarkPath,\n          extname(watermarkPath),\n        )}${extname(this.file_path)}`,\n      );\n    const context = this.createOperationContext('watermark', resolvedDestination);\n    return this.runOperation(\n      context,\n      async (builder) => {\n        const watermark = this.resolveWatermark(watermarkPath, watermarkSettings);\n        const effectiveBuilder: BuilderState = {\n          ...builder,\n          options: {\n            ...builder.options,\n            video: { ...builder.options.video, watermark },\n          },\n        };\n        const plan = this.createSavePlan(resolvedDestination, effectiveBuilder, context);\n        await this.execute(plan);\n        return resolvedDestination;\n      },\n      callback,\n    );\n  }\n\n  private buildArgs(destination: string, builder: BuilderState): string[] {\n    assertSafeOutput(destination);\n    const args = [this.settings.overwrite ? '-y' : '-n', '-hide_banner'];\n    const video = builder.options.video;\n    const audio = builder.options.audio;\n    const allInputs = [...builder.inputs];\n    const filters: string[] = [];\n    if (video?.watermark) {\n      const watermarkInput = allInputs.length;\n      allInputs.push(video.watermark.path);\n      filters.push(`[0:v][${watermarkInput}:v]overlay=${video.watermark.overlay}`);\n    }\n    for (const input of allInputs) args.push('-i', input);\n    filters.push(...builder.filtersComplex);\n\n    if (video?.disabled) args.push('-vn');\n    else if (video) {\n      if (video.format) args.push('-f', video.format);\n      if (video.codec) args.push('-c:v', video.codec);\n      if (video.bitrate !== undefined) args.push('-b:v', asBitrate(video.bitrate));\n      if (video.framerate !== undefined) args.push('-r', String(video.framerate));\n      if (video.startTime !== undefined) args.push('-ss', String(video.startTime));\n      if (video.duration !== undefined) args.push('-t', String(video.duration));\n      if (video.aspect !== undefined) args.push('-aspect', String(video.aspect));\n      if (video.quality !== undefined) args.push('-q:v', String(video.quality));\n      if (video.size) {\n        const dimension = this.calculateDimension(video);\n        args.push('-s', `${dimension.width}x${dimension.height}`);\n        if (dimension.aspect) {\n          filters.push(\n            `scale=iw*sar:ih,pad=max(iw\\\\,ih*(${dimension.aspect.x}/${dimension.aspect.y})):` +\n              `ow/(${dimension.aspect.x}/${dimension.aspect.y}):(ow-iw)/2:(oh-ih)/2:${video.paddingColor ?? 'black'}`,\n          );\n          args.push('-aspect', dimension.aspect.string);\n        }\n      }\n    }\n\n    if (audio?.disabled) args.push('-an');\n    else if (audio) {\n      if (audio.codec) args.push('-c:a', audio.codec);\n      if (audio.frequency !== undefined) args.push('-ar', String(audio.frequency));\n      if (audio.channels !== undefined) args.push('-ac', String(audio.channels));\n      if (audio.quality !== undefined) args.push('-q:a', String(audio.quality));\n      if (audio.bitrate !== undefined) args.push('-b:a', asBitrate(audio.bitrate));\n    }\n    if (builder.options.threads !== undefined)\n      args.push('-threads', String(builder.options.threads));\n    for (const [key, value] of Object.entries(builder.options.metadata ?? {})) {\n      args.push('-metadata', `${key}=${value}`);\n    }\n    args.push(...builder.commands);\n    if (filters.length > 0) args.push('-filter_complex', filters.join(','));\n    args.push(destination);\n    return args;\n  }\n\n  private calculateDimension(video: NonNullable<VideoOptions['video']>): Dimension {\n    const size = video.size ?? '';\n    const source = video.keepPixelAspectRatio\n      ? this.metadata.video.resolutionSquare\n      : this.metadata.video.resolution;\n    if (!('w' in source) || !('h' in source) || !source.w || !source.h) {\n      throw renderError('resolution_square_not_defined');\n    }\n    let width = 0;\n    let height = 0;\n    let match: RegExpExecArray | null;\n    if ((match = /^(\\d+)x\\?$/.exec(size))) {\n      width = Number(match[1]);\n      height = Math.round((width * source.h) / source.w);\n    } else if ((match = /^\\?x(\\d+)$/.exec(size))) {\n      height = Number(match[1]);\n      width = Math.round((height * source.w) / source.h);\n    } else if ((match = /^(\\d+(?:\\.\\d+)?)%$/.exec(size))) {\n      const scale = Number(match[1]) / 100;\n      width = Math.round(source.w * scale);\n      height = Math.round(source.h * scale);\n    } else if ((match = /^(\\d+)x(\\d+)$/.exec(size))) {\n      width = Number(match[1]);\n      height = Number(match[2]);\n    } else {\n      throw renderError('size_format', size);\n    }\n    width = Math.max(2, width - (width % 2));\n    height = Math.max(2, height - (height % 2));\n    if (!video.keepAspectRatio) return { width, height };\n    const divisor = gcd(width, height);\n    const x = width / divisor;\n    const y = height / divisor;\n    return { width, height, aspect: { x, y, string: `${x}:${y}` } };\n  }\n\n  private async extractFrames(\n    destinationFolder: string,\n    settings: ExtractFrameSettings,\n    context: MediaOperationContext,\n  ): Promise<string[]> {\n    const selectors = [\n      settings.every_n_frames,\n      settings.every_n_seconds,\n      settings.every_n_percentage,\n    ].filter((value) => value !== undefined && value !== null);\n    if (selectors.length > 1) throw renderError('extract_frame_invalid_everyN_options');\n    if (\n      settings.every_n_percentage !== undefined &&\n      settings.every_n_percentage !== null &&\n      (!Number.isFinite(settings.every_n_percentage) ||\n        settings.every_n_percentage <= 0 ||\n        settings.every_n_percentage > 100)\n    ) {\n      throw renderError('extract_frame_invalid_everyN_options');\n    }\n    for (const [name, value] of [\n      ['every_n_frames', settings.every_n_frames],\n      ['every_n_seconds', settings.every_n_seconds],\n    ] as const) {\n      if (value !== undefined && value !== null) positiveNumber(value, name);\n    }\n    if (\n      settings.every_n_frames !== undefined &&\n      settings.every_n_frames !== null &&\n      !Number.isSafeInteger(settings.every_n_frames)\n    ) {\n      throw renderError('invalid_numeric_option', 'every_n_frames', 'a positive safe integer');\n    }\n    if (settings.frame_rate !== undefined && settings.frame_rate !== null) {\n      positiveNumber(settings.frame_rate, 'frame_rate');\n    }\n    if (settings.number !== undefined && settings.number !== null) {\n      if (!Number.isSafeInteger(settings.number) || settings.number <= 0) {\n        throw renderError('invalid_numeric_option', 'number', 'a positive safe integer');\n      }\n    }\n    if (settings.quality !== undefined) finiteNumber(settings.quality, 'quality');\n\n    try {\n      await mkdir(destinationFolder, { recursive: true });\n    } catch (cause) {\n      const error = renderError('mkdir', destinationFolder);\n      throw new FfmpegError(error.code, error.message, { cause });\n    }\n    const size =\n      settings.size ?? `${this.metadata.video.resolution.w}x${this.metadata.video.resolution.h}`;\n    let fileName = settings.file_name ?? basename(this.file_path, extname(this.file_path));\n    fileName = fileName\n      .replaceAll('%t', String(Date.now()))\n      .replaceAll('%s', size)\n      .replaceAll('%x', size.split('x')[0] ?? '')\n      .replaceAll('%y', size.split('x')[1] ?? '')\n      .replace(/%[a-z]/gi, '');\n    fileName = `${basename(fileName, extname(fileName))}_%d.jpg`;\n    const outputPattern = join(destinationFolder, fileName);\n    const escaped = fileName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace('%d', '\\\\d+');\n    const matcher = new RegExp(`^${escaped}$`);\n    const before = await frameFingerprints(destinationFolder, matcher);\n    const args = [this.settings.overwrite ? '-y' : '-n', '-hide_banner'];\n    if (settings.start_time !== undefined && settings.start_time !== null) {\n      args.push('-ss', String(numericTime(settings.start_time, 'start_time', true)));\n    }\n    args.push('-i', this.file_path);\n    if (settings.duration_time !== undefined && settings.duration_time !== null) {\n      args.push('-t', String(numericTime(settings.duration_time, 'duration_time', false)));\n    }\n    if (settings.frame_rate !== undefined && settings.frame_rate !== null) {\n      args.push('-r', String(settings.frame_rate));\n    }\n\n    const frameVideoOptions: NonNullable<VideoOptions['video']> = {\n      size,\n      keepPixelAspectRatio: settings.keep_pixel_aspect_ratio ?? true,\n      keepAspectRatio: settings.keep_aspect_ratio ?? true,\n      paddingColor: ffmpegColor(settings.padding_color ?? 'black'),\n    };\n    const dimension = this.calculateDimension(frameVideoOptions);\n    args.push('-s', `${dimension.width}x${dimension.height}`);\n    const filters: string[] = [];\n    if (settings.every_n_frames) filters.push(`select=not(mod(n\\\\,${settings.every_n_frames}))`);\n    if (settings.every_n_seconds) filters.push(`select=not(mod(t\\\\,${settings.every_n_seconds}))`);\n    if (settings.every_n_percentage) {\n      const interval = (this.metadata.duration.seconds * settings.every_n_percentage) / 100;\n      filters.push(`select=not(mod(t\\\\,${interval}))`);\n    }\n    if (filters.length > 0) args.push('-vf', filters.join(','), '-fps_mode', 'vfr');\n    if (settings.number) args.push('-frames:v', String(settings.number));\n    assertSafeOutput(outputPattern, 'frame output');\n    args.push('-q:v', String(settings.quality ?? 2), outputPattern);\n    await this.execute({\n      args,\n      progressDuration: effectiveDuration(this.metadata.duration.seconds, {\n        startTime:\n          settings.start_time === undefined || settings.start_time === null\n            ? undefined\n            : numericTime(settings.start_time, 'start_time', true),\n        duration:\n          settings.duration_time === undefined || settings.duration_time === null\n            ? undefined\n            : numericTime(settings.duration_time, 'duration_time', false),\n      }),\n      context,\n    });\n\n    const after = await frameFingerprints(destinationFolder, matcher);\n    return [...after.entries()]\n      .filter(([entry, fingerprint]) => {\n        const previous = before.get(entry);\n        return (\n          previous?.size !== fingerprint.size ||\n          previous.mtimeMs !== fingerprint.mtimeMs ||\n          previous.ctimeMs !== fingerprint.ctimeMs\n        );\n      })\n      .map(([entry]) => entry)\n      .sort((left, right) => left.localeCompare(right, undefined, { numeric: true }))\n      .map((entry) => join(destinationFolder, entry));\n  }\n\n  private createSavePlan(\n    destination: string,\n    builder: BuilderState,\n    context: MediaOperationContext,\n  ): OperationPlan {\n    return {\n      args: this.buildArgs(destination, builder),\n      progressDuration: this.progressDuration(builder),\n      context,\n    };\n  }\n\n  private progressDuration(builder: BuilderState): number {\n    return effectiveDuration(this.metadata.duration.seconds, {\n      startTime: builder.options.video?.startTime,\n      duration: builder.options.video?.duration,\n    });\n  }\n\n  private async execute(plan: OperationPlan): Promise<ProcessResult> {\n    const { args, progressDuration, context } = plan;\n    const command = this.settings.ffmpegPath;\n    const display = displayCommand(command, args);\n    const progressParser = new ProgressStreamParser(progressDuration);\n    const emitProgress = (progress: Progress): void => {\n      this.emit('progress', progress, context);\n    };\n    this.emit('start', display, context);\n    try {\n      const result = await runProcess(command, args, this.settings, {\n        onStderr: (chunk) => {\n          this.emit('stderr', chunk, context);\n          progressParser.write(chunk).forEach(emitProgress);\n        },\n      });\n      progressParser.flush().forEach(emitProgress);\n      this.emit('end', result, context);\n      return result;\n    } catch (error) {\n      progressParser.flush().forEach(emitProgress);\n      throw error;\n    }\n  }\n\n  private currentBuilder(): BuilderState {\n    return {\n      commands: this.commands,\n      inputs: this.inputs,\n      filtersComplex: this.filtersComplex,\n      options: this.options,\n    };\n  }\n\n  private consumeBuilder(): BuilderState {\n    const builder = this.currentBuilder();\n    this.commands = [];\n    this.inputs = [this.file_path];\n    this.filtersComplex = [];\n    this.options = {};\n    return builder;\n  }\n\n  private runOperation<T>(\n    context: MediaOperationContext,\n    operation: (builder: BuilderState) => Promise<T>,\n    callback?: LegacyCallback<T>,\n  ): Promise<T> | void {\n    const builder = this.consumeBuilder();\n    const promise = Promise.resolve()\n      .then(() => operation(builder))\n      .catch((error: unknown) => {\n        if (this.listenerCount('error') > 0) this.emit('error', error, context);\n        throw error;\n      });\n    return settle(promise, callback);\n  }\n\n  private createOperationContext(\n    kind: MediaOperationKind,\n    destination: string,\n  ): MediaOperationContext {\n    return Object.freeze({ operationId: randomUUID(), kind, destination });\n  }\n}\n\nasync function frameFingerprints(\n  directory: string,\n  matcher: RegExp,\n): Promise<Map<string, FileFingerprint>> {\n  const entries = (await readdir(directory)).filter((entry) => matcher.test(entry));\n  const fingerprints = new Map<string, FileFingerprint>();\n  await Promise.all(\n    entries.map(async (entry) => {\n      try {\n        const details = await stat(join(directory, entry));\n        fingerprints.set(entry, {\n          size: details.size,\n          mtimeMs: details.mtimeMs,\n          ctimeMs: details.ctimeMs,\n        });\n      } catch {\n        // A concurrently removed file is not an output of this run.\n      }\n    }),\n  );\n  return fingerprints;\n}\n\nfunction watermarkOverlay(position: string, settings: WatermarkSettings): string {\n  const north = Number(settings.margin_nord ?? 0);\n  const south = Number(settings.margin_sud ?? 0);\n  const east = Number(settings.margin_east ?? 0);\n  const west = Number(settings.margin_west ?? 0);\n  const left = String(west);\n  const center = '(main_w-overlay_w)/2';\n  const right = `main_w-overlay_w-${east}`;\n  const top = String(north);\n  const middle = '(main_h-overlay_h)/2';\n  const bottom = `main_h-overlay_h-${south}`;\n  const coordinates: Record<string, [string, string]> = {\n    NW: [left, top],\n    NC: [center, top],\n    NE: [right, top],\n    CW: [left, middle],\n    C: [center, middle],\n    CE: [right, middle],\n    SW: [left, bottom],\n    SC: [center, bottom],\n    SE: [right, bottom],\n  };\n  return (coordinates[position] ?? coordinates.SW ?? ['0', 'main_h-overlay_h']).join(':');\n}\n","import type { Progress } from './types.js';\n\nexport function effectiveDuration(\n  sourceDuration: number,\n  window: { startTime?: number | undefined; duration?: number | undefined } = {},\n): number {\n  const configured = window.duration;\n  if (sourceDuration > 0) {\n    const remaining = Math.max(0, sourceDuration - (window.startTime ?? 0));\n    return configured === undefined ? remaining : Math.min(remaining, configured);\n  }\n  return configured ?? 0;\n}\n\nexport class ProgressStreamParser {\n  private remainder = '';\n\n  constructor(private readonly duration: number) {}\n\n  write(chunk: string): Progress[] {\n    const parts = `${this.remainder}${chunk}`.split(/\\r\\n|[\\r\\n]/);\n    this.remainder = parts.pop() ?? '';\n    if (this.remainder.length > 64 * 1024) this.remainder = this.remainder.slice(-64 * 1024);\n    return parts\n      .map((line) => parseProgress(line, this.duration))\n      .filter((progress): progress is Progress => progress !== undefined);\n  }\n\n  flush(): Progress[] {\n    const progress = parseProgress(this.remainder, this.duration);\n    this.remainder = '';\n    return progress ? [progress] : [];\n  }\n}\n\nexport function parseProgress(chunk: string, duration: number): Progress | undefined {\n  const timeMatch = /time=(\\d+):(\\d{2}):(\\d{2}(?:\\.\\d+)?)/.exec(chunk);\n  if (!timeMatch) return undefined;\n  const time = Number(timeMatch[1]) * 3600 + Number(timeMatch[2]) * 60 + Number(timeMatch[3]);\n  const frames = /frame=\\s*(\\d+)/.exec(chunk)?.[1];\n  const fps = /fps=\\s*([\\d.]+)/.exec(chunk)?.[1];\n  const speed = /speed=\\s*([\\d.]+)x/.exec(chunk)?.[1];\n  const progress: Progress = { time };\n  if (frames) progress.frames = Number(frames);\n  if (fps) progress.fps = Number(fps);\n  if (speed) progress.speed = Number(speed);\n  if (duration > 0) progress.percent = Math.min(100, (time / duration) * 100);\n  return progress;\n}\n"],"mappings":"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","names":["import_node_fs","format","import_node_path","numeric","format","signal"]}