# 单身汉(DSH)播放器 — 架构方案 > 一个运行在 DeepSeek Harness(dsh)内的插件化音乐播放器,具备聚合平台搜索、 > 登录收藏、逐字卡拉OK歌词同步显示等能力。 ## 1. 定位 - **形态**:标准 dsh bundle(npm 包),含「宿主半」+「浏览器半」 - **宿主半**(Node,dsh 进程内):平台 API BFF、音频代理、登录态存储、AI 工具注册 - **浏览器半**(React,注入 dsh Web UI):播放器面板、逐字卡拉OK歌词渲染 - **AI 原生**:DeepSeek 可通过工具直接搜索/播放/控制,对话即点歌 ## 2. 参考项目复用策略(不重复造轮子) | 能力 | 来源 | 方式 | |---|---|---| | 网易云 API | Mineradio → `NeteaseCloudMusicApi` npm 包 | 直接依赖,进程内调用 | | QQ 音乐 API | Mineradio `server.js` 的 fcg 直连+签名 | 抽取改造为 TS 模块 | | 聚合搜索去重打分 | Mineradio `scoreSongSearchResult` | 算法移植 | | LRC/YRC/QRC 解析 | Mineradio `00-lyrics-fetch-parse.js` | 纯函数移植 | | 卡拉OK同步算法 | Mineradio 二分定位+词级插值+词宽测量 | Canvas2D 重写渲染(不搬 Three.js) | | 花再音箱同步 | Mineradio `halo-sync-bridge.js` + 主进程 node-hid;协议同 HaloPixelToolBox | 浏览器半推行变更,宿主半 node-hid 写 HID 包 | | 插件机制/UI插槽 | dsh Cordis + slots 体系 | 原生使用 | ## 3. 目录结构 ``` ├─ package.json # "dsh": { bundle.patch, client } 双半声明 ├─ cordis.patch.yml # 本地开发补丁(insert 插件) ├─ src/ # 宿主半 │ ├─ index.ts # apply(ctx):服务+工具注册 │ ├─ config.ts # Config Schema(端口、音质偏好等) │ ├─ providers/ │ │ ├─ types.ts # Provider 统一接口 │ │ ├─ netease.ts # 搜索/取流/YRC/扫码登录 │ │ ├─ qq.ts # fcg 直连/Cookie 登录/QRC │ │ └─ merge.ts # 聚合搜索合并去重 │ ├─ lyric/parse.ts # LRC/YRC/QRC 解析(纯函数) │ ├─ proxy/audio.ts # /audio 代理:Range + Referer 注入 │ └─ store/auth.ts # 登录态持久化($DSH_HOME 下) ├─ client/ │ ├─ index.tsx # 浏览器半 apply:slots 注入面板 │ ├─ PlayerPanel.tsx # 主面板:封面/控制条/队列/搜索 │ ├─ Karaoke.tsx # Canvas2D 逐字卡拉OK染色 │ └─ engine.ts # HTMLAudio 引擎+播放队列状态机 ``` ## 4. 关键设计 ### 4.1 宿主↔浏览器通信 - 工具调用结果经 session/event SSE 自动到达前端;UI 面板数据走 API Gateway Remote 方法 - 音频一律 `