web UI:目录和文件既能点「浏览」逐级选,也能手工填
浏览器拿不到本地绝对路径,所以「交互式选择」做成后端列目录 + 弹窗点选: - 新增 GET /api/browse:path 为空时用程序所在目录,kind=file 连文件一起列, hidden=1 带上点开头的隐藏项;文件夹优先排序,上限 2000 项。打不开时仍返回 200 并带上 error 和 parent —— 页面据此自动向上退,不会把用户卡在一个打不开 的路径里(框里填的是文件路径时,就是这样落到它所在的目录的)。权限没放宽, 和其它管理接口一样走口令。 - 文件保存目录、成片移动到、ffmpeg 路径、手动合并的弹幕文件这四个框加了 「浏览…」按钮,输入框本身照旧可以直接填或粘贴;弹窗里的地址栏也能粘贴路径 回车跳转,点选和手填随时切换。默认不列隐藏项,需要时勾「显示隐藏项」。 - 文件夹单击进入(手机上也能用),文件单击选中、双击直接选用;连点同一项、 以及刚跳转过后的 350ms 内忽略点击,双击文件夹不会连进两层。 - 选完只标记「未保存」并填进输入框,不自动保存,和文本框的规则保持一致。 - 补上 README 里的用法和 doc/webapi.md 里的接口说明。 新增 browse_test.go(12 个用例);仓库外的 verify_pick.py 30 项断言全过, go test ./...、gofmt、go vet、构建均干净。
This commit is contained in:
@@ -109,3 +109,20 @@ web UI(`-webui`,端口看`webPort`)用的是另一套`/api/`接口,全
|
||||
成功后返回`{"ok":true,"detail":"webhook 返回 HTTP 200,用时 0.31 秒。…"}`,`detail`就是页面上显示的那句结论。失败时返回 502 并在响应体里给中文原因(如`MeoW 返回 status 404(昵称未注册)`),参数不合法返回 400。
|
||||
|
||||
MeoW 的`status`和封禁规则会反映在`GET /api/status`的`meowBlocked`字段里:昵称没填、格式不对、或已被 MeoW 判过「未注册」时,这里会给出中文原因,非空就说明 MeoW 渠道当前推不出去。注意 MeoW 一天内累计 3 次推给不存在的昵称会封 IP,所以被判过不存在的昵称会被程序记住并停止重试,改昵称或重启程序才恢复。
|
||||
|
||||
`GET /api/browse` 给页面上的`浏览`按钮列目录用。参数:`path`(要展开的目录,不填就用程序当前的工作目录)、`kind=file`(连文件一起列,挑文件时用)、`hidden=1`(连以点开头的隐藏项一起列)。
|
||||
|
||||
```
|
||||
{
|
||||
"path": "D:\\record", // 当前展开的目录,已转成绝对路径
|
||||
"parent": "D:\\", // 上级目录,已经到根时是空串
|
||||
"roots": [{"name": "C:", "path": "C:\\", "dir": true, "size": 0}],
|
||||
"entries": [{"name": "2026-09-25.mp4", "path": "D:\\record\\2026-09-25.mp4", "dir": false, "size": 123}],
|
||||
"truncated": false, // 条目太多时只返回前 2000 项
|
||||
"error": "" // 打不开时的中文原因
|
||||
}
|
||||
```
|
||||
|
||||
文件夹排在文件前面,同类按名字排(不区分大小写)。挑文件时文件夹照样会列出来,不然进不去子目录。`error`非空时仍是 HTTP 200,`entries`是空的,但`parent`会带上——页面据此退到上一级,不会把用户卡在一个打不开的路径里(比如把文件路径当目录展开时)。
|
||||
|
||||
这个接口能看到整台机器的目录,但权限和其它管理接口一样,都是拿到口令即全部权限,没有放宽。
|
||||
|
||||
Reference in New Issue
Block a user