dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
An agent skill that batch-researches a YouTube channel's latest N videos — captions first, local ASR fallback — and writes one cross-video report instead of N summaries. Works in DSH, Codex, Claude Code, Hermes and WorkBuddy.
[!IMPORTANT] 本仓库已被 multiplat-research 取代。 新项目保留同样的报告结构与实测坑表,但把代码拆成可插拔的数据源 (YouTube · B站 · 本地文件 · 抖音本人账号导出)与平台无关的分析内核, 并修掉了本版本仍存在的两个问题:去掉了 ffmpeg 依赖(faster-whisper 经 PyAV 解码音频)、 用客户端回退链绕开 YouTube 媒体流的
HTTP 403。 除非你确实只要单平台版本,否则请使用新仓库。
把「这个频道最近都在讲什么」变成一份跨视频研究报告。 给它一个频道和 N —— 它会枚举最近 N 条投稿,逐条取文本(字幕优先、无字幕自动 ASR 转写), 然后写成一份横向对比报告,而不是 N 篇互不相干的摘要。
一个纯 Python、零外部服务依赖的 Agent Skill, 可在支持标准技能结构的宿主中直接使用:DSH / Codex / Claude Code / Hermes / WorkBuddy。
手动研究一个频道要经历:找视频 → 判断有没有字幕 → 有字幕就下载、没有就下音频转写 → 读 N 份长文本 → 横向对比。前四步全是体力活,而且有几个反复踩的坑(客户端指纹拦截、 Windows 下 HF 模型缓存损坏、字幕里的零宽字符污染文本、ASR 成本失控)。
本技能把前四步脚本化,并把踩过的坑固化成文档,让 Agent 把精力花在第 5 步。
| 能力 | 说明 |
|---|---|
| 两遍式枚举 | Pass 1 一次请求拿列表;Pass 2 逐视频取发布日/播放/字幕可用性,不下载任何媒体 |
| 成本预估 | 在下载之前就算出「这 N 个视频里几个必须走 ASR、预计转写多少分钟」 |
| 字幕优先 | 支持人工字幕与自动字幕,json3 / vtt 双解析路径,自动去滚动重复 |
| ASR 兜底 | faster-whisper(CPU/int8),语言自动检测,模型多候选稳健解析 |
| 文本清洗 | 去零宽字符与 HTML 标签、压缩空白、消除中日韩字符间多余空格 |
| 成本护栏 | 批量 ASR 预估超过 --max-asr-min(默认 30 分钟)时拒绝执行,需显式确认 |
| 口径一致 | 发布日统一取官方 upload_date(美国太平洋时区),跨文件不会差一天 |
# 1) 装依赖(技能本地 venv,不污染系统 Python)
python -m venv .venv
.venv/bin/python -m pip install -r requirements.txt # Windows: .venv\Scripts\python.exe
# 2) 自检:确认解释器与依赖解析正确
python scripts/python_env.py
# 3) 枚举频道最近 5 个视频 → channel.json + index.md
python scripts/channel_list.py "@MrBeast" -n 5 --out ./yt-research
# 4) 取文本(字幕优先,无字幕自动 ASR)
python scripts/fetch_transcript.py --index ./yt-research/channel.json --out ./yt-research/transcripts
# 5) 让 Agent 依据 index.md 与 transcripts/*.plain 撰写 research.md
然后让 Agent 按 SKILL.md 的「产出格式」撰写报告,或自己照抄那 6 节结构。
技能就是一个普通目录,所以「安装」= 让宿主的技能目录里能看到这个目录。
| 宿主 | 技能目录 | 备注 |
|---|---|---|
| DSH | ~/.dsh/skills/<name> | 也自动发现 ~/.skillshub/* |
| Codex | ~/.codex/skills/<name> | 同上;实测两者共用 ~/.skillshub |
| Claude Code | ~/.claude/skills/<name> | 亦支持项目级 .claude/skills/ |
| Hermes | %LOCALAPPDATA%\hermes\skills(Windows)/ ~/.hermes/skills | 另有 hermes skills install <repo> 与 hermes skills tap add <repo> |
| WorkBuddy | ~/.workbuddy/skills/<name> | 实测为「真目录」而非链接 |
python scripts/install_to_agents.py # 只探测已存在的宿主目录,不写入
python scripts/install_to_agents.py --install # 真正安装
python scripts/install_to_agents.py --agents dsh,codex --mode copy # 指定宿主,用复制
脚本默认在支持时建立目录链接(Windows junction / POSIX symlink),
这样以后 git pull 更新技能,所有宿主同步生效;不支持或没权限时自动退回复制。
Windows(PowerShell,以 DSH 为例)
New-Item -ItemType Junction -Path "$env:USERPROFILE\.dsh\skills\youtube-channel-research" `
-Target "C:\path\to\yt-research-skill"
macOS / Linux
ln -s /path/to/yt-research-skill ~/.claude/skills/youtube-channel-research
Hermes(从仓库直接装)
hermes skills install <your-github-user>/yt-research-skill
# 或把仓库加为技能源,之后可用 hermes skills browse/search
hermes skills tap add <your-github-user>/yt-research-skill
技能不写死任何本机路径。需要覆盖时用这两个:
| 变量 | 作用 | 默认 |
|---|---|---|
YTDLP_PY | 指定带 yt_dlp 的 Python 解释器 | 自动解析(见下) |
YT_ASR_MODEL_DIR | faster-whisper 模型根目录 | 自动挑选可写目录 |
解释器解析顺序(scripts/python_env.py):
$YTDLP_PY / $YT_ASR_PY → 技能本地 .venv/ → 当前解释器
→ 常见第三方 Agent 自带 Python → python3 / python
这里刻意分了两级:resolve_downloader() 只需要 yt_dlp,而 resolve_asr()
额外要求 faster_whisper,并且在下载任何音频之前调用。若只做一级检查,
会选中「有 yt_dlp 但没有 faster_whisper」的解释器,失败要等到整段音频下载完才暴露
—— 那是最坏的失败时机。
| 文件 | 内容 |
|---|---|
channel.json | 频道信息 + N 个视频的完整元数据 + ASR 成本预估 |
index.md | 人读的索引表(含「内容来源」列:字幕语言 / ASR) |
transcripts/<NN>-<id>.txt | 带 [mm:ss] 时间戳的转写 |
transcripts/<NN>-<id>.plain | 纯文本(供阅读/喂模型) |
transcripts/<NN>-<id>.json | 结构化段落 + 元数据 + 内容来源 |
transcripts/<NN>-<id>.meta.json | 元数据速查 |
transcripts/transcripts.json | 批量清单(成功/失败/耗时) |
research.md | 最终交付物,由 Agent 按 6 节结构撰写 |
真实运行记录(未删改),见 examples/:
python scripts/channel_list.py "@MrBeast" -n 3 --out ./smoke
# [完成] 频道=MrBeast 视频=3 总时长=1:41:46 需ASR=0 预计转写=0.0分钟
第一步产出的索引(examples/index-mrbeast.md)——注意「内容来源」列直接告诉你成本:
| # | 标题 | 时长 | 播放 | 发布 | 内容来源 |
|---|---|---|---|---|---|
| 1 | I Survived The Most Extreme Places On Earth | 23:27 | 77,909,716 | 2026-09-06 | 字幕 manual:zh-Hans |
| 2 | Escape 100 Cops, Win $500,000 | 20:28 | 99,800,365 | 2026-08-23 | 字幕 manual:zh-Hans |
| 3 | Last To Leave Mansion, Keeps It | 57:51 | 111,328,601 | 2026-08-09 | 字幕 manual:zh-Hans |
第二步取到 3 份转录(共 30,874 字),第三步产出约 24 KB 的研究报告
(examples/research-mrbeast.md),结构为 6 节:
1. 频道概览 —— 订阅数、样本范围、发布日期区间、内容来源统计(字幕 3 / ASR 0)
2. 逐视频卡片 —— 每支:主旨一句话 + 3~6 条要点 + 内容来源与可信度
3. 横向对比表 —— 16 个维度跨视频对照(主题/机制/奖金/结构套路/植入/情绪落点…)
4. 主题聚类与演化 —— 反复出现的叙事装置、系列化模式、随时间的变化
5. 矛盾与存疑点 —— 视频之间不一致处、字幕转写可能的偏差
6. 方法论与局限 —— 字幕 vs ASR、时间戳误差、"最近 N 个" ≠ 频道全貌
样例中最能说明「横向研究 ≠ N 篇摘要」的两处:
--orders 缩小范围,或 --yes 显式确认。完整 12 条见 SKILL.md,最值得先知道的四条:
tempfile.mkdtemp() 做 yt-dlp 的工作目录——在被沙箱限制的环境里,它产出的目录连
os.listdir 都会被拒(WinError 5),Python 能写、子进程 yt-dlp 不能。脚本改用输出目录下的 .work/。yt-dlp --dump-json。snapshots/ 里可能是 0 字节占位、真身在 blobs/:
跑 python scripts/setup_asr_model.py --repair-hf-cache 就地修复(一次生效,用硬链接不额外占盘)。clean_text() 已处理。MIT。
本技能由 AI Agent 在会话中生成,并在真实频道上端到端验证;
「已知坑」表中每一条都来自实际报错与修复,不是推测。详见 ATTRIBUTION.md。