dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
追番 — an anime tracker plugin for DeepSeek Harness: seasonal charts, airing schedule, search, watchlist, detail pages, bilibili / FQDM / AniCh streaming, torrents, downloads, OP/ED themes, and its own MSE player (PrismFlow) with libass subtitles and Anime4K.
中文 · English
在 DeepSeek Harness 里追番的一整页插件:季度新番、放送表、搜索、追番进度、 番剧详情、在线播放、种子播放、下载、主题曲。以「侧边栏图标 + 主面板」的形式注册 (sidebar.panellist id dsh-anime ⇄ main key dsh-anime),不是浮层、也不是小组件。
An anime tracker as a DeepSeek Harness plugin: seasonal charts, airing schedule, search, watchlist, detail pages,
streaming (bilibili / FQDM / AniCh), torrents, a download manager and OP/ED themes — with its own player
(PrismFlow: MSE + libass + Anime4K) instead of a bare `` tag.
1.0.13(页面构建号 2026-10-25.99)ffmpeg(转码 / 下载合流)、mpv(内嵌或外置播放)、qBittorrent(外部下载客户端)本插件目前有许多不完善的功能和bug,未来会逐一解决和优化
页面 · 能做什么 本季新番 / 搜索 · AniList 风格的左侧筛选栏 + 海报网格:季度、年份、排序(热度 / 评分 / 开始时间)、类型、标签、放送状态、格式、评分区间、是否含成人内容;搜索页同一套网格 放送表 · 未来 7 天的排播,按星期分组,今日高亮;数据随页头选中的番剧库切换 我的追番 · 本地追番表:集数 +1 / −1、进度条、继续观看;追番卡片直接显示下一话与已看集数 番剧详情 · 横幅 / 封面 / 评分 / 类型 / 制作组 / 外链 / 预告 / 下一话倒计时;标签页:信息、在线流、种子流、观看顺序、主题曲、角色与关联 在线流 · 哔哩哔哩、FQDM、AniCh,以及 AnimeFlow 声明式源(src-*):搜索 → 匹配季度 → 集数网格 → 播放;真实线路名、死线路自动换线 种子流 · AniBT / AnimeTosho:集数 + 分辨率 + 只看合集 + 精确标题过滤,带体积 / 集号 / 字幕组;内置 BT 引擎或交给 qBittorrent 片源 · 已安装扩展 + Seanime Marketplace 目录;开关、偏好、以及每张卡右上角的 <> 源码查看 / 编辑 下载 · 在线流与种子流共用一张任务表(Motrix 风格),进度、速度、暂停、取消、打开目录 设置 · 播放、桌面播放器、种子流、下载与数据、界面语言等分区
页头还有一个番剧库三选一开关(AniList / Bangumi / Animeko),它决定本季新番、放送表、搜索从哪里读。 不做同屏混排——同一部番会带两套 id 出现两次。在线流与种子流与该开关无关。
插件就是一个普通的 DSH 插件包(dsh.bundle.patch + dsh.client.platform = web),装法两种。
# 把包装进 profile(等价于在 profile 目录里跑 pnpm add)
dsh --profile desktop plugin add "git+https://github.com/Elisoar111/dsh-anime.git"
# macOS / Linux 换成你的 profile 名(web / tui / …)
dsh --profile web plugin add "git+https://github.com/Elisoar111/dsh-anime.git"然后确认 profile 的 package.json 里 dsh.profile.bundles 含这一项——少了它插件不会被加载:
{
"dsh": {
"profile": {
"bundles": ["@local/dsh-anime", "…其它插件"]
}
}
}重启 DSH(或在插件面板里关 → 开一次),侧边栏出现「追番」。
git clone https://github.com/Elisoar111/dsh-anime.git
cd dsh-anime
npm install # 运行时只依赖 webtorrent在 profile 的 package.json 加一条依赖 + 一条 bundle,路径改成你 clone 的位置:
{
"dependencies": {
"@local/dsh-anime": "link:D:/path/to/dsh-anime"
},
"dsh": {
"profile": {
"bundles": ["@local/dsh-anime"]
}
}
}dsh --profile desktop plugin install # 让 pnpm 建好链接profile 文件位置:$DSH_HOME/profiles//package.json, Windows 默认 %USERPROFILE%.dsh\profiles\desktop\package.json。
开发时改完 index.js / lib/*.js:重启一次插件(关 → 开)即可;改 client.js 还要刷新页面。
工具 · 用在哪 · 没有会怎样 ffmpeg · 在线流转码(HLS → fMP4)、种子下载合流 · 在线流播不了;种子流只能「用播放器打开」 mpv · 外置播放「用播放器打开」 · 少一个入口,内置播放器不受影响 qBittorrent · 把种子任务交给外部客户端 · 只能用内置 BT 引擎
装好之后只有 AniList 是开着的,其它源需要自己到「片源」里打开——见下一节。
九个内置源里除 AniList 外全部 defaultEnabled: false,AnimeFlow 的声明式源(src-*)同样默认关闭。 这样新用户可以先把页面跑起来,再按需要开源,而不是一屏十几张卡全是「未配置 / 网络不通」。
打开方式:「片源」→ 找到对应卡片 → 右下角开关。开关状态会写进 $DSH_HOME/state/dsh-anime/settings.json 的 extensions..enabled,之后就算你改这个源的偏好设置也不会被悄悄改回去 (这一点有 dev/check-default-sources.mjs 守着)。
源 · 提供什么 · 网络现状(实测) AniList graphql.anilist.co · 季度新番、热度、放送时间轴、搜索、详情(角色 / 关联 / 制作组 / 预告)、观看顺序 · 可用,1–8 秒 Bangumi api.bgm.tv / 镜像 bgmapi.anibt.net · 每周放送表、中文搜索、按季度搜番、详情 / 集数 / 收藏 · 官方地址连接超时;数据接口默认走 anibt 镜像(可用)。OAuth 登录仍指 `bgm.tv`,镜像没有代理该端点,所以收藏同步需要自备代理 Animeko api.animeko.org · 季度排期、放送表、搜索、条目详情;封面 static.myani.org · 可用,匿名免 token,1–2 秒;条目 id 与 Bangumi 同一 id 空间 哔哩哔哩 api.bilibili.com · 在线流(番剧 + 用户投稿)、主题曲第二源 · 可用;无 cookie 会 412 风控,宿主先取 buvid3/buvid4 再请求 FQDM · 在线流(MacCMS 模板站) · 可用;线路表 {name, sid, count},部分线路 CDN 已死(见「死线路自动换线」) AniCh ani.emmmm.eu.org · 在线流(站点解析)+ 索引(季度 / 搜索 / 详情 / 集数) · 可用;解析出的 15 条线路里混着小红书 CDN 的宣传片,需要按域名过滤 AniBT anibt.net · 种子流首选,中文字幕组 · 可用,1–4 秒 AnimeTosho animetosho.org · 种子流兜底(HTML 解析) · 可用,但不少 tracker 已死 AnimeFlow 声明式源 assets/sources/animeflow · src-girigiri / src-gpjda / src-mxdm 等,规则驱动的在线源 · 取决于站点 Seanime Marketplace(jsDelivr 镜像) · 「片源」页列出上游生态的在线流 / 种子流 provider(本次实测 71 + 28 个,随上游清单变化) · GitHub raw 不可达,走 jsDelivr
所有上游都由宿主代理并缓存(短期 60 秒 / 中期 10 分钟 / 片源目录 6 小时):浏览器直连会撞 CORS 与 Referer 防盗链,宿主侧没有这些限制,也不把上游 URL 暴露给页面。
AniList 只有罗马字 / 日文 / 英文标题,选它时海报墙天然是英文。宿主做了一层中文名映射: 条目自带的 title.native 若是中文(有汉字、无假名)直接用;否则去 Animeko 同一季排期表 (/v1/schedule/season/{id} 与 /v1/schedule/airing)建 name + aliases 索引做精确匹配。 只有精确命中才改名——早先试过「Animeko 搜索取第一条」,把「薬屋のひとりごと」配成了 「BanG Dream! 第三季」,比留着英文更糟,已废弃。索引缓存 6 小时;仍没命中的保留原名。
想要 100% 中文,切到 Animeko 数据源(它自带 nameCn)。
自研播放器组件:哔哩哔哩的 DASH 视频轨 / 音频轨由页面自己做 MSE 合流,字幕走 libass(真 ASS 渲染, 字体 / 字号 / 颜色 / 描边 / 阴影都在设置里改,落成服务端生成的 [V4+ Styles]),画面可选 Anime4K 锐化 / 超分。 不依赖外部进程,也不占独立窗口。
PrismFlow(默认)或 内嵌 mpv(原生渲染,Anime4K 走 mpv 的 --glsl-shaders-append)。键盘快捷键、画中画的表现一致。
/bili/search、/online/search(FQDM / AniCh / src-* 走统一抽象)。/bili/season、/online/episodes。/online/resolve 内部完成;宿主带 Referer 拉流并透传 Range(206)。/MSE 读 /online/stream,或转码链路 /torrent/transcode`。死线路自动换线:streamCandidates() 会先问扩展要候选。FQDM 这类 MacCMS 站点的 sid 是每部番一份, 换线必须重写集数 id而不是只换名字(lib/fqdm.js 的 alternates());AniCh 的候选是画质档位。 候选按「用户点的那条 → 其余 → 记忆过能播的」排序,最多试 6 条,能播过的记进 goodLine。 (能播的线路常在列表第 5~11 位,只试三条时经常三条全死。)
广告线路过滤:AniCh 的 /vod/{id}/{ep} 里 全集(全高清-1080P) 那几条实际指向小红书 CDN 的宣传片, 宿主按域名丢掉,免得 ffmpeg 报 not in allowed_segment_extensions 或播出一段广告。
清晰度:哔哩哔哩走 qn 阶梯(4K / 1080P+ / 720P / 480P / 360P),换档时把当前秒数通过 startAt 带回去, 不回到片头;没有 caption 的源(FQDM / AniCh)档位名直接用站点给的真实线路名,而不是编一个「线路 3」。
webtorrent),加入磁力时不能传 `announce: []`,否则会覆盖磁力自带的 tracker,而本网络 DHT 不可靠,元数据永远拿不到。元数据通常 4–20 秒。
/torrent/stream?hash=&index=:从 swarm 读文件、支持 Range(206);元数据未就绪立刻返回409 `metadata-pending`,不让请求挂死。
/torrent/transcode,ffmpeg 重封装或转码后再推给播放器。/api/v2,auth/login 取 SID,403 自动重登重放)。在线流的 fMP4 片段没有容器时长,因此这类流的总长显示 --:--、进度条不可拖——这是流本身的限制, 不是播放器的 bug。插件对能拿到时长的链路(转码、种子流、哔哩哔哩 DASH 的 duration)会显示真实长度; 哔哩哔哩的分段 DASH 没有索引表,拖动 = 换一条从目标秒开始的流(/bili/stream?…&start=秒, 宿主用 ffmpeg -ss 起拼),页面把「已跳过多少秒」记在 offset 里,进度条显示 offset + 流内秒数。
拖动时用独立的 scrub 状态,松手才落回真实位置,不会被 timeupdate 抢回去;±85s、←/→、A/D 与进度条共用同一条 seek 路径。ffmpeg 转码流不支持 Range,那条链路上进度条是禁用的。
播放器面板里的齿轮会列出本机检测到的 mpv / VLC / PotPlayer,点一下就把流交给它,并带上当前秒数 (mpv --start=、VLC --start-time=、PotPlayer /seek=)与本集标题。
off / 快速 / 均衡 / 高质量,着色器随插件发布在 assets/anime4k/(49 个 .glsl),以 --glsl-shaders-append= 逐条交给 mpv;预设只用 Restore_CNN_* + Upscale_CNN_x2_* + Clamp_Highlights, GAN / UL / VL 在 1080p 实时解码下撑不住。VLC 与 PotPlayer 没有等价机制。
{url} {start} {title} {shaders}。mpv --wid= --geometry= 直接画在面板区域,再走 --input-ipc-server把播放 / 暂停 / ±30s / 速度 / 音量 / 位置接回面板(lib/mpv.js)。拿不到窗口句柄时退化成独立窗口。
localStorage(dsh-anime:watchlist:v1),不联网、不占宿主状态。AniList 外链、预告、下一话倒计时。
anilist/watchorder):按 AniList 的 relations 拓扑排序给出「前作 → 本作 → 续作」链,当前番剧高亮,每一行带封面、类型、集数、年份;点任意一条跳到那部作品的详情,可层层返回。
详情页的「主题曲」标签里是来源切换(选中哪个才查哪个),默认 animethemes:
来源 · 说明 animethemes.moe · 按 AniList id 取官方 OP/ED 片段(/animethemes/themes)。注意 filter[has][]=resources 这类数组写法是必须的,标量会被判 The filter.resource must be an array 哔哩哔哩 · 复用 bili/videos 搜索 + bili/video 取 cid + bili/stream 代取字节,按视频标题搜「番名 OP」
本机 api.animethemes.moe 常被 Cloudflare 挑战(403 / 422 / 500),页面会把真实失败原因原文显示出来, 并提供一键切到哔哩哔哩。两个来源的播放器都是同款 Player(不是浏览器原生 ``), 哔哩哔哩那条带 qn 阶梯,切换清晰度不丢位置。
两种来源共用一张任务表,默认落盘到系统「下载」文件夹,历史写 downloads.json:
/downloads/stream,宿主自己带 Referer/Cookie 抓流,先写 名字.mp4.part 再改名。产物按扩展名交给 ffmpeg(写 .part 时它认不出容器,会报 Unable to find a suitable output format),所以实际是写 .part + 显式 -f mp4。
/downloads/torrent,宿主轮询引擎进度,下完复制进下载目录。.part)、打开所在目录;界面按 Motrix 的任务行 / 进度条 / 状态徽标做的。dialog.showOpenDialog,取不到退回