转码的源文件不再限死在录播/成片目录,可以填任意路径

为什么
  转码页的多选框只列 /api/files 的内容,也就是录播目录和成片目录两处;后端的
  resolveTranscodeInput 走 resolveFile,也只认 record/merge 两个目录名。结果是
  录播原片被合并且清掉之后(或者录播目录本来就空),转码页里只剩合并结果可挑,
  磁盘上别处的视频一个都进不来。

怎么改
  - transcodeJobReq 加 Path 字段,与 dir/name 二选一;新增 resolveTranscodeJob()
    把「填了路径就按路径找(认绝对路径和从资源管理器复制来的带引号路径,走
    resolveMergeInput)、否则回落 dir+name」收在一处,两条路最后统一过
    mergeVideoExts 白名单 —— 路径这条能指向磁盘上任何文件,不挡的话手滑把 .jsonl
    丢进来要等 ffmpeg 跑起来才报错。三个调用点和 runTranscode 全部改走它。
  - transcodeProbe 回显绝对路径,页面拿它当任务身份:同名文件在不同目录里不会再
    被认成一个,重复加入也因此挡得住。
  - 转码卡片改成两栏:左边保留原来的文件列表多选,右边加「一行一个路径」的输入框
    和「浏览…」按钮(复用已有的目录选择器,可多选、可跨文件夹跨盘攒,选完只追加不
    覆盖)。openPick 多了个可选的第 5 参数用来指定起始目录,浏览转码文件时从成片
    目录开始(录播目录可能是空的)。
  - 报错前缀改用 transcodeJobReq.label():按路径进来时 Name 是空的,直接拼 j.Name
    会变成「:参数不合法」。

验证
  gofmt -l 干净;go vet 干净;Windows 与 GOOS=linux 编译均通过。
  go test ./... 全绿;go test -race -count=1 ./... 27.2s 全绿;顶层用例 209 个
  (含子测试 226),本次新增 3 个:-run 单独跑过 TestResolveTranscodeJobByPath /
  TestResolveTranscodeJobRejectsBadPath / TestTranscodeProbeHandlerAcceptsPath。
  反向验证 44/44:把 resolveTranscodeJob 的路径分支退回 resolveFile 后,上面两个
  用例确实变红。
  转码接口冒烟 40/40(新增 11 项按路径的:探测回显路径、估算、不存在 400、非视频
  后缀 400、指向文件夹 400、真排队转出成片)。
  页面 jsdom 冒烟 49/49 且无 JS 报错(新增 12 项:路径框存在、空框不给加入、手填能
  进列表并带上绝对路径、探测请求按 path 发、重复加入不重复、浏览弹窗打开/追加不
  覆盖/关闭/清空)。
This commit is contained in:
tamakyi
2026-09-27 11:10:00 +08:00
parent a409c5b4dd
commit 3c17503a21
5 changed files with 214 additions and 39 deletions
+1
View File
@@ -350,6 +350,7 @@ func TestWebuiSettingFieldsMatchInputs(t *testing.T) {
"pickPath": "路径选择弹窗的内部状态",
"mrgVideoPick": "手动合并:视频列表,随合并请求提交",
"tcFilePick": "转码:待选文件列表,随转码请求提交",
"tcPaths": "转码:手填的文件路径列表,随转码请求提交",
"tcOutDir": "转码:输出目录,随转码请求提交",
}
for id := range ids {