按需放行本地与B站视频,抽帧并转写字幕
30.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/2 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add PoiFlos/dsh-video-gate该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · platform
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 32 处,展示前 24 条)
- 执行外部命令固定命令index.js:401
spawn('cmd', ['/c', 'start', '', 'https://passport.bilibili.com/login'], { - 删除本地文件index.js:457
await unlink(file) - 读取本地文件lib/state.js:58
const text = await readFile(stateFile(config), 'utf8') - 写入本地文件lib/state.js:67
await mkdir(dir, { recursive: true }) - 写入本地文件lib/state.js:69
await writeFile(stateFile(config), JSON.stringify(clean, null, 2) + '\n', 'utf8') - 写入本地文件lib/state.js:77
await mkdir(dir, { recursive: true }) - 写入本地文件lib/state.js:79
await appendFile(path.join(dir, 'audit.jsonl'), line, 'utf8') - 读取本地文件lib/providers.js:46
const raw = (await readFile(cookiePath(config), 'utf8')).trim() - 发起网络请求lib/providers.js:106
const res = await fetch(url, { headers: headersFor(url), signal: t.signal, redirect: 'follow' }) - 发起网络请求lib/providers.js:117
const res = await fetch(url, { headers: headersFor(url), signal: t.signal, redirect: 'follow' }) - 读取本地文件lib/providers.js:148
for (const name of await readdir(base)) { - 读取本地文件lib/providers.js:150
if (existsSync(p)) cands.push(p) - 读取本地文件lib/providers.js:172
if (!existsSync(script)) return { ok: false, error: `裁剪脚本缺失:${script}` } - 请求外部主机b23.tvlib/providers.js:216
const res = await fetch(`https://b23.tv/${code}`, { headers: BILI_HEADERS, redirect: 'manual' }) - 发起网络请求lib/providers.js:216
const res = await fetch(`https://b23.tv/${code}`, { headers: BILI_HEADERS, redirect: 'manual' }) - 读取本地文件lib/providers.js:269
const cached = JSON.parse(await readFile(cacheFile, 'utf8')) - 写入本地文件lib/providers.js:329
await mkdir(path.dirname(cacheFile), { recursive: true }) - 写入本地文件lib/providers.js:330
await writeFile( - 写入本地文件lib/providers.js:383
await mkdir(cacheDir, { recursive: true }) - 读取本地文件lib/providers.js:412
if (!existsSync(sheetPath)) { - 写入本地文件lib/providers.js:414
await writeFile(sheetPath, bytes) - 写入本地文件lib/providers.js:588
await mkdir(outDir, { recursive: true }) - 写入本地文件lib/providers.js:659
await mkdir(cacheDir, { recursive: true }) - 删除本地文件lib/providers.js:681
unlink(wav).catch(() => {})
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:b23.tv
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 的视频入口:默认只读取本地文件,Bilibili 需你批准后才可用,ASR 在本地运行。
README
由 DeepSeek 最新模型翻译生成dsh-video-gate
视频通道阀门插件:默认只读本地文件;Bilibili 站点通道默认关闭,读取前必须由你在弹窗里放行。YouTube、小红书、Netflix 都不在列表里(前两个要额外程序和 cookie,第三个是 DRM)。
平台:Windows 10/11(依赖 install-deps.ps1、阀门窗口都用 PowerShell / Python;macOS、Linux 未适配)。
第一次用? 看 docs/安装与使用.md:从下载、装依赖、配 localRoots,到日常问法、卸载和故障排查,都在那一份里。
想让 AI 自己装? 把这个仓库丢给 DeepSeek Harness(或任何能跑命令的智能体),让它读 AGENTS.md —— 里面写好了每一步、需要你拍板的点、和验收标准。
每个会话先发一句 「启用读取视频插件」,之后发链接或路径即可(「关闭读取视频插件」停用)。
想随时开关通道:双击 启动阀门.cmd(或桌面快捷方式)打开独立小窗口,勾选立即生效,不用重启。
展开完整文档(README 剩余 1 节)
dsh-video-gate 视频通道阀门插件:默认只读本地文件;Bilibili 站点通道默认关闭,读取前必须由你在弹窗里放行。YouTube、小红书、Netflix 都不在列表里(前两个要额外程序和 cookie,第三个是 DRM)。 平台:Windows 10/11(依赖 install-deps.ps1、阀门窗口都用 PowerShell / Python;macOS、Linux 未适配)。 第一次用? 看 docs/安装与使用.md:从下载、装依赖、配 localRoots,到日常问法、卸载和故障排查,都在那一份里。 想让 AI 自己装? 把这个仓库丢给 DeepSeek Harness(或任何能跑命令的智能体),让它读 AGENTS.md —— 里面写好了每一步、需要你拍板的点、和验收标准。 每个会话先发一句 「启用读取视频插件」,之后发链接或路径即可(「关闭读取视频插件」停用)。 想随时开关通道:双击 启动阀门.cmd(或桌面快捷方式)打开独立小窗口,勾选立即生效,不用重启。 通道与实现状态 | 通道 | 默认 | 现在能做什么 | | 本地文件 | 开 | ffmpeg 抽帧(720p PNG)+ 可选本地 whisper 转写(transcribe: true) | | Bilibili | 关 | 标题/时长/公开字幕/分镜帧;登录后可取 AI 字幕(可选,见下) | 本地通道的位置 - ffmpeg:<工作区>\tools\ffmpeg\ffmpeg.exe(来源与哈希见 docs/provenance-ffmpeg.md) - whisper:<工作区>\tools\whisper\whisper-cli.exe + models\ggml-small.bin(见 docs/provenance-whisper.md) - 允许的根目录:写在 %USERPROFILE%\.dsh\video-gate\state.json 的 localRoots 里,默认 <工作区> + %USERPROFILE%\Videos - 没有 ffprobe:时长从 ffmpeg -i 的 stderr 解析 实测 真机跑过的,不是"设计如此": | 场景 | 结果 | | 会话唤醒 | 发「启用读取视频插件」→ 插件的 session/event 监听器先醒,工具回「之前就已经是启用状态」 | | 未启用时 | video_read 直接返回「视频插件还没启用」,不读 | | 阀门弹窗 | 审计里 2 条 grant-once,均为用户在弹窗里点「只放行这一次」;不点则超时拒绝 | | B 站读取 | 标题/时长/分镜帧正常;一条 7:35 的教程视频取到 5 帧 | | B 站 AI 字幕 | 登录后取到 198 行,内容与视频一致 | | 错字幕拦截 | 实测拦下 3 次「别的视频」的字幕(美食视频、番剧片段),宁可不给 | | 本地抽帧 | 6 秒测试片 → 1s/3s/5s 三帧,画面时间码与文件名一致 | | 本地 ASR | SAPI 合成中文 → whisper 输出逐字一致 | | 阀门窗口 | 进程/标题正常;勾选实时写 state.json;托盘模块加载成功(HAVE_TRAY=True) | 一个必须知道的坑:B 站 AI 字幕在生成好之前会给你别人的 同一个请求(?bvid=...&cid=... 固定不变)连发 10 次,返回的是: | 次 | 内容 | 判定 | | 1–8 | 全是别的视频的字幕(有的根本没 track) | ✗ | | 9–10 | 同一条 URL(.../prod/113381163996591…,这串就是本视频的 aid)、198 行、末句 453s | ✓ | 前 8 次返回的 URL 里嵌的是别的 aid。等本视频的字幕生成/缓存好之后,同一请求就稳定返回正确的那份了——同一个 URL 连续两次生效,说明这是「按需生成 + 缓存」,不是随机抽奖。 所以代码里的三段式: 1. 本地缓存:读过一次就写 cache/<bvid>/subtitle.json,之后不再碰接口; 2. 重试:没有缓存就最多试 8 次(间隔 400ms),每次重新请求拿新地址; 3. 双校验:必须覆盖到大半段视频(太短的多半是别人的片段),且标题/UP 名里的词至少命中 2 个 (拉丁词只认整词且 ≥4 字母,否则 in、si 这种会命中一切英文;中文按二字滑窗)。 过不了就明确说「没取到」并告诉你等一会儿再读,绝不把别人的台词当你的。 这也解释了为什么"我给了具体链接还会错":链接定位的是视频(标题/时长/分镜帧始终正确),而字幕是另一个独立文件,由字幕服务按「当前完成的生成任务」发放。 没验证到的 - 窗口的实际观感(只验了进程、标题、逻辑;渲染结果得人眼看) - 托盘图标的点击行为(pystray 已装进 gui/_vendor,但没人工点过) - 换机器后的行为(目录约定、Python 版本差异)未验证 关于 ASR 和登录态 - 只用本地 whisper.cpp,音频不出机器,没有 API key、没有上传 - 单次最多处理前 15 分钟;普通桌面 CPU 上 7 分半视频约 2–3 分钟 - Bilibili 匿名拿不到音频流(playurl 返回 0 条 audio),所以 B 站视频的台词只能靠平台字幕;真要 ASR 就把视频下载到本地,走本地通道 - 登录态是可选的:说「登录 B 站」后,把 SESSDATA 写进 %USERPROFILE%\.dsh\video-gate\bilibili.cookie。 插件不读浏览器 cookie,只读这个文件,且只对 bilibili.com / bili2233.cn / bilivideo.com / hdslb.com 生效 阀门怎么工作 1. 模型调用 video_read,插件先按域名把来源分类到某个通道。 2. 通道关着 → 弹出选择框,四个选项: - 只放行这一次(读完即失效) - 本会话放行(不写盘) - 长期打开这个通道(写 state.json) - 保持关闭 3. 用户拒绝就是拒绝:工具返回错误,模型不得换路子绕过(系统提示里写死了)。 4. 宿主没有 userQuestions 服务时按关闭处理(fail-closed)。 /video 命令只显示当前状态;改阀门走弹窗,或下面那个独立窗口。 阀门窗口(独立小程序) 双击 启动阀门.cmd(或桌面快捷方式)打开一个小窗口,勾选通道即时生效——它直接写 state.json,插件每次读取前都会重读,不用重启 DSH。 - 关窗口 = 收起:装了托盘支持就缩到右下角,没装就最小化到任务栏 - 托盘支持可选:跑一次 安装托盘支持.cmd(pystray + Pillow 装进 gui/_vendor,不动系统 Python) - 窗口里能看到「登录态:已保存/未保存」,带 粘贴登录态 和 退出登录 两个按钮 它和「启用读取视频插件」不是同一层:窗口管通道(持久),唤醒管本会话是否允许读视频(内存)。 两层都过才读——所以顺序是:先唤醒,再用窗口决定放不放 B 站。 状态与审计 - 状态:%USERPROFILE%\.dsh\video-gate\state.json - 审计:%USERPROFILE%\.dsh\video-gate\audit.jsonl(每次放行/拒绝/读取一行 JSON) - 缓存:%USERPROFILE%\.dsh\video-gate\cache\ 硬约束(代码里写死) - 只允许 http/https 的公开 GET,没有任何 POST; - 目标域名限定在 B 站 + 本地文件,其他域名直接拒绝; - 拒绝内网/回环地址(SSRF); - 不读浏览器 cookie、不读注册表、不装 Python 包(登录态只来自你自己放的那个文件); - 子进程只用 argv 列表(无 shell),全部带超时; - 落盘只在 cache/ 子目录。 安装 git clone https://github.com/PoiFlos/dsh-video-gate.git plugin_manager action=install_bundle target=<克隆路径> 依赖(ffmpeg ~84MB / whisper ~11MB / 模型 ~465MB)不随仓库分发,一条命令装好并校验哈希: powershell -ExecutionPolicy Bypass -File <克隆路径>\install-deps.ps1 -Plan # 先看来源和哈希 powershell -ExecutionPolicy Bypass -File <克隆路径>\install-deps.ps1 # 同意后再下载 装到 <克隆路径>\..\tools\(插件就是去那儿找的),不装服务、不改 PATH、不需要管理员权限;重复跑会跳过已就绪的项。 哈希来源见 docs/provenance-*.md。 交给 AI 装:见 AGENTS.md。 卸载 plugin_manager action=remove_bundle target=dsh-video-gate 变更记录 按时间倒序,只记影响使用的改动。 | 版本 | 改动 | | 0.9.0 | 阀门窗口:粘贴登录态 / 退出登录 / 登录态状态显示;关窗口缩托盘;用到登录态后提醒可退出 | | 0.9.0 | B 站 AI 字幕:本地缓存 + 重试 8 次 + 严格归属校验(时长覆盖、关键词至少命中 2 个)。此前校验过松,会让 in/si 这种片段命中一切英文 | | 0.9.0 | 会话级唤醒:发「启用读取视频插件」才允许读取;未启用时直接拒绝 | | 0.8.0 | 可选登录态(video_login / video_logout),用于取需要登录的 AI 字幕 | | 0.7.0 | 独立阀门窗口(gui/valve.py),勾选即写 state.json,不用重启 | | 0.6.0 | 本地 whisper.cpp 转写(transcribe: true),音频不出机器 | | 0.5.0 | 本地 ffmpeg 抽帧;localRoots 从 state.json 读取;无 ffprobe 时从 ffmpeg -i 解析时长 | | 0.4.0 | 通道收敛为「本地 + Bilibili」;YouTube / 小红书 / Netflix 明确不支持 | | 0.1.0 | 初版:通道分类、阀门弹窗、审计日志 | 许可 MIT。tools/ 里的第三方二进制各自遵守其许可(ffmpeg 为 GPL,whisper.cpp 为 MIT)。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
PoiFlos/dsh-video-gate
按需放行本地与B站视频,抽帧并转写字幕
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,792已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,170已汉化DeepSeek 客户端
71
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,041已汉化DSH
70.7
这是你的仓库?认领条目