Bundle
dsh-netease-music
DSH 网页版网易云音乐播放器插件:顶部条常驻迷你播放器 + 展开面板(每日推荐/歌单/私人FM/搜索/队列/历史/设置),扫码登录,内置自动启动 NeteaseCloudMusicApi,支持 AI 对话控制播放。
- Source
- JasonCHTT
- License
- MIT
- Updated
- Updated 12 hours ago
Readme
<div align="right"><b>简体中文</b> | <a href="README.en.md">English</a></div> # dsh-netease-music <p align="center"> <a href="https://github.com/JasonCHTT/dsh-netease-music"><img alt="release" src="https://img.shields.io/github/v/release/JasonCHTT/dsh-netease-music"></a> <img alt="platform" src="https://img.shields.io/badge/platform-DSH%20Web-blueviolet"> <a href="https://github.com/JasonCHTT/dsh-netease-music/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/github/license/JasonCHTT/dsh-netease-music"></a> </p> <p align="center"><b>DeepSeek Harness(DSH)网页版的网易云音乐播放器插件</b></p> <p align="center">常驻顶部条迷你播放器 + 可展开完整面板 · 内置自动启动的 <a href="https://github.com/Binaryify/NeteaseCloudMusicApi">NeteaseCloudMusicApi</a> 本地服务 · 支持 AI 对话控制</p> <p align="center"><span style="font-size:1.5em;font-weight:600">我</span>听说,从前有个木匠,他手里那把刨子磨得锃亮,做起活来便格外顺手。人做事也是一样,手里的家伙什儿顺了,心里便不慌,活计也就做得利落。工作时听歌,就如同给心神添了一副趁手的器具,让繁杂的事务也生出几分轻快来。这并非贪图安逸,而是懂得调适自己的节奏,使精神常驻清明。若按礼法来看,人各掌其事,也各有其养心之法,能让自己安住当下,便不失为本分。这样看来,随身带着乐声劳作,岂不也是一种贤者的智慧?</p> --- ## 截图 <p align="center"><img src="demo.jpg" alt="使用截图" width="720"></p> ## 功能总览 - **顶部条常驻迷你播放器**:封面、歌名 / 歌手、上一首、播放 / 暂停、下一首、播放模式切换、单行滚动歌词 - **展开播放面板**:每日推荐、我的歌单、私人 FM、搜索(歌曲 + 歌单)、播放队列、播放历史、设置 - **完整播放控制**:顺序 / 列表循环 / 单曲循环 / 随机播放,进度条拖动,音量调节,歌词显示 - **断点续播**:自动记住关闭前正在播放的歌曲、歌单与播放位置,重新打开后继续收听 - **扫码登录**:面板内展示二维码,手机网易云音乐 App 扫码确认,登录状态持久化(重启 DSH 不丢) - **AI 控制工具**:注册模型工具 `netease_music`,可直接在对话里控制播放器 ## 安装 ### 环境要求 - DeepSeek Harness(`dsh web`) - Node.js、pnpm(安装依赖用) ### 安装步骤 ```bash # 1. 进入 web profile 目录 cd "$env:USERPROFILE\.dsh\profiles\web" # 2. link 安装本插件(<路径> 替换为插件目录的绝对路径) pnpm add 'link:C:/<路径>/dsh-netease-music' # 3. 安装插件运行时依赖 NeteaseCloudMusicApi pnpm add NeteaseCloudMusicApi # 4. 编辑 profile 的 package.json,在 dsh.profile.bundles 末尾追加 # "dsh-netease-music" ``` 4. 完成后**重启 `dsh web`**(Host 端需要重启进程加载),刷新页面即可在顶部条看到播放器。 > 提示:如果使用 `dsh plugin --profile web add ...` 命令安装,路径中**不能包含空格**(该命令内部拼接命令行时会被截断);上方 pnpm 直装方式没有此限制。 ### 卸载 ```bash cd "$env:USERPROFILE\.dsh\profiles\web" pnpm remove dsh-netease-music NeteaseCloudMusicApi # 若其他插件也在使用 API 包,保留它 # 从 package.json 的 dsh.profile.bundles 中删除 "dsh-netease-music",重启 dsh web ``` ## 使用说明 ### 登录 1. 面板「推荐 / 歌单 / 私人FM」页或「设置 → 账号」中点击 **「扫码登录」** 2. 手机网易云音乐 App 扫码并**确认登录** 3. 登录状态显示在设置页;「退出登录」可注销 ### 播放一首歌 1. 点击顶部条播放器**左侧封面 / 箭头**展开面板(也可用快捷键 `Ctrl+Shift+M`) 2. 切换到 **「搜索」** 页,输入歌名 / 歌手 / 专辑 / 歌单,回车 3. 搜索结果分「歌单」和「歌曲」两个区块展示: - 点歌单 → 进入歌单详情,可「播放全部」或点单曲播放 - 点歌曲(或行尾 ▶ 按钮)→ 直接播放 ### 每日推荐 登录后打开面板 **「推荐」** 页 → 「播放全部」或点击单曲。 ### 我的歌单 面板 **「歌单」** 页 → 显示账号下全部歌单(创建 + 收藏)→ 点击进入详情播放。 ### 私人 FM 面板 **「私人FM」** 页 → 「开始播放」获取专属推荐流 → 「换一批」刷新推荐。 ### 播放控制 | 操作 | 位置 | | --- | --- | | 上一首 / 播放暂停 / 下一首 | 顶部迷你播放器、面板底部播放条 | | 播放模式(顺序 / 列表循环 / 单曲循环 / 随机) | 迷你播放器与面板的模式按钮,点击循环切换 | | 进度拖动 | 面板底部进度条 | | 音量调节 | 面板底部音量滑块(可在设置中隐藏) | | 歌词 | 面板底部滚动歌词框 + 顶部条单行滚动歌词(随行上下滚动、居中、宽度自适应顶栏剩余空间) | | 播放队列 | 面板「队列」页:点击跳转、清空 | | 播放历史 | 面板「历史」页:本机保留最近 50 首 | ### 断点续播 插件会自动记住你关闭页面前的状态,重新打开 `dsh web` 后继续收听: - **记住的内容**:正在播放的歌曲、歌单(播放队列,最多 300 首)、播放位置(播放中每 5 秒自动保存一次)、播放模式 - **恢复方式**:打开页面后自动恢复歌曲与队列,并从上次位置继续播放;若浏览器自动播放策略拦截(新页面首次播放需要一次点击),歌曲会停在原位置并提示,点一下播放按钮即可继续 - **存储位置**:仅保存在本机浏览器 localStorage;清空播放队列后记忆随之清除 ### 设置项 打开面板「设置」页(或 DSH 设置 → 网易云音乐): | 分组 | 项目 | 说明 | | --- | --- | --- | | 显示模块 | 每日推荐页 / 歌单页 / 私人FM页 / 歌词显示 / 播放历史页 / 音量调节 | 勾选即时生效,控制面板页签与控件显隐 | | 播放 | 音质 | 标准 / 高音质 / 极高音质(非 VIP 自动降级为标准) | | 播放 | 播放模式 | 顺序 / 列表循环 / 单曲循环 / 随机 | | 账号 | 状态 / 扫码登录 / 退出登录 | — | | 本地服务 | NeteaseCloudMusicApi 状态、重启按钮 | 默认端口 3000 | ### 用 AI 控制播放 插件注册了模型工具 **`netease_music`**,在对话中直接说即可,例如: - 「帮我播放周杰伦的晴天」 - 「播放每日推荐」「播放我的歌单」「下一首」「暂停」 - 「把音量调到 50%」「切换为随机播放」 工具动作一览: | action | 说明 | | --- | --- | | `search` | 按关键词搜索歌曲,返回结果列表(含歌曲 id) | | `play` | 按 songId 播放一首歌 | | `pause` / `toggle` | 暂停 / 播放暂停切换 | | `next` / `previous` | 下一首 / 上一首 | | `setMode` | 设置播放模式:`sequence` / `loop` / `single` / `shuffle` | | `volume` | 设置音量 0~1 | | `state` | 查询当前播放状态(歌曲 / 模式 / 音量 / 队列) | | `daily` | 播放每日推荐 | | `playlists` | 列出账号歌单(含歌单 id) | | `playPlaylist` | 按 playlistId 播放歌单 | ## 工作原理 - **Host 端**(`lib/index.js`):零第三方 import(仅 Node 内置模块 + `webServer` / `subprocess` / `tools` 服务) - 通过 `webServer` 注册同源路由 `/plugin/netease-music/*`(设置、API 代理、命令队列、状态回报),浏览器端直接 `fetch`,无跨域问题 - 用 `subprocess` 拉起 `NeteaseCloudMusicApi`(默认端口 3000,崩溃自动重启) - 代理全部网易云 API 请求并自动附带登录 Cookie(持久化在 profile 目录,重启登录不丢) - 通过 `tools` 注册 AI 工具 `netease_music` - **Client 端**(`lib/client.js`):自注册浏览器 bundle,HTML5 `<audio>` 播放 - 歌曲地址优先取 `/song/url/v1`(按所选音质自动降级),无地址时回退 `music.163.com/song/media/outer/url` - 每 1.2s 轮询一次 Host 命令队列执行 AI 指令,播放状态回报 Host 供 AI 查询 - **UI 挂载点**:迷你播放器 → `conversation.session.header.actions`(顶部条);面板 → `shell.overlay`(全局浮动层,Portal 到 body);设置页 → `settings.section` ## 项目结构 ``` dsh-netease-music/ ├── package.json # 插件清单(dsh.bundle.patch + dsh.client) ├── cordis.patch.yml # 注入 profile 的 Loader 补丁 ├── lib/ │ ├── index.js # Host 端插件 │ └── client.js # 浏览器端 bundle ├── nm-default-cover.jpg # 未播放时的默认封面图(内嵌于 bundle) ├── demo.jpg # 使用截图 ├── README.md # 中文说明 ├── README.en.md # 英文说明 └── LICENSE ``` ## 常见问题 **Q:需要登录才能用吗?** 搜索、播放、队列、历史不需要登录;每日推荐、私人 FM、我的歌单需要登录。 **Q:登录状态会被别人拿到吗?** 不会。登录 Cookie 只保存在你的本机 profile 目录,且只存在于宿主机进程内部——浏览器端拿到的设置数据已剔除 Cookie 字段,插件路由也只响应本机(loopback)请求。登录状态不会随插件仓库或安装包分发。 **Q:本地 API 服务(默认 3000 端口)可以暴露到公网吗?** 不可以。登录 Cookie 以 URL query 参数形式传给本机 NeteaseCloudMusicApi(上游 API 的设计约束),若把该端口暴露到公共网络,服务器日志与网络抓包都可能残留 Cookie。请保持该服务仅监听本机(127.0.0.1),不要把 3000 端口转发到公网。 **Q:有些歌播放失败?** 无版权或需要单独付费的歌曲无法播放,面板会提示。非 VIP 的高音质 / 极高音质会自动降级为标准音质。 **Q:打开页面第一次点播放没反应?** 浏览器自动播放策略要求页面首次播放必须有一次点击;点击过一次后,AI 下发的播放命令即可正常生效。 **Q:改了代码怎么生效?** 改 `lib/client.js` 刷新页面即可;改 `lib/index.js` 需要重启 `dsh web`。 **Q:本地 API 服务启动很慢或失败?** 首次启动需要十余秒;若端口 3000 被占用,可在设置页重启或在 profile 的插件配置中修改端口。 ## 致谢 - [NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) — 网易云音乐 Node.js API - [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) — 插件宿主框架 ## 许可证 [MIT](LICENSE)
Install
dsh plugin --profile web add github:JasonCHTT/dsh-netease-music#4aab9fd1a5b566730ebc24609208dbd2fa0b1fa4
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-netease-music from the hub