dsh-bili-watch 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +195 -196
- package/client.js +74 -29
- package/cordis.patch.yml +2 -1
- package/deps/_bili-asr.py +3 -1
- package/index.js +102 -33
- package/package.json +1 -1
- package/scripts/fetch-deps.ps1 +5 -3
- package/tools/look.mjs +94 -42
package/README.md
CHANGED
|
@@ -1,122 +1,192 @@
|
|
|
1
1
|
# dsh-bili-watch
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[]()
|
|
4
|
+
[]()
|
|
5
|
+
[]()
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
DSH 插件 / CLI 工具:将 B 站视频解析为模型可消费的结构化内容(元数据、评论、弹幕、AI 字幕、本地 ASR 转写、抽帧 OCR)。
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
## 特性
|
|
10
|
+
|
|
11
|
+
- 支持 `b23.tv` 短链、BV 号、av 号及通用 URL(经 yt-dlp)
|
|
12
|
+
- 降级链:AI 字幕 → 本地 ASR → 抽帧 OCR → 读图,四级全 miss 时退出码为 1
|
|
13
|
+
- 匿名可用:元数据、评论、弹幕、搜索、热榜无需登录
|
|
14
|
+
- 可选依赖:ffmpeg(抽帧)、Python venv(ASR/OCR)、faster-whisper(转写模型)
|
|
15
|
+
- Web 面板:依赖管理、扫码登录、缓存清理、17 项运行时参数可调
|
|
11
16
|
|
|
12
17
|
## 安装
|
|
13
18
|
|
|
14
|
-
###
|
|
19
|
+
### DSH 插件
|
|
15
20
|
|
|
16
21
|
```bash
|
|
17
22
|
dsh plugin --profile web add dsh-bili-watch
|
|
18
23
|
```
|
|
19
24
|
|
|
20
|
-
|
|
25
|
+
重启 DSH 后生效。DSH ≥ 0.2.0-rc.2 自动写入 `dsh.profile.bundles`;更早版本需手动在 profile `package.json` 的 `dsh.profile.bundles` 数组追加 `"dsh-bili-watch"`。
|
|
21
26
|
|
|
22
|
-
|
|
27
|
+
> **装完重启即可用。** 本插件的 bundle patch 不带 `disabled`,装进 profile 的 `dsh.profile.bundles` 后重启 DSH 就生效,命令直接存在。
|
|
28
|
+
>
|
|
29
|
+
> 0.3.1 及更早的版本不是这样:包在装的那一刻就被写进 `dsh.profile.bundles`(`reconcile()` 干的),所以插件页显示「已启用」,但实际不加载——因为层里那行 `disabled: true` 是插件页开关碰不到的位置。症状是「显示已启用但命令不存在,点开关也没用」。那个 `disabled` 是 0.2.17 应急修 bug 时误加的,带了 7 个版本,0.3.2 已去掉。
|
|
23
30
|
|
|
24
|
-
|
|
31
|
+
> **从旧版本升级的注意**:`reconcile()` 只在「新增依赖」时跑,所以以前手动从 `dsh.profile.bundles` 删过包名的人,`pnpm update` 到 0.3.2 之后包名不会自动补回来,需要重跑一次 `dsh plugin --profile web add dsh-bili-watch`。
|
|
25
32
|
|
|
26
|
-
|
|
33
|
+
验证:`dsh --profile web --dump-config` 输出中可检索到 `dsh-bili-watch`。
|
|
27
34
|
|
|
28
|
-
|
|
35
|
+
亦可直接放入 `profiles/<name>/node_modules/dsh-bili-watch`。
|
|
29
36
|
|
|
30
|
-
|
|
37
|
+
插件依赖 `@deepseek-ai/dsh-tools`(peer, optional)。缺失时 `bili_watch` 工具不注册,`/bili` 命令与面板仍可用。
|
|
31
38
|
|
|
32
|
-
###
|
|
39
|
+
### CLI 全局安装
|
|
33
40
|
|
|
34
41
|
```bash
|
|
35
42
|
npm i -g dsh-bili-watch
|
|
36
43
|
bili-watch view BV1EPnG6DEJC
|
|
37
44
|
```
|
|
38
45
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
### 更新与卸载
|
|
46
|
+
或 clone 后直接运行:
|
|
42
47
|
|
|
43
48
|
```bash
|
|
44
|
-
|
|
45
|
-
dsh plugin --profile web remove dsh-bili-watch
|
|
49
|
+
node tools/look.mjs view BV1EPnG6DEJC
|
|
46
50
|
```
|
|
47
51
|
|
|
48
|
-
|
|
52
|
+
## 用法
|
|
49
53
|
|
|
50
|
-
|
|
54
|
+
### 命令一览
|
|
51
55
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
56
|
+
| 命令 | 说明 |
|
|
57
|
+
|---|---|
|
|
58
|
+
| `view <target>` | 元数据 + 简介 + 热评。不下载、不依赖 ffmpeg,匿名可用 |
|
|
59
|
+
| `peek <target>` | 元数据 + 热评 + 5 帧均匀抽帧。需下载 360p(约 1 MB/min);OCR 环境就绪时顺带识别。仅 B 站 |
|
|
60
|
+
| `sub <BV或链接> [--format srt\|json\|md\|txt] [--out <path>]` | AI 字幕。`--format` 输出 SRT / JSON(含时间戳)/ Markdown(含跳转链接)/ 纯文本 txt。需登录 |
|
|
61
|
+
| `comments <bv> [N]` | 评论区,默认按热度排序 |
|
|
62
|
+
| `asr <target>` | 本地 ASR 转写,附「可信 / 疑似幻觉」判定 |
|
|
63
|
+
| `frames <target> [--step <sec>] [--ocr]` | 抽帧;`--ocr` 附带画面文字识别 |
|
|
64
|
+
| `ocr <bv>` | 抽帧并 OCR |
|
|
65
|
+
| `text <target> [--format json\|md]` | 四级降级链:字幕 → 转写 → 抽帧 OCR → 读图。全 miss 退出码 1 |
|
|
66
|
+
| `sheet <bv> [--grid 3x3]` | 均匀抽帧拼图,默认 9 帧 |
|
|
67
|
+
| `substrip <bv> [--step <sec>]` | 底部字幕竖拼 |
|
|
68
|
+
| `danmaku <bv>` | 弹幕热区(按时间桶统计峰值) |
|
|
69
|
+
| `local <path> [--ocr] [--frames]` | 本地视频文件走降级链(从转写层起)。仅 CLI |
|
|
70
|
+
| `search <关键词> [--days 3] [--limit 10] [--order pubdate\|click]` | 视频搜索。`--days` 生效时最多抓 3 页,结果仍按 `--limit` 截断 |
|
|
71
|
+
| `hot [--limit 10]` | 综合热门榜 |
|
|
72
|
+
| `login [--check] [--poll] [--key <key>]` | 扫码登录。`--check` 校验凭证有效性;`--key` 需配合 `--poll` |
|
|
73
|
+
| `clean` | 清空缓存根。任务进行中(锁文件存活)时拒绝并返回非零退出码 |
|
|
74
|
+
|
|
75
|
+
`<target>` 接受 BV 号、`b23.tv` 短链、av 号或 URL。
|
|
76
|
+
|
|
77
|
+
### 通用参数
|
|
78
|
+
|
|
79
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
80
|
+
|---|---|---|---|
|
|
81
|
+
| `--format` | enum | — | 输出格式。`--out` 必须配合此参数使用,单独指定 `--out` 返回退出码 1 |
|
|
82
|
+
| `--out <path>` | string | — | 落盘路径,相对当前工作目录(cwd)。目录不存在时自动创建 |
|
|
83
|
+
| `--ffmpeg <path>` | string | — | ffmpeg 可执行文件路径 |
|
|
84
|
+
| `--cred <path>` | string | — | 凭证 JSON 路径,格式 `{sessdata, bili_jct, buvid3, buvid4}` |
|
|
85
|
+
| `--asr-max <ms>` | number | 1800000 | 转写时长闸门(毫秒)。视频长于此值时仅输出画面描述 |
|
|
86
|
+
| `--head <n>` | number | 0(不截断) | 长文本摘要长度。不传或传 0 = 输出全文 |
|
|
87
|
+
| `--full` | flag | — | 输出全文(不截断) |
|
|
88
|
+
| `--verify` | flag | — | 字幕可疑时抽 5 帧 OCR 交叉校验。字幕正常时不触发 |
|
|
89
|
+
| `--fresh` | flag | — | 忽略缓存强制重跑 |
|
|
90
|
+
| `--mark-seen` | flag | — | 标记为已读 |
|
|
91
|
+
|
|
92
|
+
完整参数列表见 `bili-watch help`。
|
|
93
|
+
|
|
94
|
+
### 长文本保护
|
|
95
|
+
|
|
96
|
+
正文超过 800 字时,终端仅返回前 400 字摘要 + 落盘路径,全文写入缓存目录。工具层(`bili_watch`)阈值为 2000 字(摘要 800 字)。
|
|
97
|
+
|
|
98
|
+
## 配置
|
|
99
|
+
|
|
100
|
+
### 环境变量
|
|
101
|
+
|
|
102
|
+
| 变量 | 默认值 | 说明 |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| `BILI_WATCH_PROJ` | `deps/` | ASR/OCR 环境目录 |
|
|
105
|
+
| `BILI_WATCH_FFMPEG` | — | ffmpeg 可执行文件路径 |
|
|
106
|
+
| `BILI_WATCH_YTDLP` | — | yt-dlp 可执行文件路径 |
|
|
107
|
+
| `BILI_WATCH_SEEN` | `deps/seen.md` | 已读标记文件路径 |
|
|
108
|
+
| `BILI_WATCH_CACHE` | `$DSH_HOME/bili-watch/cache` | 抽帧缓存根目录。优先级:环境变量 > `deps/deps-config.json` > 默认值 |
|
|
109
|
+
| `BILI_WATCH_MIRROR` | — | 设为 `cn` 时 `fetch-deps` 走国内镜像 |
|
|
110
|
+
| `HF_ENDPOINT` | `https://hf-mirror.com` | 转写模型下载端点 |
|
|
111
|
+
| `BILI_ASR_MODEL` | `small` | faster-whisper 模型名 |
|
|
112
|
+
|
|
113
|
+
### 运行时参数(面板可调)
|
|
114
|
+
|
|
115
|
+
以下参数通过 Web 面板或 `deps/deps-config.json` 调整,保存后立即生效:
|
|
116
|
+
|
|
117
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
118
|
+
|---|---|---|---|
|
|
119
|
+
| `asrMemMB` | number (MB) | 1536 | 本地 ASR 内存门槛。低于此值跳过转写 |
|
|
120
|
+
| `lockTtlMin` | number (min) | 30 | 残留锁过期时长 |
|
|
121
|
+
| `unitLimit` | number (chars) | 5000 | 单条评论/弹幕截断阈值 |
|
|
122
|
+
| `textLimit` | number (chars) | 800 | 文本层单次返回正文上限 |
|
|
123
|
+
| `toolTextCap` | number (chars) | 2000 | 工具层单次返回正文总上限 |
|
|
124
|
+
| `toolHead` | number (chars) | 800 | 工具层默认返回头部字数 |
|
|
125
|
+
| `dmBucketSec` | number (sec) | 30 | 弹幕分桶宽度 |
|
|
126
|
+
| `dmTop` | number (buckets) | 5 | 弹幕热区输出条数 |
|
|
127
|
+
| `downloadMaxMB` | number (MB) | 512 | 单文件下载体积上限 |
|
|
128
|
+
| `subRateMin10` | number (×10 chars/s) | 20 | 字幕语速下限(2.0 字/秒) |
|
|
129
|
+
| `subRateMax10` | number (×10 chars/s) | 85 | 字幕语速上限(8.5 字/秒) |
|
|
130
|
+
| `textBrief` | number (chars) | 400 | 超长文本摘要长度 |
|
|
131
|
+
| `asrMaxSec` | number (sec) | 1800 | 转写时长闸门 |
|
|
132
|
+
| `maxFrames` | number | 500 | 抽帧张数上限 |
|
|
133
|
+
| `asrTimeoutSec` | number (sec) | 900 | ASR 进程超时 |
|
|
134
|
+
| `ffmpegTimeoutSec` | number (sec) | 300 | ffmpeg 进程超时 |
|
|
135
|
+
| `cmdTimeoutSec` | number (sec) | 180 | 通用命令超时 |
|
|
136
|
+
|
|
137
|
+
## 缓存路径
|
|
138
|
+
|
|
139
|
+
默认缓存根:`$DSH_HOME/bili-watch/cache`(`$DSH_HOME` 默认为用户目录下 `.dsh`)。
|
|
140
|
+
|
|
141
|
+
- 登录凭证:`$DSH_HOME/bili-watch/credential.json`(缓存根的兄弟文件,清理缓存时勿误删上级目录)
|
|
142
|
+
- 自定义缓存位置:设置 `BILI_WATCH_CACHE` 环境变量,或在 `deps/deps-config.json` 写入 `"cache": "<dir>"`。指向外部目录时插件自动创建 `bili-watch-cache/` 子目录作为缓存根
|
|
143
|
+
- 修改后需重启 DSH 生效
|
|
144
|
+
- 自动清理规则(保留天数 / 总量上限)存于 `deps/cache-config.json`,默认保留 7 天 / 上限 2048 MB,启动时与打开面板时各检查一次
|
|
145
|
+
|
|
146
|
+
## 卸载
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
dsh plugin --profile web remove dsh-bili-watch
|
|
73
150
|
```
|
|
74
151
|
|
|
75
|
-
|
|
152
|
+
### 卸载前备份
|
|
76
153
|
|
|
77
|
-
|
|
154
|
+
包内 `deps/` 随卸载删除,需提前拷出以下 4 份文件,重装后放回原位:
|
|
78
155
|
|
|
79
|
-
|
|
156
|
+
1. `deps/deps-config.json` — 运行时参数与自定义缓存路径
|
|
157
|
+
2. `deps/cache-config.json` — 自动清理规则
|
|
158
|
+
3. `deps/ui-config.json` — 面板显示开关
|
|
159
|
+
4. `deps/seen.md` — 已读标记(或将 `BILI_WATCH_SEEN` 指向包外路径)
|
|
80
160
|
|
|
81
|
-
|
|
82
|
-
- **扫码登录**:凭证未登录时点「去扫码登录」(已登录是「重新扫码」),面板里弹出二维码,手机 B 站扫完自动刷新。凭证保存在本机 `$DSH_HOME/bili-watch/credential.json`。
|
|
83
|
-
- **删除**:面板按实际路径判断——yt-dlp、转写模型、登录凭证可直接删;ffmpeg / ASR 环境 / OCR 环境不提供删除按钮(环境删了要重跑 `fetch-deps` 装回来,代价大于省下的空间),旁边标出它实际在哪。
|
|
84
|
-
- **批量**:标题行的「批量下载 / 批量清理」打开勾选清单,默认勾上所有可操作的项,删除前会再确认一次。
|
|
85
|
-
- **抽帧缓存**:显示当前占用与文件数,「立即清除」一键清空;不点则会按规则自动清理——保留天数(默认 7 天)与总量上限(默认 2048 MB),超过则从最旧的删起。规则存在 `deps/cache-config.json`,插件启动和打开面板时各检查一次。
|
|
86
|
-
- **缓存位置**:默认在 DSH 家目录下再往下一层的 `cache/`(`$DSH_HOME/bili-watch/cache`;`$DSH_HOME` 就是 DSH 的家目录,Windows 下通常是用户目录里的 `.dsh`)。登录凭证是它的**兄弟文件** `$DSH_HOME/bili-watch/credential.json`,清缓存时别把上一层一起删。要换位置就设环境变量 `BILI_WATCH_CACHE`,或在 `deps/deps-config.json` 里写 `"cache": "<你的缓存目录>"`(指到一个还不是缓存根的目录时,插件会在里面建 `bili-watch-cache/`,不会直接拿你的目录当缓存根);改完重启 DSH 生效,面板「抽帧缓存 → 位置」会显示当前实际路径。
|
|
87
|
-
- **最近一次调用**:显示命令、时间、成败,用来判断上一次看视频是否卡住。
|
|
161
|
+
### 卸载后残留
|
|
88
162
|
|
|
89
|
-
|
|
163
|
+
- 登录凭证 `$DSH_HOME/bili-watch/credential.json` 不在包内,卸载不删除;如需清除手动删除
|
|
164
|
+
- 缓存根 `$DSH_HOME/bili-watch/cache` 不在包内,卸载不删除;仅清理 `cache/` 子目录,勿删上级凭证文件
|
|
90
165
|
|
|
91
166
|
## 依赖
|
|
92
167
|
|
|
93
|
-
| 能力 |
|
|
168
|
+
| 能力 | 依赖 | 缺失行为 |
|
|
94
169
|
|---|---|---|
|
|
95
170
|
| 元数据 / 评论 / 弹幕 / 搜索 / 热榜 | 无(匿名 HTTP) | — |
|
|
96
|
-
| 抽帧 / 九宫格 / 字幕带 |
|
|
97
|
-
| AI 字幕 |
|
|
98
|
-
|
|
|
99
|
-
| 画面 OCR | Python 3.10+
|
|
100
|
-
|
|
|
101
|
-
|
|
102
|
-
环境:Node.js ≥ 22。装在 DSH 里时 DSH 自带 node,命令行跑也一样。
|
|
103
|
-
|
|
104
|
-
`ffmpeg` 查找顺序:`--ffmpeg` 参数 → `BILI_WATCH_FFMPEG` → `deps/deps-config.json` 里的 `ffmpeg` → 插件 `deps/ffmpeg.exe` → PATH。
|
|
171
|
+
| 抽帧 / 九宫格 / 字幕带 | ffmpeg | 报错并提示安装方式 |
|
|
172
|
+
| AI 字幕 | B 站登录态(SESSDATA) | 返回无字幕轨,降级至下一级 |
|
|
173
|
+
| 本地 ASR | Python ≥ 3.10 + faster-whisper(`deps/.venv-asr`) | 跳过,降级 |
|
|
174
|
+
| 画面 OCR | Python ≥ 3.10 + rapidocr_onnxruntime(`deps/.venv-ocr`) | 跳过,仅基础抽帧 |
|
|
175
|
+
| 通用 URL | yt-dlp | 仅支持 B 站 |
|
|
105
176
|
|
|
106
|
-
|
|
177
|
+
环境要求:Node.js ≥ 22。
|
|
107
178
|
|
|
108
|
-
`
|
|
179
|
+
`ffmpeg` 查找顺序:`--ffmpeg` > `BILI_WATCH_FFMPEG` > `deps/deps-config.json` > `deps/ffmpeg.exe` > `PATH`。
|
|
109
180
|
|
|
110
|
-
###
|
|
181
|
+
### 一键安装依赖
|
|
111
182
|
|
|
112
183
|
```powershell
|
|
113
|
-
# Windows
|
|
184
|
+
# Windows
|
|
114
185
|
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target all
|
|
115
|
-
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target all -Mirror cn
|
|
186
|
+
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target all -Mirror cn
|
|
116
187
|
|
|
117
188
|
# 单项:ffmpeg / ytdlp / asr / ocr / model
|
|
118
189
|
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target ytdlp
|
|
119
|
-
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target model
|
|
120
190
|
```
|
|
121
191
|
|
|
122
192
|
```bash
|
|
@@ -125,158 +195,87 @@ bash scripts/fetch-deps.sh all
|
|
|
125
195
|
BILI_WATCH_MIRROR=cn bash scripts/fetch-deps.sh all
|
|
126
196
|
```
|
|
127
197
|
|
|
128
|
-
|
|
198
|
+
## 故障排查
|
|
129
199
|
|
|
130
|
-
|
|
200
|
+
### 凭证
|
|
131
201
|
|
|
132
|
-
|
|
133
|
-
2. 手动下载 `ffmpeg.exe` 放进 `deps\` 再重跑(会被跳过);
|
|
134
|
-
3. 已经有 ffmpeg 就设 `BILI_WATCH_FFMPEG` 指向它。
|
|
202
|
+
仅 AI 字幕需要登录。凭证优先级:`--cred` > `$DSH_HOME/bili-watch/credential.json` > 匿名。
|
|
135
203
|
|
|
136
|
-
|
|
204
|
+
例外:若本机安装了 bili-duty 且其凭证文件更新,watch 优先复用。面板删除凭证后若 bili-duty 仍存在,仍将使用共享登录态。
|
|
137
205
|
|
|
138
|
-
|
|
206
|
+
凭证文件等同账号登录态,禁止外传或提交版本库。
|
|
139
207
|
|
|
140
|
-
|
|
208
|
+
### 转写可信度
|
|
141
209
|
|
|
142
|
-
|
|
210
|
+
本地 ASR 输出附判定字段:
|
|
143
211
|
|
|
144
|
-
|
|
145
|
-
|
|
212
|
+
- **可信**:VAD 检测到足够人声,无跨窗重复模板句
|
|
213
|
+
- **疑似幻觉**:VAD 人声 < 0.5 秒却输出文本、跨 2 秒以上窗口重复文本占比 > 50%、`no_speech_prob > 0.5` 分段占比过半
|
|
146
214
|
|
|
147
|
-
|
|
215
|
+
判为疑似幻觉时应通过抽帧 OCR 交叉验证,不可直接引用为台词。
|
|
148
216
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
## 命令
|
|
152
|
-
|
|
153
|
-
| 命令 | 做什么 |
|
|
154
|
-
|---|---|
|
|
155
|
-
| `view <BV或链接或URL>` | 元数据 + 简介 + 热评(不下载、不依赖 ffmpeg,永远能跑) |
|
|
156
|
-
| `peek <BV或链接>` | 元数据 + 热评 + 5 张均匀帧(需下载 360p 约每分钟 1 MB + 抽帧约 2 秒;装了 OCR 环境时会顺带识别这 5 帧;仅 B 站) |
|
|
157
|
-
| `sub <BV或链接> [--format srt\|json\|md\|txt] [--out 文件(需配合 --format)]` | AI 字幕 + 两判据(字/秒、关键词重合;时长只用作语速的分母);`--format` 输出 SRT、JSON(带官方时间戳)、Markdown(每条带跳回原片的链接)或纯文本 txt(不带时间戳) |
|
|
158
|
-
| `comments <BV> [N]` | 评论区,默认按热度排序 |
|
|
159
|
-
| `asr <BV或URL>` | 本地转写音频,并给出「可信 / 疑似幻觉」判定(见下节) |
|
|
160
|
-
| `frames <BV或URL> [--step 秒] [--ocr]` | 抽帧;`--ocr` 顺带识别画面文字 |
|
|
161
|
-
| `ocr <BV>` | 抽帧并 OCR |
|
|
162
|
-
| `text <BV或URL> [--format json\|md]` | 四级链:字幕 → 转写 → 抽帧 OCR;`--format json` 带上时间轴口径(字幕 exact,转写与 OCR 是估算);`md` 有字幕时出时间轴,没有就出标题+全文;SRT 只有 `sub` 支持 |
|
|
163
|
-
| `sheet <BV> [--grid 3x3]` | 均匀挑帧拼成一张图(`NxM` 如 `3x3`、`4x4`,默认 9 帧) |
|
|
164
|
-
| `substrip <BV> [--step 秒]` | 底部字幕竖拼成一张图 |
|
|
165
|
-
| `danmaku <BV>` | 弹幕热区(按时间桶统计峰值) |
|
|
166
|
-
| `local <文件路径> [--ocr] [--frames]` | 本地视频文件走同一条四级链(字幕层不适用,直接从转写起)。**仅 CLI 可用**,`bili_watch` 工具与 `/bili` 不提供 |
|
|
167
|
-
| `search <关键词> [--days 3] [--limit 10] [--order pubdate\|click]` | 搜视频。`--days` 生效时最多抓 3 页再筛,结果仍按 `--limit` 截断 |
|
|
168
|
-
| `hot [--limit 10]` | 综合热门榜 |
|
|
169
|
-
| `login [--check] [--poll] [--key KEY]` | 扫码登录。`--check` = 检查本地凭证是否还有效(不会重新登录);`--key KEY` 需配合 `--poll` 才生效(单独 `login --key X` 会被静默忽略) |
|
|
170
|
-
| `clean` | 清空缓存根(默认 `$DSH_HOME/bili-watch/cache`;只清本插件自己写的 `BV*` 与 `frames/`、`asr/`、`_logs/` 等目录,同一层里别人的文件不动,凭证在上一层不会被碰到)。有任务在跑(存在 `*.lock` 且持有进程还活着)时会拒绝清理并返回非零退出码;进程已被强杀的残留锁不算占用 |
|
|
171
|
-
|
|
172
|
-
工具侧的等价入口:13 个内容命令在 `bili_watch` 工具、`/bili` 命令、CLI 三处等价(工具参数是 `command` + `bv`,另有 `format` / `out` / `limit` 等字段);`login` 与 `clean` 只有 `/bili` 和 CLI;`local` 只有 CLI。
|
|
173
|
-
|
|
174
|
-
表里只列常用参数。完整参数(`--out`(**必须配合 `--format`,只给 `--out` 会报错退出**)、`--fresh`、`--scene`、`--ffmpeg`、`--cred`、`--fast`、`--mark-seen`、`--p`、`--asr-max`(转写时长闸门,默认 30 分钟,单位毫秒)等)跑 `bili-watch help` 看。
|
|
175
|
-
|
|
176
|
-
## 单条链接软提示
|
|
177
|
-
|
|
178
|
-
用户的消息里只有一条 B 站视频链接(BV 号或 `b23.tv` 短链)时,插件往消息流里补一句提示,告诉 agent 有这条链接可读、用 `peek` 先看一眼(需下载 360p 约每分钟 1 MB + 抽帧约 2 秒)。它**不会**替用户调用工具,也不会自动跑起来;作用只是让「贴链接不说话」这种场景不容易被漏掉。
|
|
179
|
-
|
|
180
|
-
- `b23.tv` 短链会先自动展开:问公共 DNS(`223.5.5.5` → `119.29.29.29` → `1.1.1.1`)拿真实 IP,再直连读 302 里的 BV 号,绕开系统 DNS;展开失败才提示用户换成浏览器地址栏里的完整链接。
|
|
181
|
-
- 为什么要兜底:部分内网 DNS 会把 `b23.tv` 答成 `31.13.x.x`(Facebook 段),这种环境下只有公共 DNS 这条路能展开(2026-10-23 实测)。
|
|
182
|
-
- 关掉:`deps/ui-config.json` 里 `"autoHint": false`。
|
|
183
|
-
- 消息里除了链接还有别的文字(问题、指令)时不提示,避免打断正常对话。
|
|
184
|
-
|
|
185
|
-
## 通用视频 URL
|
|
186
|
-
|
|
187
|
-
`view` / `text` / `asr` / `frames` 接受非 B 站 URL(YouTube、X、直链 mp4 等),走 yt-dlp:
|
|
188
|
-
|
|
189
|
-
- `yt-dlp.exe` 放进 `deps/`,或设 `BILI_WATCH_YTDLP`,或让它出现在 PATH 里。
|
|
190
|
-
- 下载按 URL 哈希隔离在缓存根下,不会串目录。
|
|
191
|
-
- `peek` / `sub` / `comments` / `danmaku` / `sheet` / `substrip` / `ocr` 只支持 B 站。
|
|
192
|
-
|
|
193
|
-
## 转写可信度
|
|
194
|
-
|
|
195
|
-
本地转写(`asr`,以及 `text` 走到转写这一档时)会一并给出判定:
|
|
196
|
-
|
|
197
|
-
- **可信**:VAD 测到足够人声,且没有「同一段文本反复出现在隔开的时间窗」。
|
|
198
|
-
- **疑似幻觉**:ASR 在没人声时不会返回空,它会拿最常见的模板句填空。三条判据——VAD 人声不足 0.5 秒却转出了字、同一段文本出现在隔开 2 秒以上的多个窗口且这些重复占全片一半以上、过半分段模型自报 `no_speech_prob > 0.5`。
|
|
199
|
-
|
|
200
|
-
判成「疑似幻觉」时,别把这段文字当台词用,先抽帧看画面或跑 OCR。
|
|
201
|
-
|
|
202
|
-
## 降级链
|
|
217
|
+
### 降级链行为
|
|
203
218
|
|
|
204
219
|
```
|
|
205
220
|
AI 字幕(需登录)
|
|
206
|
-
↓
|
|
207
|
-
|
|
208
|
-
↓
|
|
209
|
-
抽帧 + OCR
|
|
210
|
-
↓
|
|
211
|
-
|
|
221
|
+
↓ 无字幕轨
|
|
222
|
+
本地 ASR(可选)
|
|
223
|
+
↓ 未安装 / 语速 < 2 字/秒
|
|
224
|
+
抽帧 + OCR(可选)
|
|
225
|
+
↓ 未安装
|
|
226
|
+
读图(模型直接看帧)
|
|
212
227
|
```
|
|
213
228
|
|
|
214
|
-
|
|
229
|
+
降级时输出原因,不静默跳过。四级全 miss 退出码 1。
|
|
215
230
|
|
|
216
|
-
|
|
231
|
+
### 字幕诱饵检测
|
|
217
232
|
|
|
218
|
-
|
|
233
|
+
`text` 命令自动检测以下可疑信号:
|
|
219
234
|
|
|
220
|
-
|
|
235
|
+
- 字幕语速不在 2–8.5 字/秒区间
|
|
236
|
+
- 字幕与标题 / UP 主关键词重合度过低(需与语速异常同时触发)
|
|
237
|
+
- 字幕包含「实验 / 钓鱼 / 测试」字样
|
|
221
238
|
|
|
222
|
-
|
|
223
|
-
- 关键词命中率低(字幕和标题/UP 名对不上):不单独触发,要和语速异常同时出现才算补充理由
|
|
224
|
-
- 字幕里自称「实验 / 钓鱼 / 测试」
|
|
239
|
+
指定 `--verify` 时额外抽 5 帧 OCR 比对画面文字。仅在可疑信号触发时生效,正常字幕不触发。
|
|
225
240
|
|
|
226
|
-
|
|
241
|
+
### 限制
|
|
227
242
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
243
|
+
- B 站侧只读:不支持点赞、评论、发弹幕、历史记录
|
|
244
|
+
- 通用 URL 走 yt-dlp 时不做内网地址过滤,禁止指向内网服务
|
|
245
|
+
- 无内置限速,批量调用需自行 sleep
|
|
246
|
+
- 工具名 `bili_watch` 与命令 `/bili` 若与其他插件冲突,后注册者覆盖前者
|
|
231
247
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
## 环境变量
|
|
248
|
+
## 模块架构
|
|
235
249
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
- **频率**:脚本没有硬限速(只在字幕重试时随机等几百毫秒);批量跑请自己加 sleep,别连着扫。
|
|
259
|
-
- **任意 http(s) 地址都会被请求**:通用 URL 走 yt-dlp 时不做内网地址过滤,别拿它请求内网服务。
|
|
260
|
-
- **撞名覆盖**:本插件注册 `bili_watch` 工具与 `/bili` 命令;若与其他插件撞名,后注册者静默覆盖,不报错。
|
|
250
|
+
```mermaid
|
|
251
|
+
flowchart TD
|
|
252
|
+
subgraph L1["index.js(DSH 进程内)"]
|
|
253
|
+
DT["defineTool 注册 bili_watch"]
|
|
254
|
+
CR["commands.register 注册 /bili"]
|
|
255
|
+
WS["webServer 路由 / 面板"]
|
|
256
|
+
end
|
|
257
|
+
subgraph L2["tools/look.mjs(子进程)"]
|
|
258
|
+
LOOK["node tools/look.mjs <cmd>"]
|
|
259
|
+
end
|
|
260
|
+
subgraph L3["外部依赖(可选)"]
|
|
261
|
+
PY["deps/_bili-asr.py ASR"]
|
|
262
|
+
FF["ffmpeg 抽帧"]
|
|
263
|
+
YT["yt-dlp 下载"]
|
|
264
|
+
end
|
|
265
|
+
DT -->|spawn| LOOK
|
|
266
|
+
CR -->|spawn| LOOK
|
|
267
|
+
WS -.->|面板写凭证 / 内容命令 spawn| LOOK
|
|
268
|
+
LOOK -->|spawn| PY
|
|
269
|
+
LOOK -->|spawn| FF
|
|
270
|
+
LOOK -->|spawn| YT
|
|
271
|
+
```
|
|
261
272
|
|
|
262
273
|
## 致谢
|
|
263
274
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
- `
|
|
267
|
-
- `dsh-bilibili-subtitles`(作者 Chenfan2):多格式导出(SRT、Markdown 等)的形态。
|
|
268
|
-
- `video-watch-plus`(xinhailaopo,MIT)及其上游 `video-watch-skill`(CFITCorporation,MIT,CFITSec):ASR 幻觉证伪与声学侦察的方法,已落进上面的「转写可信度」。
|
|
275
|
+
- [`dsh-bilibili-video-summary`](https://github.com/Aurum807)(Aurum807):单链接自动提示形态
|
|
276
|
+
- [`dsh-bilibili-subtitles`](https://github.com/Chenfan2)(Chenfan2):多格式导出形态
|
|
277
|
+
- [`video-watch-plus`](https://github.com/xinhailaopo/video-watch-plus)(MIT):ASR 幻觉证伪方法
|
|
269
278
|
|
|
270
|
-
##
|
|
279
|
+
## License
|
|
271
280
|
|
|
272
281
|
MIT
|
|
273
|
-
|
|
274
|
-
## 长文本保护(2026-10-26)
|
|
275
|
-
|
|
276
|
-
`text` / `sub` / `asr` 的正文超过 **800 字**时,终端只给开头 400 字摘要 + 一行落盘路径,全文写进缓存目录下按视频分的文件夹:`<缓存目录>/<BV>[_<标题>]/<命令>.txt`。标题段只在先跑过 `view` / `peek` 时才有——直接 `text BVxxx` 建的是纯 `<BV>` 目录,之后再跑 `view` / `peek` 会把它改名成 `<BV>_<标题>`。
|
|
277
|
-
|
|
278
|
-
- `--head N`:自定义摘要长度
|
|
279
|
-
- `--full`:打全文
|
|
280
|
-
- 工具层(`bili_watch`)与 `/bili` 命令同理,阈值 2000 字(摘要 800),超了同样落盘并回摘要
|
|
281
|
-
|
|
282
|
-
这么做的原因:一段 14 分钟视频的字幕 4,449 字,整段塞进上下文会把会话挤爆(2026-10-26 实测两次)。
|