dsh-pet
PC2005-cloud/dsh-petDSH Web UI 桌面宠物,Windows / macOS / Linux 三端可用:浏览器浮层或透明置顶桌面窗口,106 个透明动画、带挤压与粒子的甩抛反弹物理、随会话事件实时联动的工作状态气泡、碎碎念与带持久记忆的对话、余额展示、表情包配图、多开同屏,并支持直接放入的自定义动画与宠物种类(pet pack)。
运行于 DeepSeek Harness 的 AI 原生音乐播放器(music player):聚合网易云(NetEase)、QQ Music 与酷狗(KuGou)搜索并支持跨源播放回退,逐字卡拉OK歌词(karaoke lyrics)经 USB HID 实时同步至花再音箱(HALO PIXELBAR),搜索、播放、队列、闹钟与音箱控制均可由对话操控。
运行在 DeepSeek Harness(dsh)内的 AI 原生插件化音乐播放器。 聚合网易云 / QQ 音乐、逐字卡拉OK歌词、花再(HALO PIXELBAR)音箱歌词同步;DeepSeek 全程对话操控——点歌、进度音量、队列收藏、音箱场景、闹钟提醒,一个插件全包。
架构设计与里程碑详见 PLAN.md。
┌─ dsh web (127.0.0.1:3080) ──────────────────────────────┐
│ 浏览器半 React 播放面板(♪ 可拖动悬浮球) │
│ · 搜索/曲库/队列/账号 · Canvas2D 逐字卡拉OK │
│ ▲│ 2s 轮询:上报播放状态 ← 命令队列 → 执行 │
├─────────▼──────────────────────────────────────────────┤
│ 宿主半 Cordis 插件(dsh 进程内,Node) │
│ · 平台 BFF(网易 NCM / QQ fcg 签名直连 / 酷狗移动端搜索) │
│ · 音频代理(Range + Referer 注入) │
│ · AI 工具集 ×12 · 定时调度 · 通知分发 │
│ · 花再 HID 驱动 ──USB──▶ 音箱(歌词/时钟/场景/频谱) │
└─────────────────────────────────────────────────────────┘
dsh plugin add 即装即用;工具经 dsh tools 服务注册,模型自动发现调用POST /notify 触发
/halo/notify/dismiss)或切歌;也可设为 N 秒自动让位歌词,暂停状态下到点回时钟$DSH_HOME 纯本地MusicProvider 合同 + ProviderRegistry(对标 HaloLyricSync factory.py)。新增平台只需在 providers/<x>.ts 实现合同、installBuiltinProviders() 注册一次,routes/tools/merge 自动适配,无需改动消费方POST /api/dsh-music/notify 验证双通道(声音 + 音箱文字)load() 强制重载,彻底解决「选了新歌仍播旧歌」GET /providers + POST /providers/toggle),状态持久化;停用后聚合搜索仅走启用源providers/kugou.ts 实现 MusicProvider 合同、零依赖直连移动端搜索,作为首个新增第三方源;其播放接口需签名/dfid,轻量手段取不到直链,故仅作搜索扩源,点播回退至网易云/QQ本插件 运行时零 npm 依赖:网易云为原生 weapi/eapi 复刻(仅 node:crypto + fetch),
框架(@deepseek-ai/*)由 dsh 宿主在运行时提供,不再作为 peerDependency 被 pnpm 自动安装。
因此从 dsh 市场安装不会再触发 symlink 权限错误(EPERM);pnpm pack 后安装实测仅装 0 个依赖。
从 dsh 市场安装(推荐):在插件市场搜索 dsh-music-huazai 一键安装,重启 dsh web 即可。
本地开发 / 手动安装:
pnpm install
pnpm build
dsh plugin --profile web add <本仓库路径>
# 重启 dsh web,刷新页面,右下角 ♪ 即播放器
本地开发:仓库以 link: 方式接入 profile。改完代码 pnpm build;
宿主半变更需重启 dsh web(可用 scripts/dev-server.ps1 启停),浏览器半变更刷新页面即可。
uin= 与 qm_keyst=)全部经 dsh tools 服务注册,模型按 JSON schema 自动调用;播放执行经桥接命令队列下发浏览器半。
| 工具 | 说明 |
|---|---|
music_search | 聚合搜索,返回曲目 id 清单 |
music_play | 点播:track_id 或裸 query 自动选曲 |
music_control | pause / resume / next / prev / seek 跳转进度 |
music_queue | 队列:add 加入(不打断当前)/ clear 清空 / mode 播放模式 |
music_volume | 音量 0-100 |
music_favorite | 当前歌收藏/取消本地红心(可自动切换) |
music_halo | 音箱屏幕:scene 场景 / spectrum 频谱 / clock 时钟样式 / color 屏色 |
music_sleep_timer | 睡眠定时器:N 分钟后自动暂停并提醒 |
music_alarm | 音乐闹钟:每日 HH:mm 搜歌开播 + 双通道提醒 |
music_now_playing | 当前曲目与进度 |
music_lyric | 歌词文本(LRC) |
通知入口:
POST /api/dsh-music/notify {title, text}—— 按设置分发声音提示音与音箱文字,供外部脚本/其他插件触发提醒。
/api/dsh-music/*)| 路由 | 说明 |
|---|---|
GET /search?keyword=&limit=&offset=&providers= | 聚合搜索 |
GET /url?id=netease:xx|qq:mid&quality=&mediaMid= | 取流(音质降级候选+可播性探测) |
GET /lyric?id= | 歌词载荷 {lrc,tlyric,yrc,roma} |
GET /audio?url= | 音频代理(Range/Referer) |
GET /recommend | 推荐分组:每日推荐 + 日期轮换官方榜单 ×2 |
GET /shuffle-mix | 随便听听:Top30+6随机打乱歌单 |
GET /lists · POST /list/create · /list/delete | 本地曲库多列表 |
POST /list/add · POST /list/remove · POST /list/import | 列表曲目增删与备份导入 |
POST /stats/play | 播放统计上报(驱动随便听听 Top30 排序) |
POST /auth/netease/qr · GET …/create · GET …/check | 网易扫码登录三步 |
POST /auth/qq | QQ Cookie 保存 |
POST /like/set · GET /like/check | 网易红心(双向同步用) |
POST /bridge/report · GET /bridge/poll · POST /bridge/command | 浏览器↔宿主桥 |
GET /settings · POST /settings/save | 插件设置:声音通知 / 音箱文字 / 定时任务 / 反向推送 四开关 |
GET /providers | 列出已注册音源及其启用态(id / label / enabled) |
POST /providers/toggle | 运行时启停某音源 {id, enabled},持久化后聚合搜索仅走启用源 |
GET /schedule | 定时任务快照(闹钟列表 + 睡眠剩余) |
POST /alarm/add · POST /alarm/remove | 音乐闹钟管理 |
POST /sleep/set · POST /sleep/clear | 睡眠定时器 |
POST /notify | 触发双通道提醒(按开关分发) |
POST /halo/notify/dismiss | 消除置顶通知(恢复歌词/时钟) |
POST /notify/sound/upload · GET /notify/sound/info | 自定义提示音:上传(魔数校验)与状态查询 |
GET /notify/sound/file · POST /notify/sound/reset | 取回音频本体 / 恢复内置提示音 |
GET /halo/status · POST /halo/config | 花再状态/配置 |
POST /halo/lyric · /halo/song · /halo/state · /halo/command | 花再事件与花活儿 |
数据存储:登录态、曲库列表、播放统计、插件设置、闹钟均在 $DSH_HOME/dsh-music-huazai/ 下,纯本地。
pnpm exec tsx scripts/smoke-m2.ts # 平台层:搜索/取流/歌词/登录态(真实API)
pnpm exec tsx scripts/smoke-m4.ts # 歌词解析:LRC/YRC/翻译对齐(21项断言)
pnpm exec tsx scripts/smoke-m6.ts # 花再协议:包构建/校验/emoji清洗(无需硬件)
诊断脚本(登录/音箱排障时用):
pnpm exec tsx scripts/diag-qr.ts # 网易/QQ 扫码三步链路(无需扫码)
pnpm exec tsx scripts/diag-qq-prod.ts # QQ 扫码生产路径轮询状态
pnpm exec tsx scripts/diag-netease-auth.ts # 已存网易云 Cookie 有效性核验
pnpm exec tsx scripts/diag-halo-sync.ts # 花再全链路:加载→连接→下发文字(真实硬件)
无头浏览器综合 E2E(需先
pnpm build并powershell -File scripts/dev-server.ps1启动 dsh web):pnpm exec tsx scripts/e2e-all.ts # Playwright 无头 Chrome 全功能自测:面板/搜索/播放/音乐源开关/闹钟/推荐, # 并捕获 console.error、pageerror 与 >=400 失败请求,用于发现回归
| 问题 | 处理 |
|---|---|
音箱切歌信息显示 ?? | 固件不支持 4 字节 UTF-8(emoji),已在协议层清洗非 BMP 字符 |
| 文字颜色字节必须为 0(白) | 非 0 会触发固件复位并掉线(协议层已固化) |
| 氛围灯等 v2 特性连续失败 | 自动降级禁用该特性,保住歌词通道 |
| 音箱状态一直「未连接」 | 设置页会显示具体原因(node-hid 加载失败/未找到设备/打开失败);依赖 node-hid ≥3(自带预编译二进制,旧版 1.x 在无构建工具的机器上枚举必败) |
| QQ 扫码手机端提示已过期 | 请用手机QQ的扫一扫(互联授权码仅手机QQ可弹确认页);二维码生成时已绑定 pt_login_sig 会话,若仍过期点重新获取或改粘贴 Cookie |
| QQ VIP 曲目取流为空 | 属预期:在「账号」Tab 粘贴 Cookie 后重试 |
| 酷狗曲目可搜不可播 | 其播放接口需签名/dfid,轻量手段无法取直链;酷狗仅作搜索发现源,播放回退至网易云/QQ |
本项目基于源代码移植自 Mineradio,依其 MIT 许可的授权条款,以 GPL-3.0 协议发布。
本程序为自由软件:你可以依据自由软件基金会发布的 GNU 通用公共许可证(GPL)第 3 版对其再次分发和/或修改。详见仓库根目录的 LICENSE 文件,或访问 https://www.gnu.org/licenses/。
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
Contains code ported from Mineradio (MIT License).
修复
audio.load() 强制重载音频源)优化
src/routes/helpers.ts(去重 5 个函数)trackKey