dsh-feiyufm 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +49 -44
- package/THIRD_PARTY_NOTICES.md +2 -0
- package/bin/fishfm-core.mjs +7 -0
- package/docs/DELIVERY.md +8 -5
- package/node_modules/get-uri/package.json +2 -2
- package/npm-shrinkwrap.json +3 -3
- package/package.json +113 -112
- package/src/dsh-adapter.mjs +14 -3
- package/src/ui/client/controller.mjs +125 -21
- package/src/ui/client/guide.mjs +55 -0
- package/src/ui/client/panel.mjs +55 -14
- package/src/ui/client/styles.mjs +18 -0
- package/src/ui/dsh-client.js +251 -35
- package/src/ui/dsh-settings.mjs +44 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# 更新记录
|
|
2
2
|
|
|
3
|
+
## 0.1.1(2026-11-04)
|
|
4
|
+
|
|
5
|
+
- 修复首次安装时音乐服务启动失败或状态读取异常导致网易云连接持续显示“读取中”;提供明确错误与重试,曲库读取缓慢不阻挡登录入口。
|
|
6
|
+
- 修复迟到的曲库与平台状态应答覆盖导入结果或账号状态;GitHub 源码安装正常解析运行依赖,发行包包含完整依赖树。
|
|
7
|
+
- 新增首次使用轻量引导,帮助连接网易云、导入参考歌曲和开始听歌;已有用户可从电台设置主动打开使用指南。
|
|
8
|
+
- 真实扫码授权、日常 Desktop 播放和重启保持仍需人工验收。
|
|
9
|
+
|
|
3
10
|
## 0.1.0(2026-11-04)
|
|
4
11
|
|
|
5
12
|
- 名称:正式 npm 包改为 `dsh-feiyufm`,产品显示与说明统一为肥鱼电台 FeiyuFM;客户端模块标识随包名同步。旧测试包通过插件管理器更换来源,既有 RPC 和本机数据目录保留兼容。
|
package/README.md
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
<img src="https://raw.githubusercontent.com/A7m0spHere/dsh-feiyuFM/main/assets/readme/hero.svg" width="100%" alt="肥鱼电台 FeiyuFM:给正在工作的 DeepSeek 一副耳机。">
|
|
4
4
|
|
|
5
|
-
**在 DeepSeek Harness(DSH)里,开一间由你掌控的电台。**
|
|
5
|
+
**在 DeepSeek Harness(DSH)里,开一间由你掌控的电台。**
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
导入常听的歌曲,让网易云找来候选,再由模型挑出一批。大肥鱼陪你听歌;点播、暂停、换曲和静音,随时由你决定。
|
|
8
|
+
|
|
9
|
+
**Windows · 网易云 · 0.1.1** [开始使用](#开始使用) · [使用说明](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/DELIVERY.md) · [更新记录](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/CHANGELOG.md)
|
|
8
10
|
|
|
9
11
|
## 电台长什么样
|
|
10
12
|
|
|
@@ -12,95 +14,98 @@
|
|
|
12
14
|
<source media="(prefers-color-scheme: dark) and (max-width: 600px)" srcset="https://raw.githubusercontent.com/A7m0spHere/dsh-feiyuFM/main/assets/readme/panel-narrow-dark.png?v=20261102">
|
|
13
15
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/A7m0spHere/dsh-feiyuFM/main/assets/readme/panel-dark.png?v=20261102">
|
|
14
16
|
<source media="(max-width: 600px)" srcset="https://raw.githubusercontent.com/A7m0spHere/dsh-feiyuFM/main/assets/readme/panel-narrow.png?v=20261102">
|
|
15
|
-
<img src="https://raw.githubusercontent.com/A7m0spHere/dsh-feiyuFM/main/assets/readme/panel.png?v=20261102" width="100%" alt="
|
|
17
|
+
<img src="https://raw.githubusercontent.com/A7m0spHere/dsh-feiyuFM/main/assets/readme/panel.png?v=20261102" width="100%" alt="肥鱼电台主面板:大肥鱼与当前歌曲并列,下方是可选歌曲池和播放控制。">
|
|
16
18
|
</picture>
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
主面板采用陪伴电台布局:大肥鱼与当前歌曲并列,下方是整个可选歌曲池,播放控制在面板底部常驻。顶部四个页面——正在听、发现记录、偏好与反馈、电台设置——共用一个音乐服务,切换页面不会中断播放;可隐藏的悬浮条也共用同一服务。界面支持浅色、深色和减少动态效果,工作区左缘还可选 ASCII 频谱背景。
|
|
20
|
+
截图取自 2026-11-02 的隔离预览,歌曲、账号状态与模型结果均为模拟数据。
|
|
21
21
|
|
|
22
22
|
## 开始使用
|
|
23
23
|
|
|
24
24
|
在 DSH「插件 → 添加插件」的「包名或地址」中输入:
|
|
25
25
|
|
|
26
26
|
```text
|
|
27
|
-
dsh-feiyufm@0.1.
|
|
27
|
+
dsh-feiyufm@0.1.1
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
安装后点击「立即启用」,然后:
|
|
31
31
|
|
|
32
32
|
1. 打开侧栏「肥鱼电台」,在「电台设置」里用网易云 App 扫码登录。
|
|
33
|
-
2.
|
|
34
|
-
3.
|
|
35
|
-
|
|
36
|
-
跟随正式版可安装 `dsh-feiyufm@latest`。升级时在插件管理器卸载旧来源、添加新版,保留同一 profile 的音乐数据库;后端更新后完整退出 DSH(含托盘)再启动。同一 profile 只启用一份 FeiyuFM。
|
|
37
|
-
|
|
38
|
-
旧测试包名为 `dsh-feiyufm-core`;升级时先移除该旧来源,再安装 `dsh-feiyufm`。已有音乐数据沿用原目录,无需删除数据库或重新建立偏好。
|
|
39
|
-
|
|
40
|
-
> `0.1.0` 包含陪伴界面、设置标签页、ASCII 频谱、持续补歌和播放延迟优化。源码安装见 [贡献指南](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/CONTRIBUTING.md)。
|
|
33
|
+
2. 导入近期播放、喜欢的歌曲或指定歌单,作为参考歌曲。
|
|
34
|
+
3. 使用 DSH 已配置的模型挑歌,或者直接从输入曲库点播。没有配置模型也可以手动听歌。
|
|
41
35
|
|
|
42
36
|
<details>
|
|
43
37
|
<summary>通过 DSH CLI 安装</summary>
|
|
44
38
|
|
|
45
|
-
以 Web profile
|
|
39
|
+
以 Web profile 为例,将 `web` 换成实际使用的 profile:
|
|
46
40
|
|
|
47
41
|
```sh
|
|
48
|
-
dsh plugin --profile web add dsh-feiyufm@0.1.
|
|
42
|
+
dsh plugin --profile web add dsh-feiyufm@0.1.1 --registry https://registry.npmjs.org/
|
|
49
43
|
```
|
|
50
44
|
|
|
51
|
-
|
|
45
|
+
安装后重启该实例。单独运行 `npm install` 不会完成 DSH 插件注册和启用。
|
|
52
46
|
|
|
53
47
|
</details>
|
|
54
48
|
|
|
55
|
-
|
|
49
|
+
<details>
|
|
50
|
+
<summary>从旧版本升级</summary>
|
|
51
|
+
|
|
52
|
+
跟随正式版可安装 `dsh-feiyufm@latest`。如果安装过旧测试包 `dsh-feiyufm-core`,先在插件管理器移除旧来源,再添加新包;同一 profile 只启用一份肥鱼电台。
|
|
56
53
|
|
|
57
|
-
|
|
54
|
+
升级时保留同一 profile 的音乐数据库。后端更新后,从托盘完整退出 DSH,再重新启动。
|
|
58
55
|
|
|
59
|
-
|
|
56
|
+
</details>
|
|
60
57
|
|
|
61
|
-
|
|
58
|
+
## 电台怎样选歌
|
|
62
59
|
|
|
63
|
-
|
|
60
|
+
**参考歌曲 → 网易云找歌 → 模型挑歌 → 本地播放**
|
|
64
61
|
|
|
65
|
-
|
|
62
|
+
网易云提供相似歌曲、每日推荐等候选;模型结合参考歌曲和反馈挑选,并给出简短理由。自动续播只从入选歌曲中选择,逐曲播放和「下一首」不请求模型。
|
|
66
63
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
64
|
+
电台会在可播歌曲不足时按预算补充。自动续播、普通下一首和推荐队列避开最近 50 次实际开始的歌曲;歌曲不足时等待补充。手动点播和历史导航仍可重播。
|
|
65
|
+
|
|
66
|
+
模型根据歌曲信息和反馈选歌,当前不理解音频内容;歌曲能否播放取决于网易云账号权限和资源状态。
|
|
67
|
+
|
|
68
|
+
<details>
|
|
69
|
+
<summary>补歌和模型预算</summary>
|
|
70
|
+
|
|
71
|
+
窗口外可播余量降到 12 首时开始补充,达到 24 首时停止。初始共享日预算为 100000 tokens,可在设置中调整;筛选没有固定每日次数或成功冷却,相同候选和已评审的偏好不会重复请求。详细规则见 [控制契约](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/CORE_CONTRACT.md)。
|
|
72
|
+
|
|
73
|
+
</details>
|
|
74
|
+
|
|
75
|
+
## 听歌时可以做什么
|
|
76
|
+
|
|
77
|
+
- **控制播放:** 点播、暂停、上一首或下一首;自动事件不会撤销你主动暂停的状态。
|
|
78
|
+
- **调整偏好:** 用「喜欢/少推荐」影响后续挑歌,也可以撤销;不会修改网易云收藏。
|
|
79
|
+
- **切换页面:** 正在听、发现记录、偏好与反馈、电台设置共用音乐服务;切页或隐藏悬浮条后继续播放。
|
|
80
|
+
- **选择听歌方式:** 日常、专注、静听和关闭四种模式;静听关闭电脑声音,仍记录有效经历。「今天停止」可随时手动恢复。
|
|
81
|
+
- **调整画面:** 切换浅色/深色和动态效果,或开启工作区左缘的 ASCII 频谱;频谱是模拟动画。角色区的小开关可以切换 doll 彩蛋,默认关闭。
|
|
77
82
|
|
|
78
83
|
<details>
|
|
79
84
|
<summary>没有声音,或暂时不能补充歌单?</summary>
|
|
80
85
|
|
|
81
86
|
- **没有声音:** 检查声音开关、静听模式、暂停状态,以及系统音量和输出设备。首次播放可能等待数秒。
|
|
82
|
-
- **不能补充歌单:**
|
|
83
|
-
- **升级后没有变化:**
|
|
87
|
+
- **不能补充歌单:** 当前任务、预算或平台节流可能限制请求;等待期间仍可点播、暂停或换曲。
|
|
88
|
+
- **升级后没有变化:** 从托盘完整退出 DSH 再启动;升级不需要删除音乐数据库。
|
|
84
89
|
|
|
85
90
|
更多排查方法见 [使用说明](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/DELIVERY.md#常见问题)。
|
|
86
91
|
|
|
87
92
|
</details>
|
|
88
93
|
|
|
89
|
-
##
|
|
94
|
+
## 支持范围
|
|
90
95
|
|
|
91
|
-
| 项目 |
|
|
96
|
+
| 项目 | 当前范围 |
|
|
92
97
|
| --- | --- |
|
|
93
|
-
| Windows + 网易云 | `0.1.0
|
|
98
|
+
| Windows + 网易云 | `0.1.1`;历史安装包和隔离宿主验证见 [0.1.0 发布记录](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/releases/0.1.0.md),0.1.1 的日常 Desktop 验收待完成 |
|
|
94
99
|
| DSH / Node.js | 本机隔离验证 DSH `0.2.1-rc.5`;Node `>=24.14.0 <25`,桌面宿主自带兼容版本时无需另装 |
|
|
95
|
-
| macOS |
|
|
100
|
+
| macOS | 实验性适配随包提供;真实登录、音频与退出生命周期待真机验收 |
|
|
96
101
|
| QQ 音乐 | 接入暂缓,当前没有可用登录与播放链路 |
|
|
97
102
|
|
|
98
|
-
|
|
103
|
+
长期体验、平台与宿主组合的未验项见 [开发状态](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/PROJECT_PLAN.md)。
|
|
99
104
|
|
|
100
105
|
## 数据与开发
|
|
101
106
|
|
|
102
|
-
曲库、偏好、反馈、收听历史和用量账本保存在本机,默认位于 `$DSH_HOME/fishfm/music.sqlite
|
|
107
|
+
曲库、偏好、反馈、收听历史和用量账本保存在本机,默认位于 `$DSH_HOME/fishfm/music.sqlite`。网易云会话由 Windows DPAPI 或 macOS Keychain 保存,数据库只保存凭据引用。模型接收有界的音乐事实,不接收 Cookie 或凭据。详见 [架构](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/ARCHITECTURE.md) 和 [控制契约](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/CORE_CONTRACT.md)。
|
|
103
108
|
|
|
104
|
-
[参与开发与源码安装](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/CONTRIBUTING.md) · [
|
|
109
|
+
[参与开发与源码安装](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/CONTRIBUTING.md) · [文档索引](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/README.md) · [反馈问题](https://github.com/A7m0spHere/dsh-feiyuFM/issues)
|
|
105
110
|
|
|
106
111
|
鲸鱼娘(大肥鱼)形象由 **@ZipZipPipe** 基于 **上善无形** 的原创角色进行二次设计。来源与完整版权说明见 [版权声明](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/THIRD_PARTY_NOTICES.md)。
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -187,6 +187,8 @@ SOFTWARE.
|
|
|
187
187
|
|
|
188
188
|
npm 包封装 `npm-shrinkwrap.json` 锁定的运行依赖,保留各依赖原有源码、版权与许可文件。下表列出安装包内的位置;这些 `node_modules/` 路径用于本机安装副本,不是 GitHub 源码目录。依赖声明与本文件中的补充原文共同适用,不能只读取 npm 的 `license` 字段。
|
|
189
189
|
|
|
190
|
+
发行打包对 `get-uri@6.0.5`(MIT,来源为锁文件记录的 npm 包)的 `package.json` 做一处元数据修订:将 `basic-ftp` 声明从 `^5.0.2` 同步为本项目既有 override `6.2.2`,并同步发行树内部的 shrinkwrap 声明。消费端不会继承依赖包的顶层 overrides,这一同步使声明与实际封装的替换版本一致。修改只发生在临时发行树,不修改工作区依赖;`get-uri`/`basic-ftp` 的 JavaScript、包版本和许可原文保持原样,整包摘要覆盖该修订。
|
|
191
|
+
|
|
190
192
|
`node-forge` 采用其双许可中的 BSD-3-Clause 选项。`node-windows@1.0.0-beta.8` 还携带 Sudowin(BSD-3-Clause,随包原文 `node_modules/node-windows/bin/sudowin/LICENSE.txt`)与 WinSW(MIT,补充原文见下文),顶层 MIT 不覆盖这些工具的独立通知。
|
|
191
193
|
|
|
192
194
|
### LGPL-3.0-only:@unblockneteasemusic/server
|
package/bin/fishfm-core.mjs
CHANGED
|
@@ -76,6 +76,13 @@ try {
|
|
|
76
76
|
...(store ? { store, providerRegistry, platformsFacade } : {}),
|
|
77
77
|
onLog,
|
|
78
78
|
});
|
|
79
|
+
} catch (error) {
|
|
80
|
+
// Report startup failures through the protocol before exiting. Never forward
|
|
81
|
+
// the exception message/stack: dependencies and credentials may include paths.
|
|
82
|
+
const code = ['MODULE_NOT_FOUND', 'ERR_MODULE_NOT_FOUND'].includes(error?.code) ? 'dependency_missing' : 'core_start_failed';
|
|
83
|
+
process.stdout.write(`${JSON.stringify({ type: 'startup-error', error: { code } })}\n`);
|
|
84
|
+
process.stderr.write(`fishfm-core: startup failed (${code})\n`);
|
|
85
|
+
process.exitCode = 1;
|
|
79
86
|
} finally {
|
|
80
87
|
evidence.close();
|
|
81
88
|
store?.close();
|
package/docs/DELIVERY.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 交付与使用说明
|
|
2
2
|
|
|
3
|
-
更新:2026-11-04,发行基线为 **0.1.
|
|
3
|
+
更新:2026-11-04,发行基线为 **0.1.1**,首发范围为 Windows/网易云。包含陪伴界面、四个标签页、ASCII 频谱、持续补歌与播放延迟优化。macOS 适配随包提供,真机验收未完成;QQ 暂缓。版本范围与摘要见 [0.1.0 发布记录](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/releases/0.1.0.md),完整产品验收及长期体验缺口仍在 [开发状态](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/docs/PROJECT_PLAN.md) 保留。
|
|
4
4
|
|
|
5
5
|
## 支持范围
|
|
6
6
|
|
|
@@ -16,9 +16,11 @@
|
|
|
16
16
|
|
|
17
17
|
## 安装
|
|
18
18
|
|
|
19
|
-
FeiyuFM 以 npm 包分发,通过 DSH 安装到当前 profile。在侧栏「插件 → 添加插件」的「包名或地址」中输入 `dsh-feiyufm@0.1.
|
|
19
|
+
FeiyuFM 以 npm 包分发,通过 DSH 安装到当前 profile。在侧栏「插件 → 添加插件」的「包名或地址」中输入 `dsh-feiyufm@0.1.1`,安装完成后点击「立即启用」;跟随正式版更新用 `dsh-feiyufm@latest`。下载失败可切换「安装源 → npm 官方源」。DSH 会安装 bundle、读取 patch 并登记插件,无需手改 profile;单独 `npm install` 不会完成这一步。机制见 [DSH 官方安装说明](https://deepseek-harness.github.io/deepseek-harness/en/develop/basic/publish)。
|
|
20
20
|
|
|
21
|
-
已安装 DSH CLI 的用户可通过 `dsh plugin --profile web add dsh-feiyufm@0.1.
|
|
21
|
+
已安装 DSH CLI 的用户可通过 `dsh plugin --profile web add dsh-feiyufm@0.1.1 --registry https://registry.npmjs.org/` 安装到 Web profile;`web` 要对应实际启动的 profile,安装后重启该实例。桌面版使用上述应用内入口。
|
|
22
|
+
|
|
23
|
+
也可通过 GitHub 源码安装:在「包名或地址」输入 `https://github.com/A7m0spHere/dsh-feiyuFM`,从 `main` 安装;需要固定验收代码时可使用 `github:A7m0spHere/dsh-feiyuFM#<完整提交号>`。记录 profile 锁文件实际解析的提交号。GitHub 源码安装会解析普通运行依赖;npm `0.1.1` 包含登录修复与首次引导。安装后从托盘完整退出并重开,按 [人工验收卡](spikes/P0-07-desktop-checklist.md) 验证,保留现有数据与凭据。
|
|
22
24
|
|
|
23
25
|
Windows 的隔离宿主验证使用 DSH `0.2.1-rc.5`;桌面宿主自带兼容 Node 24 时无需单独安装 Node。macOS 实验性适配要求 Xcode Command Line Tools 提供 `/usr/bin/swiftc`,首次启动原生后端时会编译 Helper 到 DSH 私有数据目录。这不代表 macOS 真机验收完成。
|
|
24
26
|
|
|
@@ -32,9 +34,9 @@ dsh plugin --profile desktop add /absolute/path/to/dsh-feiyuFM
|
|
|
32
34
|
|
|
33
35
|
打开侧栏「肥鱼电台」,在音乐平台卡片扫码、手机确认,再导入歌曲;当前源码的登录入口在「电台设置」标签页。模型是可选功能,使用用户自己的 DSH 配置;没有模型可点播输入歌曲。
|
|
34
36
|
|
|
35
|
-
已有 workspace 安装请经插件管理器更换来源,不在同一 profile 同时启用两份 FeiyuFM。仓库开发步骤在 [贡献指南](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/CONTRIBUTING.md)
|
|
37
|
+
已有 workspace 安装请经插件管理器更换来源,不在同一 profile 同时启用两份 FeiyuFM。仓库开发步骤在 [贡献指南](https://github.com/A7m0spHere/dsh-feiyuFM/blob/main/CONTRIBUTING.md)。npm 发行包包含运行依赖树、源码与各自许可,安装不需重新解析这些依赖。
|
|
36
38
|
|
|
37
|
-
从旧测试包 `dsh-feiyufm-core` 升级时,先在插件管理器移除旧来源,再添加 `dsh-feiyufm@0.1.
|
|
39
|
+
从旧测试包 `dsh-feiyufm-core` 升级时,先在插件管理器移除旧来源,再添加 `dsh-feiyufm@0.1.1`。内部 RPC 标识和 `$DSH_HOME/fishfm/` 数据目录保持兼容,已有曲库、偏好与凭据引用继续使用;不要同时启用两个包来源。
|
|
38
40
|
|
|
39
41
|
## 首次听歌
|
|
40
42
|
|
|
@@ -74,6 +76,7 @@ DSH `0.2.0-rc.2` 的插件页暂不支持自动更新。先在插件管理器卸
|
|
|
74
76
|
- **已保存会话却不能导入:** 会话可能过期,查看错误阶段并重新登录;加密文件存在不代表账号有效。
|
|
75
77
|
- **有歌名却不能播放:** 歌名来自网易云候选,但播放仍可能受会员、版权或地址失效限制;以实际错误为准。
|
|
76
78
|
- **没有声音:** 先查看声音开关、静听模式和暂停状态,再检查系统音量及输出设备。日常 / 专注模式会恢复声音。
|
|
79
|
+
- **网易云连接一直“读取中”或提示运行依赖缺失:** 0.1.0 的 GitHub 源码安装可能缺少网易云运行依赖。通过 DSH 插件管理器将同一 profile 的来源更换为 npm `dsh-feiyufm@0.1.1`,确保只启用一份,再从托盘完整退出并重开 DSH;保留 `$DSH_HOME/fishfm` 下的数据与凭据,不要清库。0.1.1 会显示读取失败及重试入口;已发布的 0.1.0 不包含该提示修复。
|
|
77
80
|
- **没有候选:** 检查输入曲库、歌单核对结果与探索池状态,必要时补充歌单或点播曲库歌曲;当前源码在最近 50 次窗口内没有窗口外可播歌曲时会等待补批。
|
|
78
81
|
- **不能补充歌单:** 当前任务、预算或平台节流可能限制请求;余量不足时后台也会自动补充,等待期间仍可点播、暂停或换曲。
|
|
79
82
|
- **源码改动没有生效:** UI 修改后运行 `npm run build:client` 或 `npm run build`,再刷新界面。官方桌面版会缓存后端模块;后端或资源路由更新需从托盘完整退出 DSH 再启动,只关窗口、刷新页面或停用再启用插件不足以清除缓存。已发布 npm 安装不会自动取得尚未发布的源码改动。
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"tsconfig": "0.0.0"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"basic-ftp": "
|
|
45
|
+
"basic-ftp": "6.2.2",
|
|
46
46
|
"data-uri-to-buffer": "^6.0.2",
|
|
47
47
|
"debug": "^4.3.4"
|
|
48
48
|
},
|
|
@@ -55,4 +55,4 @@
|
|
|
55
55
|
"lint": "eslint . --ext .ts",
|
|
56
56
|
"pack": "node ../../scripts/pack.mjs"
|
|
57
57
|
}
|
|
58
|
-
}
|
|
58
|
+
}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-feiyufm",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "dsh-feiyufm",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.1",
|
|
10
10
|
"license": "SEE LICENSE IN THIRD_PARTY_NOTICES.md",
|
|
11
11
|
"os": [
|
|
12
12
|
"darwin",
|
|
@@ -1664,7 +1664,7 @@
|
|
|
1664
1664
|
"integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
|
|
1665
1665
|
"license": "MIT",
|
|
1666
1666
|
"dependencies": {
|
|
1667
|
-
"basic-ftp": "
|
|
1667
|
+
"basic-ftp": "6.2.2",
|
|
1668
1668
|
"data-uri-to-buffer": "^6.0.2",
|
|
1669
1669
|
"debug": "^4.3.4"
|
|
1670
1670
|
},
|
package/package.json
CHANGED
|
@@ -1,112 +1,113 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dsh-feiyufm",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"type": "module",
|
|
5
|
-
"description": "肥鱼电台 FeiyuFM:DSH 社区音乐插件,从参考歌曲出发,由网易云推荐、模型筛选,再自主听歌。",
|
|
6
|
-
"license": "SEE LICENSE IN THIRD_PARTY_NOTICES.md",
|
|
7
|
-
"os": [
|
|
8
|
-
"darwin",
|
|
9
|
-
"win32"
|
|
10
|
-
],
|
|
11
|
-
"files": [
|
|
12
|
-
"index.js",
|
|
13
|
-
"cordis.patch.yml",
|
|
14
|
-
"bin/fishfm-core.mjs",
|
|
15
|
-
"src/**/*.mjs",
|
|
16
|
-
"src/ui/dsh-client.js",
|
|
17
|
-
"src/playback/host/macos-host-launcher.mjs",
|
|
18
|
-
"src/playback/host/fishfm-macos-host.swift",
|
|
19
|
-
"src/playback/host/wpf-media-host.ps1",
|
|
20
|
-
"src/providers/dpapi-helper.ps1",
|
|
21
|
-
"src/ui/assets/whale-idle.png",
|
|
22
|
-
"src/ui/assets/whale-listening.png",
|
|
23
|
-
"src/ui/assets/whale-dj.png",
|
|
24
|
-
"src/ui/assets/whale-pot-dance.gif",
|
|
25
|
-
"src/ui/assets/whale-pot-still.png",
|
|
26
|
-
"src/ui/assets/dolls/*.png",
|
|
27
|
-
"THIRD_PARTY_NOTICES.md",
|
|
28
|
-
"assets/readme/",
|
|
29
|
-
"npm-shrinkwrap.json",
|
|
30
|
-
"docs/DELIVERY.md",
|
|
31
|
-
"CHANGELOG.md"
|
|
32
|
-
],
|
|
33
|
-
"publishConfig": {
|
|
34
|
-
"registry": "https://registry.npmjs.org/",
|
|
35
|
-
"access": "public",
|
|
36
|
-
"tag": "latest"
|
|
37
|
-
},
|
|
38
|
-
"repository": {
|
|
39
|
-
"type": "git",
|
|
40
|
-
"url": "git+https://github.com/A7m0spHere/dsh-feiyuFM.git"
|
|
41
|
-
},
|
|
42
|
-
"homepage": "https://github.com/A7m0spHere/dsh-feiyuFM#readme",
|
|
43
|
-
"bugs": {
|
|
44
|
-
"url": "https://github.com/A7m0spHere/dsh-feiyuFM/issues"
|
|
45
|
-
},
|
|
46
|
-
"keywords": [
|
|
47
|
-
"feiyufm",
|
|
48
|
-
"deepseek",
|
|
49
|
-
"deepseek-harness",
|
|
50
|
-
"music",
|
|
51
|
-
"netease",
|
|
52
|
-
"dsh-plugin"
|
|
53
|
-
],
|
|
54
|
-
"engines": {
|
|
55
|
-
"node": ">=24.14.0 <25"
|
|
56
|
-
},
|
|
57
|
-
"exports": {
|
|
58
|
-
".": "./index.js",
|
|
59
|
-
"./client": "./src/ui/dsh-client.js",
|
|
60
|
-
"./package.json": "./package.json"
|
|
61
|
-
},
|
|
62
|
-
"dsh": {
|
|
63
|
-
"client": {
|
|
64
|
-
"platform": "web",
|
|
65
|
-
"inject": [
|
|
66
|
-
"@deepseek-ai/dsh-client-connection",
|
|
67
|
-
"@deepseek-ai/dsh-client-ui-layout",
|
|
68
|
-
"@deepseek-ai/dsh-client-ui-sidebar"
|
|
69
|
-
],
|
|
70
|
-
"external": [
|
|
71
|
-
"react"
|
|
72
|
-
]
|
|
73
|
-
},
|
|
74
|
-
"bundle": {
|
|
75
|
-
"patch": "./cordis.patch.yml"
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
"meta": {
|
|
79
|
-
"title": "肥鱼电台 FeiyuFM",
|
|
80
|
-
"description": "给正在 DSH 里工作的 DeepSeek 一副耳机:本地选歌、独立的播放服务,用户始终保留控制权。"
|
|
81
|
-
},
|
|
82
|
-
"scripts": {
|
|
83
|
-
"prepack": "npm run build:client && node scripts/dependency-notices.mjs && npm run check",
|
|
84
|
-
"prepublishOnly": "
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"build
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
"
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
"
|
|
111
|
-
|
|
112
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-feiyufm",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "肥鱼电台 FeiyuFM:DSH 社区音乐插件,从参考歌曲出发,由网易云推荐、模型筛选,再自主听歌。",
|
|
6
|
+
"license": "SEE LICENSE IN THIRD_PARTY_NOTICES.md",
|
|
7
|
+
"os": [
|
|
8
|
+
"darwin",
|
|
9
|
+
"win32"
|
|
10
|
+
],
|
|
11
|
+
"files": [
|
|
12
|
+
"index.js",
|
|
13
|
+
"cordis.patch.yml",
|
|
14
|
+
"bin/fishfm-core.mjs",
|
|
15
|
+
"src/**/*.mjs",
|
|
16
|
+
"src/ui/dsh-client.js",
|
|
17
|
+
"src/playback/host/macos-host-launcher.mjs",
|
|
18
|
+
"src/playback/host/fishfm-macos-host.swift",
|
|
19
|
+
"src/playback/host/wpf-media-host.ps1",
|
|
20
|
+
"src/providers/dpapi-helper.ps1",
|
|
21
|
+
"src/ui/assets/whale-idle.png",
|
|
22
|
+
"src/ui/assets/whale-listening.png",
|
|
23
|
+
"src/ui/assets/whale-dj.png",
|
|
24
|
+
"src/ui/assets/whale-pot-dance.gif",
|
|
25
|
+
"src/ui/assets/whale-pot-still.png",
|
|
26
|
+
"src/ui/assets/dolls/*.png",
|
|
27
|
+
"THIRD_PARTY_NOTICES.md",
|
|
28
|
+
"assets/readme/",
|
|
29
|
+
"npm-shrinkwrap.json",
|
|
30
|
+
"docs/DELIVERY.md",
|
|
31
|
+
"CHANGELOG.md"
|
|
32
|
+
],
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"registry": "https://registry.npmjs.org/",
|
|
35
|
+
"access": "public",
|
|
36
|
+
"tag": "latest"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/A7m0spHere/dsh-feiyuFM.git"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/A7m0spHere/dsh-feiyuFM#readme",
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/A7m0spHere/dsh-feiyuFM/issues"
|
|
45
|
+
},
|
|
46
|
+
"keywords": [
|
|
47
|
+
"feiyufm",
|
|
48
|
+
"deepseek",
|
|
49
|
+
"deepseek-harness",
|
|
50
|
+
"music",
|
|
51
|
+
"netease",
|
|
52
|
+
"dsh-plugin"
|
|
53
|
+
],
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=24.14.0 <25"
|
|
56
|
+
},
|
|
57
|
+
"exports": {
|
|
58
|
+
".": "./index.js",
|
|
59
|
+
"./client": "./src/ui/dsh-client.js",
|
|
60
|
+
"./package.json": "./package.json"
|
|
61
|
+
},
|
|
62
|
+
"dsh": {
|
|
63
|
+
"client": {
|
|
64
|
+
"platform": "web",
|
|
65
|
+
"inject": [
|
|
66
|
+
"@deepseek-ai/dsh-client-connection",
|
|
67
|
+
"@deepseek-ai/dsh-client-ui-layout",
|
|
68
|
+
"@deepseek-ai/dsh-client-ui-sidebar"
|
|
69
|
+
],
|
|
70
|
+
"external": [
|
|
71
|
+
"react"
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
"bundle": {
|
|
75
|
+
"patch": "./cordis.patch.yml"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"meta": {
|
|
79
|
+
"title": "肥鱼电台 FeiyuFM",
|
|
80
|
+
"description": "给正在 DSH 里工作的 DeepSeek 一副耳机:本地选歌、独立的播放服务,用户始终保留控制权。"
|
|
81
|
+
},
|
|
82
|
+
"scripts": {
|
|
83
|
+
"prepack": "npm run build:client && node scripts/dependency-notices.mjs && npm run check",
|
|
84
|
+
"prepublishOnly": "node scripts/pack-release.mjs --reject-source-publish",
|
|
85
|
+
"pack:release": "npm run prepack && node scripts/pack-release.mjs",
|
|
86
|
+
"verify:package": "node scripts/verify-package.mjs",
|
|
87
|
+
"check": "node scripts/check.mjs",
|
|
88
|
+
"test": "node --test --test-timeout=30000",
|
|
89
|
+
"build": "node scripts/build.mjs",
|
|
90
|
+
"build:client": "node scripts/build-client.mjs",
|
|
91
|
+
"preview:ui": "node scripts/ui-preview.mjs",
|
|
92
|
+
"debug": "node bin/fishfm-debug.mjs",
|
|
93
|
+
"core": "node bin/fishfm-core.mjs",
|
|
94
|
+
"login": "node scripts/login.mjs",
|
|
95
|
+
"soak": "node scripts/soak.mjs",
|
|
96
|
+
"observe:runtime": "node scripts/observe-runtime.mjs",
|
|
97
|
+
"verify:lifecycle": "node scripts/verify-lifecycle.mjs",
|
|
98
|
+
"audit:acceptance": "node scripts/audit-acceptance.mjs",
|
|
99
|
+
"research": "node scripts/recommendation-research.mjs",
|
|
100
|
+
"smoke:playback": "node scripts/playback-smoke.mjs"
|
|
101
|
+
},
|
|
102
|
+
"dependencies": {
|
|
103
|
+
"@neteasecloudmusicapienhanced/api": "4.40.1",
|
|
104
|
+
"qrcode": "^1.5.4"
|
|
105
|
+
},
|
|
106
|
+
"overrides": {
|
|
107
|
+
"basic-ftp": "6.2.2"
|
|
108
|
+
},
|
|
109
|
+
"bundleDependencies": [
|
|
110
|
+
"@neteasecloudmusicapienhanced/api",
|
|
111
|
+
"qrcode"
|
|
112
|
+
]
|
|
113
|
+
}
|
package/src/dsh-adapter.mjs
CHANGED
|
@@ -112,7 +112,7 @@ export class CoreBridge {
|
|
|
112
112
|
this._failChild = fail;
|
|
113
113
|
const timer = setTimeout(() => {
|
|
114
114
|
if (settled) return;
|
|
115
|
-
fail(new Error('
|
|
115
|
+
fail(Object.assign(new Error('音乐服务启动超时,请重试。'), { code: 'core_start_timeout', retryable: true }));
|
|
116
116
|
try { child.kill(); } catch { /* Already gone. */ }
|
|
117
117
|
}, this.requestTimeoutMs);
|
|
118
118
|
|
|
@@ -135,7 +135,7 @@ export class CoreBridge {
|
|
|
135
135
|
if (this.child !== child) return;
|
|
136
136
|
this.exitInfo = { code };
|
|
137
137
|
this._log({ type: 'core-exit', code });
|
|
138
|
-
fail(new Error(`The music core exited ${settled ? '' : 'during startup '}with code ${String(code)}`));
|
|
138
|
+
fail(Object.assign(new Error(`The music core exited ${settled ? '' : 'during startup '}with code ${String(code)}`), { code: 'core_exited', retryable: true }));
|
|
139
139
|
});
|
|
140
140
|
|
|
141
141
|
this._onReady = (message) => {
|
|
@@ -175,6 +175,17 @@ export class CoreBridge {
|
|
|
175
175
|
|
|
176
176
|
_dispatch(message) {
|
|
177
177
|
if (!message || typeof message !== 'object' || Array.isArray(message)) return;
|
|
178
|
+
if (message.type === 'startup-error') {
|
|
179
|
+
const child = this.child;
|
|
180
|
+
const missing = message.error?.code === 'dependency_missing';
|
|
181
|
+
const error = Object.assign(new Error(missing
|
|
182
|
+
? '网易云运行依赖缺失,请通过 DSH 插件管理器重新安装 npm 正式包 dsh-feiyufm,完整退出后重开 DSH。'
|
|
183
|
+
: '音乐服务启动失败,请重试或检查安装。'), { code: missing ? 'dependency_missing' : 'core_start_failed', retryable: true });
|
|
184
|
+
this._log({ type: 'initialization', phase: 'core-start', status: 'error', code: error.code });
|
|
185
|
+
this._failChild?.(error);
|
|
186
|
+
try { child?.kill(); } catch { /* already exiting */ }
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
178
189
|
if (message.type === 'ready') {
|
|
179
190
|
this._onReady?.(message);
|
|
180
191
|
return;
|
|
@@ -236,7 +247,7 @@ export class CoreBridge {
|
|
|
236
247
|
const resolveRequest = finish(resolve);
|
|
237
248
|
timer = setTimeout(() => {
|
|
238
249
|
this.pending.delete(id);
|
|
239
|
-
rejectRequest(new Error(`The music core did not answer ${String(message.type)} in time`));
|
|
250
|
+
rejectRequest(Object.assign(new Error(`The music core did not answer ${String(message.type)} in time`), { code: 'core_request_timeout', retryable: true }));
|
|
240
251
|
}, timeoutMs);
|
|
241
252
|
this.pending.set(id, { resolve: resolveRequest, reject: rejectRequest, timer });
|
|
242
253
|
if (abortable) {
|