dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DBS (DSH BGM service) — 独立于 DET 的 DeepSeek Harness 音乐播放器插件:本地音乐库 + 浮动播放器 + AI 依任务控制播放。A standalone DSH BGM player plugin: local music library, floating player, AI-driven playback.
npm i dsh-bgm-service · MIT · 与 DET(dsh-essential-tools)、DLT(dsh-light-tool)命名一致
一个不属于 DET 的 DeepSeek Harness(DSH)插件:本地音乐库 + 浏览器浮动播放器 + AI 依据任务控制播放(模型工具 + 自动联动)+ 网络下载入库 + 乐评爬取(尽力而为)。
包名说明:npm 上的
dbs已被 2014 年的无关包占用(charliedowler/dbs),因此发布名为dsh-bgm-service;插件自身的短名仍是 DBS,宿主端点与 Web 路由仍是dbs/*、/dbs/stream/<id>(与包名无关)。
musicDir(或 musicDirs 多个目录)下 .mp3/.flac/.wav/.m4a/.aac/.ogg/.opus/.webm,文件名按 艺术家 - 标题 智能解析出曲目/艺术家/标签。POST /dbs/upload)。/dbs/stream/<id>,支持 Range 拖动进度)。bgm_list / bgm_play{trackId|query} / bgm_play_auto{query} / bgm_next / bgm_prev / bgm_pause / bgm_stop / bgm_set_volume。autoLink: true):会话开始 / 工具调用密集时自动切一段合适的 BGM(尽力而为)。dbsDownload(url) —— 从公网 URL 下载音频到本地音乐库(SSRF 校验:禁私网/环回;大小上限;按 Content-Type/扩展名落盘)。dbsReview(query) 默认抓取豆瓣音乐「简介」作为乐评,按查询词缓存;反爬时给出可读失败提示(请自行评估合规与频率限制)。# 在 DSH 的 web profile 目录里
cd $env:USERPROFILE\.dsh\profiles
npm i dsh-bgm-service --cache .\.npm-cache
依赖 @deepseek-ai/schemastery 会随包一起装上;@deepseek-ai/dsh-typert-protocol、@deepseek-ai/dsh-tools 由 DSH 本体提供。
D:\plugins\DSHBgmService)。dsh-bgm-service,与 DLT 的 dsh-light-tool 同一约定):
New-Item -ItemType Junction -Path "$env:USERPROFILE\.dsh\profiles\node_modules\dsh-bgm-service" -Target "D:\plugins\DSHBgmService"在 $env:USERPROFILE\.dsh\profiles\web\cordis.patch.yml 追加注册行:
- insert:
- id: dbs
name: 'dsh-bgm-service'
config:
musicDir: 'D:\Music' # 本地音乐主目录(自动扫描)
musicDirs: [] # 额外本地目录(可选,可多个)
importDir: '' # 上传/下载落盘目录;为空则用第一个根
autoLink: false
defaultVolume: 0.6
reviewBase: 'https://music.douban.com'
重启 DSH → 左下角出现 DBS 播放器;进入设置/对话即可见 bgm_* 工具(供 AI 调用)。
宿主改动需重启;客户端改动需刷新/重建。
musicDir 内。/dbs/stream/<id>),无第三方地址。dbs/*)dbsList dbsScan dbsPending dbsCommand dbsDownload dbsReview
模型工具:bgm_list bgm_play bgm_play_auto bgm_next bgm_prev bgm_pause bgm_stop bgm_set_volume
Web 路由:GET /dbs/stream/<id>(音频流,Range 支持)
| 类别 | 问题 | 处理 |
|---|---|---|
| 安全(SSRF) | dbsDownload / 乐评抓取用 fetch(..., {redirect:"follow"}) —— 只校验了初始 URL,服务器回一个 302 指向 http://127.0.0.1/... 即可绕过 SSRF 防护 | 新增 fetchGuarded():手动逐跳跟随、每跳复验私网/环回/元数据、最多 5 跳(已用桩测试验证:重定向到内网时第二跳根本不会发出) |
| 安全(超时) | 两处 fetch 均无 AbortSignal —— 不响应主机会把端点挂死 | 统一加 15s 超时 |
| 安全(DoS) | 下载先 arrayBuffer() 整体读入内存再判大小 —— 超大响应可撑爆内存 | 先看 Content-Length,再流式读取并按上限截断 |
| 功能 | 页面刚打开时 dbsList 可能返回空曲库(构造函数的首次扫描还没跑完),而客户端只在 apply 时拉一次列表 → 曲库一直空着 | 保存首次扫描的 Promise,dbsList 等待它;_ensureScanned(30s) 做新鲜度与并发去重 |
| 功能 | bgm_list 只返回 count,模型拿不到任何 id/标题 —— 与工具描述不符,实际无法挑曲 | 返回曲目列表(id/title/artist/tags,默认 40 首、上限 200),并在卡片里逐行渲染 |
| 质量 | pickFor 无条件 +标签数,导致「标签多但与 query 毫不相关」的曲子总是胜出 | 改为关键词命中优先(标题 5 / 标签 4 / 艺术家 3),标签数只在有命中时轻微加分 |
| 功能 | 客户端 useDbs 把同一个对象引用交给 setState(store 是原地修改的),React 因 Object.is 相同而 bail out → 播放器 UI 永不刷新 | 每次传新的浅拷贝 |
| 功能 | 播放器拖完会被纵向拉伸、拖不到位 | .dbs-root 的 CSS 带 bottom:14px;拖动写入 left/top 后 top 与 bottom 同时存在 → position:fixed 元素被拉伸。已改为写坐标时一并 bottom:auto;right:auto,并加 3px 拖动阈值避免误触 |
| 新增 | 最小化(变成小球) | 标题栏右侧「—」→ 收成 38px 圆球:可继续拖动、点击还原、播放中变色 |
| 健壮性 | decodeURIComponent 遇畸形 % 转义会抛 | 加兜底 |
| 清理 | 死代码 fsPath() | 删除 |
宿主改动需重启 DSH 生效;客户端改动需刷新/重建。
MIT