Zum Hauptinhalt springen
S

dsh-bili-watch

sacredbluedragon/dsh-bili-watch

Reads Bilibili video content as text for DSH agents: metadata, subtitles, ASR, frame OCR, comments and danmaku. Frame OCR needs ffmpeg; the ASR/OCR venvs need Python 3.10+; AI subtitles need a Bilibili login.

Installation

dsh plugin --profile web add github:sacredbluedragon/dsh-bili-watch

README

dsh-bili-watch

将一条 B 站视频变成模型能读的内容:元数据、评论、弹幕、AI 字幕、本地转写、抽帧 OCR。可作为 DSH 插件运行,也可直接当命令行工具。支持 b23.tv 短链与 av 号;抽帧缓存位置可自定义,见下面「插件面板」的「缓存位置」。

取内容的顺序是先用文字(字幕或转写),文字不够则抽帧看画面。只读元数据、评论、弹幕、搜索、热榜不需要任何额外依赖;抽帧相关命令需要 ffmpeg,未安装会明确报错并指出装法。

[!IMPORTANT] 面板要重启 DSH 后才出现,插件只在启动时加载。 抽帧类命令(frames / ocr / sheet / substrip / text 的兜底档)需要 ffmpeg,没有会直接报错,不会静默降级。 登录只影响 AI 字幕;其余命令匿名可用。

安装

装进 DSH 当插件

dsh plugin --profile web add dsh-bili-watch

装完重启 DSH 即可。DSH 0.2.0-rc.2 起,dsh plugin add 会把包自动写进 profile 的 dsh.profile.bundles;若用更早的内核,需要自己打开 profile 的 package.json,在 dsh.profile.bundles 数组里补一行 "dsh-bili-watch"。

装完可以验证:dsh --profile web --dump-config 里能搜到 dsh-bili-watch 才算进了装配。

也可以把本仓库直接放进 profiles/<名字>/node_modules/dsh-bili-watch。

插件依赖 DSH 自带的 @deepseek-ai/dsh-tools(peer,optional)。profile 里缺这个包时不会报错:bili_watch 工具不注册,/bili 命令与插件面板照常可用,日志里会打一行提示。

插件市场已收录(2026-10-21):在市场里搜 dsh-bili-watch 安装。新装插件默认不自动启用,装完到「插件」页把它的开关打开,再重启 DSH;市场里暂时搜不到时,按上面的命令装。

只当命令行工具

npm i -g dsh-bili-watch
bili-watch view BV1EPnG6DEJC

不装全局也行:clone 仓库后在目录里跑 node tools/look.mjs view BV1EPnG6DEJC。命令行的依赖和插件完全一样,scripts/fetch-deps 同样可用。

更新与卸载

dsh plugin --profile web add dsh-bili-watch@latest
dsh plugin --profile web remove dsh-bili-watch

升级后重启 DSH。deps/ 在包目录内,卸载或重装会连模型、环境、凭证一起删掉;要长期保留就把 BILI_WATCH_PROJ / BILI_WATCH_SEEN 指到包外。日常清理在面板里逐项删即可。

插件面板

装进 DSH 后,打开插件列表,点 dsh-bili-watch 卡片进详情页,里面有一块面板(不用先进设置),常规操作无需去对话里敲命令:

  • 依赖状态:ffmpeg、yt-dlp、ASR 环境、OCR 环境、转写模型、登录凭证逐项列出是否就绪、实际路径、占用体积。缺的点击行末「一键下载」,后台跑 scripts/fetch-deps(体积是估算值,实际以跑完为准)。
  • 扫码登录:凭证未登录时点「去扫码登录」(已登录是「重新扫码」),面板里弹出二维码,手机 B 站扫完自动刷新。凭证保存在本机 deps/credential.json。
  • 删除:面板按实际路径判断——装在插件目录里的(yt-dlp、转写模型、登录凭证)可直接删;装在插件目录外的(比如复用系统 ffmpeg 或已有的 Python 环境)按钮置灰,旁边标出它实际在哪。
  • 批量:标题行的「批量下载 / 批量清理」打开勾选清单,默认勾上所有可操作的项,删除前会再确认一次。
  • 抽帧缓存:显示当前占用与文件数,「立即清除」一键清空;不点则会按规则自动清理——保留天数(默认 7 天)与总量上限(默认 2048 MB),超过则从最旧的删起。规则存在 deps/cache-config.json,插件启动和打开面板时各检查一次。
  • 缓存位置:默认在系统临时目录(tmpdir()/bili-watch)。要换位置就设环境变量 BILI_WATCH_CACHE,或在 deps/deps-config.json 里写 "cache": "D:\\你想要的目录";改完重启 DSH 生效,面板「抽帧缓存 → 位置」会显示当前实际路径。
  • 最近一次调用:显示命令、时间、成败,用来判断上一次看视频是否卡住。

装完第一次重启 DSH,面板才会出现。

依赖

能力需要没有时
元数据 / 评论 / 弹幕 / 搜索 / 热榜无(匿名 HTTP)—
抽帧 / 九宫格 / 字幕带ffmpeg报错并提示装法(text 的兜底档就是抽帧,所以同样要 ffmpeg)
AI 字幕一次扫码登录(SESSDATA)返回「无字幕轨」,自动降级
本地转写Python 3.10+ 与 faster-whisper(deps/.venv-asr)跳过,自动降级
画面 OCRPython 3.10+ 与 rapidocr_onnxruntime(deps/.venv-ocr)跳过,只剩基础抽帧
通用视频 URLyt-dlp只支持 B 站

环境:Node.js ≥ 22。装在 DSH 里时 DSH 自带 node,命令行跑也一样。

ffmpeg 查找顺序:--ffmpeg 参数 → BILI_WATCH_FFMPEG → 插件 deps/ → PATH。

deps/ 用来放运行期文件:Python venv、模型、yt-dlp、凭证,默认不进 git(见 .gitignore)。ASR 和 OCR 的 Python 环境是可选的,不装也能用,只是少这两档。

deps/_bili-asr.py 默认从 hf-mirror.com 下模型,国内快。海外网络可以先设 HF_ENDPOINT=https://huggingface.co 再跑 fetch-deps。

可选依赖(一键安装)

# Windows(powershell.exe 或 pwsh 都行)
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target all
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target all -Mirror cn   # 国内网络:gh-proxy + 清华 PyPI + hf-mirror

# 单项:ffmpeg / ytdlp / asr / ocr / model
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target ytdlp
powershell -ExecutionPolicy Bypass -File scripts\fetch-deps.ps1 -Target model
# macOS / Linux
bash scripts/fetch-deps.sh all
BILI_WATCH_MIRROR=cn bash scripts/fetch-deps.sh all

脚本可以重复跑:目标已存在就跳过;Windows 用 -Force 重下、-DryRun 只打印命令(sh 版没有这两个参数,要重装就删掉目标目录)。装 venv 时会验证包能不能 import,上次装到一半的会被重建。-Target model 需要 ASR 环境先装好,脚本会提示。

从 GitHub 下载很慢或断:ffmpeg 要从 GitHub 拉约 80 MB 的压缩包,国内直连经常断。三条替代路径:

  1. 加 -Mirror cn 重试(走 gh-proxy);
  2. 手动下载 ffmpeg.exe 放进 deps\ 再重跑(会被跳过);
  3. 已经有 ffmpeg 就设 BILI_WATCH_FFMPEG 指向它。

macOS/Linux 的 ffmpeg 用系统包管理器装,脚本只给提示。其余目标和 Windows 一样;sh 版本单项失败会跑完再汇总。

凭证

匿名也有内容:元数据、评论、抽帧、弹幕都不需要登录。

只有拿 AI 字幕需要登录,二选一:

  1. login:插件出二维码,手机 B 站扫码。凭证存在插件 deps/credential.json,不出本机。
  2. --cred <文件路径>:读一份现成的 {sessdata, bili_jct, buvid3, buvid4} JSON。

凭证顺序:给了 --cred 就只用它,读不到就按匿名跑;没给 --cred 才用 deps/credential.json;两者都没有就匿名。

这份文件等同账号登录态。请勿分享、提交、上传。

命令

命令做什么
view <BV或链接或URL>元数据 + 简介 + 热评
peek <BV或链接>元数据 + 热评 + 5 张均匀帧(最便宜;装了 OCR 环境时会顺带识别这 5 帧,成本略高;仅 B 站)
`sub <BV或链接> [--format srtjson
comments <BV> [N]评论区,默认按热度排序
asr <BV或URL>本地转写音频,并给出「可信 / 疑似幻觉」判定(见下节)
frames <BV或URL> [--step 秒] [--ocr]抽帧;--ocr 顺带识别画面文字
ocr <BV>抽帧并 OCR
`text <BV或URL> [--format jsonmd]`
sheet <BV> [--grid 3x3]均匀挑帧拼成一张图(NxM 如 3x3、4x4,默认 9 帧)
substrip <BV> [--step 秒]底部字幕竖拼成一张图
danmaku <BV>弹幕热区(按时间桶统计峰值)
search <关键词> [--days 3]搜视频
hot [--limit 10]综合热门榜
login [--check] [--poll]扫码登录
clean清空系统临时目录下的 bili-watch(Windows 是 %TEMP%\bili-watch)

工具侧的等价入口:bili_watch 工具(参数 command + bv),或 /bili 命令。

表里只列常用参数。完整参数(--out、--fresh、--scene、--ffmpeg、--cred、--fast、--mark-seen、--p 等)跑 bili-watch help 看。

单条链接软提示

用户的消息里只有一条 B 站视频链接(BV 号或 b23.tv 短链)时,插件往消息流里补一句提示,告诉 agent 有这条链接可读、peek 最便宜。它不会替用户调用工具,也不会自动跑起来;作用只是让「贴链接不说话」这种场景不容易被漏掉。

  • b23.tv 短链会先自动展开:问公共 DNS(223.5.5.5 → 119.29.29.29 → 1.1.1.1)拿真实 IP,再直连读 302 里的 BV 号,绕开系统 DNS;展开失败才提示用户换成浏览器地址栏里的完整链接。
  • 为什么要兜底:部分内网 DNS 会把 b23.tv 答成 31.13.x.x(Facebook 段),这种环境下只有公共 DNS 这条路能展开(2026-10-23 实测)。
  • 关掉:deps/ui-config.json 里 "autoHint": false。
  • 消息里除了链接还有别的文字(问题、指令)时不提示,避免打断正常对话。

通用视频 URL

view / text / asr / frames 接受非 B 站 URL(YouTube、X、直链 mp4 等),走 yt-dlp:

  • yt-dlp.exe 放进 deps/,或设 BILI_WATCH_YTDLP,或让它出现在 PATH 里。
  • 下载按 URL 哈希隔离在 %TEMP%\bili-watch\,不会串目录。
  • peek / sub / comments / danmaku / sheet / substrip / ocr 只支持 B 站。

转写可信度

本地转写(asr,以及 text 走到转写这一档时)会一并给出判定:

  • 可信:VAD 测到足够人声,且没有「同一段文本反复出现在隔开的时间窗」。
  • 疑似幻觉:ASR 在没人声时不会返回空,它会拿最常见的模板句填空。三条判据——VAD 人声不足 0.5 秒却转出了字、同一段文本出现在隔开 2 秒以上的多个窗口且这些重复占全片一半以上、过半分段模型自报 no_speech_prob > 0.5。

判成「疑似幻觉」时,别把这段文字当台词用,先抽帧看画面或跑 OCR。

降级链

AI 字幕(需登录)
   ↓ 没有字幕轨
本地转写(可选依赖)
   ↓ 没装 / 转写质量差(< 2 字/秒)
抽帧 + OCR(可选依赖)
   ↓ 没装
读图(模型自己看帧)

降级时会说明原因,不会静默跳过。

环境变量

变量作用
BILI_WATCH_PROJASR/OCR 环境目录(默认插件 deps/)
BILI_WATCH_FFMPEGffmpeg 可执行文件路径
BILI_WATCH_YTDLPyt-dlp 可执行文件路径
BILI_WATCH_SEENseen.md 去重文件路径(默认 deps/seen.md)。文件不存在时 --mark-seen 记不了,先建一个空文件即可
BILI_WATCH_CACHE抽帧缓存目录(默认系统临时目录)。优先级:这个变量 > deps/deps-config.json 的 cache > 临时目录;目录不可写时自动回退临时目录,并在面板警告里写明原因
BILI_WATCH_MIRRORcn 时 scripts/fetch-deps.* 走镜像下载(gh-proxy / 清华 PyPI / hf-mirror)
HF_ENDPOINT转写模型的 HuggingFace 端,默认 https://hf-mirror.com;海外可设官方站
BILI_ASR_MODEL本地转写用的 faster-whisper 模型名,默认 small

成本

  • 字幕接口带一次重试;text 最多尝试两次(先匿名,有凭证再试一次)。
  • 抽帧会下载视频(360p)并跑 ffmpeg。--step 的秒数调大能减少抽帧数,脚本另外限了 -threads 2。
  • 拼图和字幕带把多帧压成一张图,省 token。

限制与风险

  • 不支持:点赞、评论、发弹幕、留观看历史;B 站侧只读。本机会写登录凭证、抽帧缓存与 seen.md 去重文件。
  • 只支持 B 站与 yt-dlp 能下的站点;peek / sub / comments / danmaku / sheet / substrip / ocr 仅限 B 站。
  • 凭证:等同账号登录态,泄露即被盗。只存本机,不进日志。
  • 频率:脚本没有硬限速(只在字幕重试时随机等几百毫秒);批量跑请自己加 sleep,别连着扫。
  • 任意 http(s) 地址都会被请求:通用 URL 走 yt-dlp 时不做内网地址过滤,别拿它请求内网服务。

致谢

下面几个项目的交互形态或输出格式给过启发,实现各自独立:

  • dsh-bilibili-video-summary(作者 Aurum807):消息里只有一条视频链接时自动提示的形态。
  • dsh-bilibili-subtitles(作者 Chenfan2):多格式导出(SRT、Markdown 等)的形态。
  • video-watch-plus(xinhailaopo,MIT)及其上游 video-watch-skill(CFITCorporation,MIT,CFITSec):ASR 幻觉证伪与声学侦察的方法,已落进上面的「转写可信度」。

许可

MIT

Ähnliche Plugins