dsh-bili-watch 0.3.1 → 0.3.3
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 +211 -190
- package/client.js +74 -29
- package/cordis.patch.yml +2 -1
- package/deps/_bili-asr.py +3 -1
- package/index.js +153 -34
- package/package.json +1 -1
- package/scripts/fetch-deps.ps1 +5 -3
- package/tools/look.mjs +91 -45
package/README.md
CHANGED
|
@@ -1,282 +1,303 @@
|
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
## 模块架构
|
|
52
|
+
## 用法
|
|
51
53
|
|
|
52
|
-
|
|
53
|
-
flowchart TD
|
|
54
|
-
subgraph L1["① index.js(插件入口,跑在 DSH 进程内)"]
|
|
55
|
-
DT["defineTool<br/>注册 bili_watch 工具"]
|
|
56
|
-
CR["commands.register<br/>注册 /bili 斜杠命令"]
|
|
57
|
-
WS["webServer 路由<br/>插件面板(状态/扫码登录/删依赖)"]
|
|
58
|
-
end
|
|
59
|
-
subgraph L2["② tools/look.mjs(独立 node 子进程)"]
|
|
60
|
-
LOOK["node tools/look.mjs <cmd>"]
|
|
61
|
-
end
|
|
62
|
-
subgraph L3["③ 外部可执行(可选依赖)"]
|
|
63
|
-
PY["python deps/_bili-asr.py<br/>本地 ASR 转写(可选)"]
|
|
64
|
-
FF["ffmpeg<br/>抽帧 / 取音轨(可选)"]
|
|
65
|
-
YT["yt-dlp<br/>通用 URL 下载(可选)"]
|
|
66
|
-
end
|
|
67
|
-
DT -->|spawn| LOOK
|
|
68
|
-
CR -->|spawn| LOOK
|
|
69
|
-
WS -.->|面板扫码直写凭证,内容命令仍 spawn| LOOK
|
|
70
|
-
LOOK -->|spawn| PY
|
|
71
|
-
LOOK -->|spawn| FF
|
|
72
|
-
LOOK -->|spawn| YT
|
|
73
|
-
```
|
|
54
|
+
### 命令一览
|
|
74
55
|
|
|
75
|
-
|
|
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` | 清空缓存根。任务进行中(锁文件存活)时拒绝并返回非零退出码 |
|
|
76
74
|
|
|
77
|
-
|
|
75
|
+
`<target>` 接受 BV 号、`b23.tv` 短链、av 号或 URL。
|
|
78
76
|
|
|
79
|
-
|
|
77
|
+
### 通用参数
|
|
80
78
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
-
|
|
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 | — | 标记为已读 |
|
|
88
91
|
|
|
89
|
-
|
|
92
|
+
完整参数列表见 `bili-watch help`。
|
|
90
93
|
|
|
91
|
-
|
|
94
|
+
### 长文本保护
|
|
92
95
|
|
|
93
|
-
|
|
94
|
-
|---|---|---|
|
|
95
|
-
| 元数据 / 评论 / 弹幕 / 搜索 / 热榜 | 无(匿名 HTTP) | — |
|
|
96
|
-
| 抽帧 / 九宫格 / 字幕带 | `ffmpeg` | 报错并提示装法(`text` 的兜底档就是抽帧,所以同样要 ffmpeg) |
|
|
97
|
-
| AI 字幕 | 一次扫码登录(SESSDATA) | 返回「无字幕轨」,自动降级 |
|
|
98
|
-
| 本地转写 | Python 3.10+ 与 faster-whisper(`deps/.venv-asr`) | 跳过,自动降级 |
|
|
99
|
-
| 画面 OCR | Python 3.10+ 与 rapidocr_onnxruntime(`deps/.venv-ocr`) | 跳过,只剩基础抽帧 |
|
|
100
|
-
| 通用视频 URL | yt-dlp | 只支持 B 站 |
|
|
96
|
+
正文超过 800 字时,终端仅返回前 400 字摘要 + 落盘路径,全文写入缓存目录。工具层(`bili_watch`)阈值为 2000 字(摘要 800 字)。
|
|
101
97
|
|
|
102
|
-
|
|
98
|
+
## 面板
|
|
103
99
|
|
|
104
|
-
|
|
100
|
+
装进 DSH 后,在插件页点 `dsh-bili-watch` 卡片进详情页,里面有一块面板(不用先进设置),日常操作不用去对话里敲命令:
|
|
105
101
|
|
|
106
|
-
|
|
102
|
+
- **依赖状态**:ffmpeg、yt-dlp、ASR 环境、OCR 环境、转写模型、B 站登录凭证逐项列出是否就绪、实际路径、占用体积。缺的点行末按钮后台装(走内置 `fetch-deps`,体积是估算值,实际以跑完为准)。
|
|
103
|
+
- **扫码登录**:未登录显示「去扫码登录」,已登录是「重新扫码」。二维码在面板里出,手机 B 站扫完自动刷新。凭证存在本机 `$DSH_HOME/bili-watch/credential.json`。
|
|
104
|
+
- **哪些能删**:yt-dlp、转写模型、登录凭证可以直接删;ffmpeg / ASR 环境 / OCR 环境不给删除按钮——环境删了要重跑 `fetch-deps` 装回来,代价比省下的空间大,面板只在旁边标出实际位置。
|
|
105
|
+
- **批量操作**:标题行的「批量下载 / 批量清理」打开勾选清单,删除前会再确认一次。
|
|
106
|
+
- **抽帧缓存**:显示当前占用与文件数,「立即清除」一键清空;不点则按规则自动清理(保留天数、总量上限),超过从最旧的删起。规则存 `deps/cache-config.json`,启动时与打开面板时各查一次。
|
|
107
|
+
- **缓存位置**:默认 `$DSH_HOME/bili-watch/cache`(`$DSH_HOME` 是 DSH 家目录,Windows 下通常是用户目录里的 `.dsh`)。登录凭证是它的兄弟文件,清缓存时别把上一层一起删。换位置用环境变量 `BILI_WATCH_CACHE`,或 `deps/deps-config.json` 里的 `"cache"`;指到还不是缓存根的目录时,插件会在里面建 `bili-watch-cache/`,不会直接拿你的目录当缓存根。
|
|
108
|
+
- **运行时参数**:转写闸门、抽帧张数上限这类常改的放常规组,其余收在「高级设置」里(默认收起),每项都标了范围和「调大/调小会怎样」。
|
|
109
|
+
- **最近一次调用**:显示命令、时间、成败,用来判断上一次是不是卡住了。
|
|
107
110
|
|
|
108
|
-
|
|
111
|
+
0.3.2 起装完重启就是启用状态,不用再去插件页手动打开。
|
|
109
112
|
|
|
110
|
-
|
|
113
|
+
## 配置
|
|
111
114
|
|
|
112
|
-
|
|
113
|
-
# Windows(powershell.exe 或 pwsh 都行)
|
|
114
|
-
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target all
|
|
115
|
-
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target all -Mirror cn # 国内网络:gh-proxy + 清华 PyPI + hf-mirror
|
|
115
|
+
### 环境变量
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
117
|
+
| 变量 | 默认值 | 说明 |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| `BILI_WATCH_PROJ` | `deps/` | ASR/OCR 环境目录 |
|
|
120
|
+
| `BILI_WATCH_FFMPEG` | — | ffmpeg 可执行文件路径 |
|
|
121
|
+
| `BILI_WATCH_YTDLP` | — | yt-dlp 可执行文件路径 |
|
|
122
|
+
| `BILI_WATCH_SEEN` | `deps/seen.md` | 已读标记文件路径 |
|
|
123
|
+
| `BILI_WATCH_CACHE` | `$DSH_HOME/bili-watch/cache` | 抽帧缓存根目录。优先级:环境变量 > `deps/deps-config.json` > 默认值 |
|
|
124
|
+
| `BILI_WATCH_MIRROR` | — | 设为 `cn` 时 `fetch-deps` 走国内镜像 |
|
|
125
|
+
| `HF_ENDPOINT` | `https://hf-mirror.com` | 转写模型下载端点 |
|
|
126
|
+
| `BILI_ASR_MODEL` | `small` | faster-whisper 模型名 |
|
|
127
|
+
|
|
128
|
+
### 运行时参数(面板可调)
|
|
129
|
+
|
|
130
|
+
以下参数通过 Web 面板或 `deps/deps-config.json` 调整,保存后立即生效:
|
|
131
|
+
|
|
132
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
133
|
+
|---|---|---|---|
|
|
134
|
+
| `asrMemMB` | number (MB) | 1536 | 本地 ASR 内存门槛。低于此值跳过转写 |
|
|
135
|
+
| `lockTtlMin` | number (min) | 30 | 残留锁过期时长 |
|
|
136
|
+
| `unitLimit` | number (chars) | 5000 | 单条评论/弹幕截断阈值 |
|
|
137
|
+
| `textLimit` | number (chars) | 800 | 文本层单次返回正文上限 |
|
|
138
|
+
| `toolTextCap` | number (chars) | 2000 | 工具层单次返回正文总上限 |
|
|
139
|
+
| `toolHead` | number (chars) | 800 | 工具层默认返回头部字数 |
|
|
140
|
+
| `dmBucketSec` | number (sec) | 30 | 弹幕分桶宽度 |
|
|
141
|
+
| `dmTop` | number (buckets) | 5 | 弹幕热区输出条数 |
|
|
142
|
+
| `downloadMaxMB` | number (MB) | 512 | 单文件下载体积上限 |
|
|
143
|
+
| `subRateMin10` | number (×10 chars/s) | 20 | 字幕语速下限(2.0 字/秒) |
|
|
144
|
+
| `subRateMax10` | number (×10 chars/s) | 85 | 字幕语速上限(8.5 字/秒) |
|
|
145
|
+
| `textBrief` | number (chars) | 400 | 超长文本摘要长度 |
|
|
146
|
+
| `asrMaxSec` | number (sec) | 1800 | 转写时长闸门 |
|
|
147
|
+
| `maxFrames` | number | 500 | 抽帧张数上限 |
|
|
148
|
+
| `asrTimeoutSec` | number (sec) | 900 | ASR 进程超时 |
|
|
149
|
+
| `ffmpegTimeoutSec` | number (sec) | 300 | ffmpeg 进程超时 |
|
|
150
|
+
| `cmdTimeoutSec` | number (sec) | 180 | 通用命令超时 |
|
|
151
|
+
|
|
152
|
+
## 缓存路径
|
|
153
|
+
|
|
154
|
+
默认缓存根:`$DSH_HOME/bili-watch/cache`(`$DSH_HOME` 默认为用户目录下 `.dsh`)。
|
|
155
|
+
|
|
156
|
+
- 登录凭证:`$DSH_HOME/bili-watch/credential.json`(缓存根的兄弟文件,清理缓存时勿误删上级目录)
|
|
157
|
+
- 自定义缓存位置:设置 `BILI_WATCH_CACHE` 环境变量,或在 `deps/deps-config.json` 写入 `"cache": "<dir>"`。指向外部目录时插件自动创建 `bili-watch-cache/` 子目录作为缓存根
|
|
158
|
+
- 修改后需重启 DSH 生效
|
|
159
|
+
- 自动清理规则(保留天数 / 总量上限)存于 `deps/cache-config.json`,默认保留 7 天 / 上限 2048 MB,启动时与打开面板时各检查一次
|
|
160
|
+
|
|
161
|
+
## 卸载
|
|
121
162
|
|
|
122
163
|
```bash
|
|
123
|
-
|
|
124
|
-
bash scripts/fetch-deps.sh all
|
|
125
|
-
BILI_WATCH_MIRROR=cn bash scripts/fetch-deps.sh all
|
|
164
|
+
dsh plugin --profile web remove dsh-bili-watch
|
|
126
165
|
```
|
|
127
166
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
**从 GitHub 下载很慢或断**:ffmpeg 要从 GitHub 拉约 80 MB 的压缩包,国内直连经常断。三条替代路径:
|
|
167
|
+
### 卸载前备份
|
|
131
168
|
|
|
132
|
-
|
|
133
|
-
2. 手动下载 `ffmpeg.exe` 放进 `deps\` 再重跑(会被跳过);
|
|
134
|
-
3. 已经有 ffmpeg 就设 `BILI_WATCH_FFMPEG` 指向它。
|
|
169
|
+
包内 `deps/` 随卸载删除,需提前拷出以下 4 份文件,重装后放回原位:
|
|
135
170
|
|
|
136
|
-
|
|
171
|
+
1. `deps/deps-config.json` — 运行时参数与自定义缓存路径
|
|
172
|
+
2. `deps/cache-config.json` — 自动清理规则
|
|
173
|
+
3. `deps/ui-config.json` — 面板显示开关
|
|
174
|
+
4. `deps/seen.md` — 已读标记(或将 `BILI_WATCH_SEEN` 指向包外路径)
|
|
137
175
|
|
|
138
|
-
|
|
176
|
+
### 卸载后残留
|
|
139
177
|
|
|
140
|
-
|
|
178
|
+
- 登录凭证 `$DSH_HOME/bili-watch/credential.json` 不在包内,卸载不删除;如需清除手动删除
|
|
179
|
+
- 缓存根 `$DSH_HOME/bili-watch/cache` 不在包内,卸载不删除;仅清理 `cache/` 子目录,勿删上级凭证文件
|
|
141
180
|
|
|
142
|
-
|
|
181
|
+
## 依赖
|
|
143
182
|
|
|
144
|
-
|
|
145
|
-
|
|
183
|
+
| 能力 | 依赖 | 缺失行为 |
|
|
184
|
+
|---|---|---|
|
|
185
|
+
| 元数据 / 评论 / 弹幕 / 搜索 / 热榜 | 无(匿名 HTTP) | — |
|
|
186
|
+
| 抽帧 / 九宫格 / 字幕带 | ffmpeg | 报错并提示安装方式 |
|
|
187
|
+
| AI 字幕 | B 站登录态(SESSDATA) | 返回无字幕轨,降级至下一级 |
|
|
188
|
+
| 本地 ASR | Python ≥ 3.10 + faster-whisper(`deps/.venv-asr`) | 跳过,降级 |
|
|
189
|
+
| 画面 OCR | Python ≥ 3.10 + rapidocr_onnxruntime(`deps/.venv-ocr`) | 跳过,仅基础抽帧 |
|
|
190
|
+
| 通用 URL | yt-dlp | 仅支持 B 站 |
|
|
146
191
|
|
|
147
|
-
|
|
192
|
+
环境要求:Node.js ≥ 22。
|
|
148
193
|
|
|
149
|
-
|
|
194
|
+
`ffmpeg` 查找顺序:`--ffmpeg` > `BILI_WATCH_FFMPEG` > `deps/deps-config.json` > `deps/ffmpeg.exe` > `PATH`。
|
|
150
195
|
|
|
151
|
-
|
|
196
|
+
### 一键安装依赖
|
|
152
197
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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。
|
|
198
|
+
```powershell
|
|
199
|
+
# Windows
|
|
200
|
+
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target all
|
|
201
|
+
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target all -Mirror cn
|
|
173
202
|
|
|
174
|
-
|
|
203
|
+
# 单项:ffmpeg / ytdlp / asr / ocr / model
|
|
204
|
+
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target ytdlp
|
|
205
|
+
```
|
|
175
206
|
|
|
176
|
-
|
|
207
|
+
```bash
|
|
208
|
+
# macOS / Linux
|
|
209
|
+
bash scripts/fetch-deps.sh all
|
|
210
|
+
BILI_WATCH_MIRROR=cn bash scripts/fetch-deps.sh all
|
|
211
|
+
```
|
|
177
212
|
|
|
178
|
-
|
|
213
|
+
## 故障排查
|
|
179
214
|
|
|
180
|
-
|
|
181
|
-
- 为什么要兜底:部分内网 DNS 会把 `b23.tv` 答成 `31.13.x.x`(Facebook 段),这种环境下只有公共 DNS 这条路能展开(2026-10-23 实测)。
|
|
182
|
-
- 关掉:`deps/ui-config.json` 里 `"autoHint": false`。
|
|
183
|
-
- 消息里除了链接还有别的文字(问题、指令)时不提示,避免打断正常对话。
|
|
215
|
+
### 凭证
|
|
184
216
|
|
|
185
|
-
|
|
217
|
+
仅 AI 字幕需要登录。凭证优先级:`--cred` > `$DSH_HOME/bili-watch/credential.json` > 匿名。
|
|
186
218
|
|
|
187
|
-
|
|
219
|
+
例外:若本机安装了 bili-duty 且其凭证文件更新,watch 优先复用。面板删除凭证后若 bili-duty 仍存在,仍将使用共享登录态。
|
|
188
220
|
|
|
189
|
-
|
|
190
|
-
- 下载按 URL 哈希隔离在缓存根下,不会串目录。
|
|
191
|
-
- `peek` / `sub` / `comments` / `danmaku` / `sheet` / `substrip` / `ocr` 只支持 B 站。
|
|
221
|
+
凭证文件等同账号登录态,禁止外传或提交版本库。
|
|
192
222
|
|
|
193
|
-
|
|
223
|
+
### 转写可信度
|
|
194
224
|
|
|
195
|
-
|
|
225
|
+
本地 ASR 输出附判定字段:
|
|
196
226
|
|
|
197
|
-
- **可信**:VAD
|
|
198
|
-
- **疑似幻觉**:
|
|
227
|
+
- **可信**:VAD 检测到足够人声,无跨窗重复模板句
|
|
228
|
+
- **疑似幻觉**:VAD 人声 < 0.5 秒却输出文本、跨 2 秒以上窗口重复文本占比 > 50%、`no_speech_prob > 0.5` 分段占比过半
|
|
199
229
|
|
|
200
|
-
|
|
230
|
+
判为疑似幻觉时应通过抽帧 OCR 交叉验证,不可直接引用为台词。
|
|
201
231
|
|
|
202
|
-
|
|
232
|
+
### 降级链行为
|
|
203
233
|
|
|
204
234
|
```
|
|
205
235
|
AI 字幕(需登录)
|
|
206
|
-
↓
|
|
207
|
-
|
|
208
|
-
↓
|
|
209
|
-
抽帧 + OCR
|
|
210
|
-
↓
|
|
211
|
-
|
|
236
|
+
↓ 无字幕轨
|
|
237
|
+
本地 ASR(可选)
|
|
238
|
+
↓ 未安装 / 语速 < 2 字/秒
|
|
239
|
+
抽帧 + OCR(可选)
|
|
240
|
+
↓ 未安装
|
|
241
|
+
读图(模型直接看帧)
|
|
212
242
|
```
|
|
213
243
|
|
|
214
|
-
|
|
244
|
+
降级时输出原因,不静默跳过。四级全 miss 退出码 1。
|
|
215
245
|
|
|
216
|
-
|
|
246
|
+
### 字幕诱饵检测
|
|
217
247
|
|
|
218
|
-
|
|
248
|
+
`text` 命令自动检测以下可疑信号:
|
|
219
249
|
|
|
220
|
-
|
|
250
|
+
- 字幕语速不在 2–8.5 字/秒区间
|
|
251
|
+
- 字幕与标题 / UP 主关键词重合度过低(需与语速异常同时触发)
|
|
252
|
+
- 字幕包含「实验 / 钓鱼 / 测试」字样
|
|
221
253
|
|
|
222
|
-
|
|
223
|
-
- 关键词命中率低(字幕和标题/UP 名对不上):不单独触发,要和语速异常同时出现才算补充理由
|
|
224
|
-
- 字幕里自称「实验 / 钓鱼 / 测试」
|
|
254
|
+
指定 `--verify` 时额外抽 5 帧 OCR 比对画面文字。仅在可疑信号触发时生效,正常字幕不触发。
|
|
225
255
|
|
|
226
|
-
|
|
256
|
+
### 限制
|
|
227
257
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
默认不抽帧:语速偏慢在 MV、纯音乐、风景片里很常见,为了少数钓鱼视频让每条都多花十几秒下载和 OCR 不划算。提示归提示,**结论还得你自己看画面再下**。
|
|
233
|
-
|
|
234
|
-
## 环境变量
|
|
235
|
-
|
|
236
|
-
| 变量 | 作用 |
|
|
237
|
-
|---|---|
|
|
238
|
-
| `BILI_WATCH_PROJ` | ASR/OCR 环境目录(默认插件 `deps/`) |
|
|
239
|
-
| `BILI_WATCH_FFMPEG` | ffmpeg 可执行文件路径 |
|
|
240
|
-
| `BILI_WATCH_YTDLP` | yt-dlp 可执行文件路径 |
|
|
241
|
-
| `BILI_WATCH_SEEN` | `seen.md` 去重文件路径(默认 `deps/seen.md`)。文件不存在时 `--mark-seen` 记不了,先建一个空文件即可 |
|
|
242
|
-
| `BILI_WATCH_CACHE` | 抽帧缓存目录(默认 `$DSH_HOME/bili-watch/cache`)。优先级:这个变量 > `deps/deps-config.json` 的 `cache` > 默认路径;指到外部目录时插件会在里面建 `bili-watch-cache/` 当缓存根,不直接占用你的目录;目录不可写时面板侧回退到默认路径并写进警告(命令行直接跑 `look.mjs` 没有这层回退,会直接报错) |
|
|
243
|
-
| `BILI_WATCH_MIRROR` | `cn` 时 `scripts/fetch-deps.*` 走镜像下载(gh-proxy / 清华 PyPI / hf-mirror) |
|
|
244
|
-
| `HF_ENDPOINT` | 转写模型的 HuggingFace 端,默认 `https://hf-mirror.com`;海外可设官方站 |
|
|
245
|
-
| `BILI_ASR_MODEL` | 本地转写用的 faster-whisper 模型名,默认 `small` |
|
|
258
|
+
- B 站侧只读:不支持点赞、评论、发弹幕、历史记录
|
|
259
|
+
- 通用 URL 走 yt-dlp 时不做内网地址过滤,禁止指向内网服务
|
|
260
|
+
- 无内置限速,批量调用需自行 sleep
|
|
261
|
+
- 工具名 `bili_watch` 与命令 `/bili` 若与其他插件冲突,后注册者覆盖前者
|
|
246
262
|
|
|
247
263
|
## 成本
|
|
248
264
|
|
|
249
265
|
- 字幕接口带一次重试;`text` 最多尝试两次(先匿名,有凭证再试一次)。
|
|
250
|
-
-
|
|
251
|
-
-
|
|
266
|
+
- 抽帧要下载视频(360p)再跑 ffmpeg,`--step` 调大能少抽;脚本另外限了 `-threads 2`,不会把机器吃满。
|
|
267
|
+
- 拼图(`sheet`)和字幕带(`substrip`)把多帧压成一张图给模型看,省 token。
|
|
268
|
+
- 本地转写、OCR 都在本机跑,不上传、不按次计费;只有取 B 站数据的接口走网络。
|
|
252
269
|
|
|
253
|
-
##
|
|
270
|
+
## 模块架构
|
|
254
271
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
272
|
+
```mermaid
|
|
273
|
+
flowchart TD
|
|
274
|
+
subgraph L1["index.js(DSH 进程内)"]
|
|
275
|
+
DT["defineTool 注册 bili_watch"]
|
|
276
|
+
CR["commands.register 注册 /bili"]
|
|
277
|
+
WS["webServer 路由 / 面板"]
|
|
278
|
+
end
|
|
279
|
+
subgraph L2["tools/look.mjs(子进程)"]
|
|
280
|
+
LOOK["node tools/look.mjs <cmd>"]
|
|
281
|
+
end
|
|
282
|
+
subgraph L3["外部依赖(可选)"]
|
|
283
|
+
PY["deps/_bili-asr.py ASR"]
|
|
284
|
+
FF["ffmpeg 抽帧"]
|
|
285
|
+
YT["yt-dlp 下载"]
|
|
286
|
+
end
|
|
287
|
+
DT -->|spawn| LOOK
|
|
288
|
+
CR -->|spawn| LOOK
|
|
289
|
+
WS -.->|面板写凭证 / 内容命令 spawn| LOOK
|
|
290
|
+
LOOK -->|spawn| PY
|
|
291
|
+
LOOK -->|spawn| FF
|
|
292
|
+
LOOK -->|spawn| YT
|
|
293
|
+
```
|
|
261
294
|
|
|
262
295
|
## 致谢
|
|
263
296
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
- `
|
|
267
|
-
- `dsh-bilibili-subtitles`(作者 Chenfan2):多格式导出(SRT、Markdown 等)的形态。
|
|
268
|
-
- `video-watch-plus`(xinhailaopo,MIT)及其上游 `video-watch-skill`(CFITCorporation,MIT,CFITSec):ASR 幻觉证伪与声学侦察的方法,已落进上面的「转写可信度」。
|
|
297
|
+
- [`dsh-bilibili-video-summary`](https://github.com/Aurum807)(Aurum807):单链接自动提示形态
|
|
298
|
+
- [`dsh-bilibili-subtitles`](https://github.com/Chenfan2)(Chenfan2):多格式导出形态
|
|
299
|
+
- [`video-watch-plus`](https://github.com/xinhailaopo/video-watch-plus)(MIT):ASR 幻觉证伪方法
|
|
269
300
|
|
|
270
|
-
##
|
|
301
|
+
## License
|
|
271
302
|
|
|
272
303
|
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 实测两次)。
|