public/设置ffmpeg路径.ps1

function 设置ffmpeg路径 {
    <#
    .SYNOPSIS
        设置模块内部使用的 ffmpeg/ffprobe 所在目录。
 
    .DESCRIPTION
        指定 ffmpeg.exe 和 ffprobe.exe 所在的目录后,视频工坊的所有命令(烧录字幕、DV转HDR10、超级合并)都会优先调用该目录下的 ffmpeg/ffprobe。
        设置会永久保存到 %LOCALAPPDATA%\视频工坊\ffmpeg路径.txt,以后新开的PowerShell 会话导入视频工坊时也会自动使用该路径;优先级高于 PATH 中的同名命令。如果指定目录下没有找到 ffmpeg.exe/ffprobe.exe,命令会自动清除该自定义目录设置(含已保存的设置文件),回退到 PATH,并在 PATH 中也缺失时按原有流程自动下载安装,不会因此失败。
        传入 ffmpeg.exe 自身的完整路径也可以,函数会自动取其所在目录。
        传入 $null 或空字符串可取消自定义设置,恢复默认查找行为(同时删除已保存的设置文件)。
 
    .PARAMETER 路径
        ffmpeg.exe 所在目录,或 ffmpeg.exe 的完整路径。目录必须已存在。
        传入 $null 或空字符串表示取消自定义设置。
 
    .EXAMPLE
        设置ffmpeg路径 'D:\Tools\ffmpeg\bin'
 
        之后所有命令都优先使用 D:\Tools\ffmpeg\bin 下的 ffmpeg/ffprobe。
 
    .EXAMPLE
        设置ffmpeg路径 'D:\Tools\ffmpeg\bin\ffmpeg.exe'
 
        与传目录等价,函数自动使用其所在目录。
 
    .EXAMPLE
        设置ffmpeg路径 $null
 
        取消自定义设置,恢复使用 PATH 查找。
 
    .NOTES
        设置保存在 %LOCALAPPDATA%\视频工坊\ffmpeg路径.txt,跨会话永久生效。
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory, Position = 0)]
        [AllowNull()]
        [AllowEmptyString()]
        [string]$路径
    )

    if ([string]::IsNullOrWhiteSpace($路径)) {
        $script:自定义ffmpeg目录 = $null
        $script:自定义ffmpeg缺失已警告 = $false
        $script:ffmpeg编码器集合 = $null
        写入_自定义ffmpeg路径设置 -目录 $null
        Write-Host "已取消自定义 ffmpeg 路径,恢复默认查找行为。" -ForegroundColor Green
        return
    }

    $路径 = 规范化_用户路径参数 -Path $路径

    # 如果传入的是 ffmpeg.exe 文件本身,取其所在目录
    if ([string]::Equals([System.IO.Path]::GetFileName($路径), 'ffmpeg.exe', [System.StringComparison]::OrdinalIgnoreCase)) {
        $目录 = [System.IO.Path]::GetDirectoryName($路径)
        if ([string]::IsNullOrWhiteSpace($目录)) { $目录 = $路径 }
        $路径 = $目录
    }

    if (-not (Test-Path -LiteralPath $路径 -PathType Container)) {
        throw "目录不存在:$路径"
    }

    $script:自定义ffmpeg目录 = (Resolve-Path -LiteralPath $路径).Path
    $script:自定义ffmpeg缺失已警告 = $false
    $script:ffmpeg编码器集合 = $null

    写入_自定义ffmpeg路径设置 -目录 $script:自定义ffmpeg目录

    Write-Host "ffmpeg 目录已设置为:$($script:自定义ffmpeg目录)(已永久保存,新会话自动生效)" -ForegroundColor Green

    $缺少的工具 = @(@('ffmpeg','ffprobe') | Where-Object { -not (解决_自定义工具路径 -工具名 $_) })
    if ($缺少的工具.Count -gt 0) {
        Write-Warning ("该目录下未找到:$($缺少的工具 -join ', ')。已自动清除该目录设置,改用 PATH 查找;若 PATH 中也缺失,仍会自动下载安装。")
        $script:自定义ffmpeg目录 = $null
        $script:ffmpeg编码器集合 = $null
        写入_自定义ffmpeg路径设置 -目录 $null
    }
}