dsh-vidlens
按人看片的顺序取样,而不是下载整片:先元数据与章节,再按时间码抽帧看画面、字幕优先转录(平台没有字幕才走本地 ASR)、AudioSet 527 类声音事件标签与高赞评论——21 个工具共用一个磁盘缓存,并带跨进程锁。需要 Python 3.10+、ffmpeg 与 vidlens 包(pip install vidlens-mcp);缺依赖时回给你的是两种修法,而不是一句 ImportError。
安装
dsh plugin --profile web add dsh-vidlens
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
VidLens for DeepSeek Harness
中文 · [English](README.en.md)





把 vidlens 从一个 stdio MCP 外壳变成 DSH 原生插件:18 个 vidlens_* 工具、图片直接进对话、按工具设超时、外加三个零下载的缓存工具。
工程本体(Python)没有改一行逻辑:插件通过一个常驻桥进程调用 vl_mcp.py 里已经测过的工具函数,所以 MCP 外壳和插件的行为不会漂移。
- 工程仓库(Python + MCP 服务器):<https://github.com/cctv2333/vidlens>
- 本仓库(DSH 插件):<https://github.com/cctv2333/dsh-vidlens>
- 插件要求:
vidlens >= 1.4.0(video_soundscape起)、Node ≥ 20、DSH>=0.2.1-rc.2 <0.3.0
用户: 这个视频讲了什么? <url> → vidlens_meta 0 下载:值不值得看 → vidlens_plan 0 下载:切章节,挑 2–3 段 → vidlens_window 只下这一窗的音频(或直接读缓存/字幕) → vidlens_sheet 只下这 20 秒,拼图带时间码,图直接附在结果里 → vidlens_brief 平台字幕优先;无字幕才下音频做本地 ASR → vidlens_soundscape 台词之外的声音(吃饭/敲击/水声),带概率
相对 MCP 外壳的增强
能力 · MCP 外壳 · 本插件
工具名 · mcp__vidlens__video_meta · vidlens_meta(短、可读)
超时 · 客户端一个全局 60s · 每个工具自带预算(vidlens_brief 15 分钟,vidlens_scan 15 分钟)
图片 · 取决于客户端是否支持 MCP image content · 走宿主 attachments.saveImage,成为持久图片附件,同轮就能看
缓存意识 · 无 · vidlens_library(零网络列缓存)、vidlens_seek(零网络查原话)
批量筛选 · 无 · vidlens_compare(最多 8 个链接,0 媒体下载)
行为约束 · 只在 MCP instructions 里 · 独立的 system-prompt 小节:先 meta→plan→抽样,绝不下整片
取消 · 断开连接 · exec.signal 取消时重启桥进程,不留下卡死的下载
整片下载 · video_full(confirm=true) 存在 · 故意不提供:需要画面就用 sheet/frames/scan
本地视频 · 与 Python 核同步(1.6.0 起) · 所有 url 参数都接受本地路径:D:\a.mp4、file:///D:/a.mp4、~/a.mov
安装
前置:先有一份 vidlens。 二选一:
pipx install "vidlens-mcp[all]" # 推荐:无 checkout,命令叫 vidlens / vidlens-mcp # 或 git clone https://github.com/cctv2333/vidlens && cd vidlens && install.cmd
然后装本插件(三选一):
# A. 本地目录(开发;换成你自己 clone 的位置) plugin_manager action=install_bundle target=<你的路径>\dsh-vidlens # B. GitHub 直装(本包无 build/prepare 脚本,不需要 allowBuilds 权限) # 注意:这条会真的 git clone 本仓库,会被 GitHub 记一次 clone dsh plugin --profile desktop add github:cctv2333/dsh-vidlens#<sha> # C. npm(registry,不经过 GitHub) dsh plugin --profile desktop add dsh-vidlens
插件会自动找 Python 工程:config.projectDir → $VIDLENS_PROJECT → <本包>/../vidlens → 当前目录
(只认真实存在的目录,不含任何人的本机路径);
找不到时按 $VIDLENS_PYTHON / .venv / python 依次尝试。PyPI 安装的形态下,
把 projectDir 指到 pipx 的 venv 或直接设 VIDLENS_PROJECT 都行(模块名不变)。
安装后这个 bundle 会插入一行 Host 插件:
- insert:
- id: dsh-vidlens
name: 'dsh-vidlens'
config: {}
想改成别的工程位置(例如换机器)就在 config 里写:
- insert:
- id: dsh-vidlens
name: 'dsh-vidlens'
config:
projectDir: D:\path\to\vidlens
pythonPath: D:\path\to\vidlens\.venv\Scripts\python.exe
warm: true
字段都可省略:projectDir 默认依次取 config.projectDir → $VIDLENS_PROJECT → <本包>/../vidlens → 当前目录;pythonPath 默认取 $VIDLENS_PYTHON → 工程的 .venv → python。
工具(21 个)
基础四件(0 下载)
工具 · 用途
vidlens_meta(url) · 标题/UP主/时长/播放/平台字幕/平台标注音乐 + 注入风险扫描
vidlens_plan(url, window=300) · 按切点/长静音分章节 + 建议顺序
vidlens_subs(url, lang=zh) · 平台字幕(人工优先,其次自动/AI)
vidlens_library(limit=20, query='') · 新增:本地缓存清单,避免重复下载
读内容
工具 · 下载量 · 用途
vidlens_watch(url, minutes=5, cursor="next") · 每段该窗音频(或缓存) · 新增:一段一段看(默认 5 分钟、约 0.5k 字),返回该段要点 + 「已看 X / 共 Y(%)」,并要求先汇报、再问用户要不要继续
vidlens_window(url, start, end) · 0(有缓存/字幕)或该窗音频 · 某时间窗的台词与停顿
vidlens_brief(url, ..., level="digest") · 平台字幕 0;无字幕才下音频 · 摘要(默认约 1.5k 字:章节 + 5 句关键台词 + 全文路径);level="full" 才给 6–9k 字完整报告(结构/停顿/低置信词/广告段落/风险)
vidlens_seek(query, url='') · 0(新增) · 在缓存转写里按关键词查原话 → 时间码
vidlens_audio(url, start, end) · 该段音频 · SenseVoice 语种/情感/事件 + 节拍与能量
vidlens_soundscape(url, start, end) · 该段音频 · 新增:AudioSet 527 类声音事件(吃饭/敲击/水声/碰撞…)+ 概率 + 时间码
看画面(图片直接进对话)
工具 · 下载量 · 用途
vidlens_sheet(url, start, end, cols, rows) · 该段(20s≈0.9MB) · 带绝对时间码的拼图
vidlens_frames(url, at=[...]) · 该段 · 最多 6 张精确帧(读小字用)
vidlens_scan(url, n=24) · 最低画质整片(7min≈14-21MB,用完即删) · 全片抽样拼图(无音频视频)
vidlens_ocr(url, start, end, n=12) · 该段最低画质 · 把画面上的字读成文本(本地 OCR,离线);无人声、无字幕的视频靠它,输出带时间码
vidlens_ocr 的引擎是可选依赖(RapidOCR,Apache-2.0,PP-OCRv6 模型随包分发,装完离线)。
第一次调用不会偷偷下载:它先告诉你「约 80MB、会装到哪个目录、怎么换目录」,
再调一次并传 install: true 才开始下,结果里会写清装到哪。
变量 · 作用 · 默认
VIDLENS_OCR_TARGET · 装到指定目录(自动加入 import 路径,不写系统目录) · 本解释器 site-packages(Windows 上通常就是 C 盘)
VIDLENS_OCR_AUTO_INSTALL · ask 先问 / auto 自动装 / off 只给命令 · ask
# 想放 D 盘 + 以后自动装(桥进程会读这两个环境变量): set VIDLENS_OCR_TARGET=D:\your\ocr set VIDLENS_OCR_AUTO_INSTALL=auto
没装也不会坏:vidlens_ocr 返回安装说明,其他工具不受影响。
上下文预算(为什么默认给摘要)
一次「看视频」如果按老路子走,实测是这么多字符:
调用 · 字符 · 说明
meta + plan · ~730 · 便宜
window × 3(各 1 分钟) · ~2,800 · ~0.9k/分钟
soundscape(60 秒) · ~1,500 · 12 窗 × 8 标签
brief(旧版全量) · ~9,000 · 6–9k 字 ≈ 4–6k tokens
合计 · ~14,200 · 还没算图片
关键不在单次有多大,而在于这些字符之后每一轮都在上下文里。一个 64k 窗口,
两三个视频 + 正常对话就会顶到上限,于是出现「看完视频就超上下文」。
所以默认改成三档,按需升级:
1. vidlens_brief → 摘要(约 0.7–1.5k 字:标题/时长/语音覆盖/章节/5 句均匀取样的关键台词/全文路径);
2. vidlens_window → 只读某一段(约 0.8k 字/分钟),读细节用它,别用 brief 代;
3. vidlens_brief(level="full") → 完整报告(6–9k 字),只在用户明确要全文时用一次。
全文始终写在 out/<id>/brief.md,不会丢;摘要里直接给路径和下一次该调什么。
vidlens_window 另有 80 行上限,超了会明说「还有 N 行,缩小范围」而不是无限倾倒。
判断 / 长视频 / 自检
工具 · 用途
vidlens_comments(url, limit=40) · 评论区互动比、正负面、争议度、高赞评论 + 评论配图
vidlens_compare(urls=[...]) · 新增:批量元数据对比(0 媒体下载,最多 8 个)
`vidl
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:12,最后更新 2026-10-30