dsh-music-player 0.7.3 → 0.8.0

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/README.md CHANGED
@@ -6,18 +6,19 @@ DeepSeek Harness 音乐/小说播放插件。
6
6
 
7
7
  写代码写累了、想摸鱼又不想切窗口?这个插件就是你的**摸鱼神器**——直接在 DeepSeek Harness 的网页里塞进一个 **DSH音乐播放器**:扫一下你电脑上的音乐目录(默认 `~/Music`)就能在浏览器里听歌,带播放条和可拖拽的播放面板,还能自己建歌单。
8
8
 
9
- 光听歌还不够,它还能**听书**:把本地 `.txt`/`.epub` 小说丢给 AI 朗读,想听哪章点哪章、声音随便挑。最绝的是它还注册了 `music_play` 模型工具——你连鼠标都不用动,在对话框里跟 agent 说句「播放周杰伦的歌」,音乐分分钟响起来,摸鱼摸出新境界。
9
+ 光听歌还不够,它还能**听书**:把本地 `.txt`/`.epub` 小说丢给 AI 朗读,想听哪章点哪章、声音随便挑。现在还能**听新闻**:让 agent 用联网搜索收集当天头条(热点/国内/国际/科技/财经/体育/娱乐,或 AI 等任意自定义主题),整理筛选成口播稿用 AI 声音播报——支持每日多班次定时、静默收集、文字版阅读。最绝的是它注册了 `music_play` 等模型工具——你连鼠标都不用动,在对话框里跟 agent 说句「播放周杰伦的歌」,音乐分分钟响起来,摸鱼摸出新境界。
10
10
 
11
11
  ## 特性
12
12
 
13
13
  - 本地音频流式播放,刷新后断点续播
14
14
  - 顺序播放、单曲循环、乱序播放三种模式
15
15
  - 实时频谱可视化,两种样式可在「系统配置」切换(默认柱状图):**柱状图**与**波形图**(示波器式连续曲线,按低/中/高频分成三条层次线)
16
- - **实时歌词/字幕**:本地歌曲自动显示同步歌词(无本地 `.lrc` 时自动在线匹配);在线 QQ 歌曲显示官方歌词(外语歌带逐句翻译);AI 讲书时显示当前朗读句子。**单击播放条歌词**可打开完整歌词/字幕面板(标识当前进度、可拖动/拉伸、位置独立记忆),面板默认开启**透明模式**——歌词像直接悬浮在页面上,可在「系统配置」关闭
16
+ - **实时歌词/字幕**:本地歌曲自动显示同步歌词——优先读取文件**内嵌歌词**(FLAC `LYRICS`/MP3 `USLT` 标签,无需额外 `.lrc`),其次同名 `.lrc`,都没有时自动在线匹配;在线 QQ 歌曲显示官方歌词(外语歌带逐句翻译);AI 讲书时显示当前朗读句子。**单击播放条歌词**可打开完整歌词/字幕面板(标识当前进度、可拖动/拉伸、位置独立记忆),面板默认开启**透明模式**——歌词像直接悬浮在页面上,可在「系统配置」关闭
17
17
  - 播放时防止电脑熄屏/休眠(需浏览器支持,如 Chrome/Edge)
18
18
  - 播放列表面板可自由拖动,右下角可拖拽调整大小,位置与尺寸跨刷新记忆
19
19
  - AI 讲书:本地 `.txt` / `.epub` 小说 AI 语音朗读,自动识别**书名/前言/章节/尾声**结构,播放条带**章节目录**跳转(打开即定位到当前正在播放的章节)、章节切换,可选 4 种中文 AI 声音(默认白桦)
20
20
  - `music_play` 模型工具:agent 可按关键词播放本地音乐,也可按小说名启动 AI 讲书
21
+ - **每日新闻播报**:agent 用 web search 收集当天头条(可分类别/自定义主题),整理筛选后 AI 语音播报;播放面板「新闻播报」页签随时回看、挑条目播放、看文字版;支持每日多班次定时与静默收集(详见下文「每日新闻播报」)
21
22
  - 支持的格式:`mp3 / m4a / m4b / aac / flac / wav / ogg / opus / webm / aiff`(自动递归扫描子目录,上限 500 首)
22
23
  - **真实音质识别**:扫描时自动识别每首歌的音质档位,播放条显示「格式 · 音质档」(如 `FLAC · 无损` / `MP3 · 高音质` / `MP3 · 标准`),与在线音乐的音质标签一致
23
24
  - **自建歌单**:可新建多个歌单,从本地文件(支持多选、可跨目录)添加歌曲;播放条爱心按钮一键收藏到默认歌单「我最喜欢」;歌单作为播放来源时,顺序/乱序循环只在该歌单内进行
@@ -30,10 +31,8 @@ DeepSeek Harness 音乐/小说播放插件。
30
31
  |:---:|:---:|
31
32
  | ![播放本地音乐](assets/screenshot-bar.png) | ![播放QQ音乐](assets/screenshot-qq.png) |
32
33
  | 播放酷狗音乐 | AI讲书 |
33
- |:---:|:---:|
34
34
  | ![播放酷狗音乐](assets/screenshot-kg.png) | ![播放AI讲书](assets/screenshot-spectrum.png) |
35
35
  | QQ音乐面板 | 酷狗音乐面板 |
36
- |:---:|:---:|
37
36
  | ![播放面板1](assets/screenshot-panel-qq.png) | ![播放面板2](assets/screenshot-panel-kg.png) |
38
37
 
39
38
  ## 安装
@@ -64,8 +63,8 @@ dsh plugin --profile <profile> add github:kendu76/dsh-music-player
64
63
 
65
64
  插件为「Host 端 + Web 端」双面结构:
66
65
 
67
- - Host 端(`lib/index.js`):音乐扫描、HTTP 流式、歌单 CRUD/持久化、`music_play` 工具、AI 讲书(小说结构解析 + TTS 合成)
68
- - Web 端(`lib/client.js`):浏览器里的播放条 / 播放面板 / 频谱 / 歌单(收藏、一键清空)/ 讲书控制
66
+ - Host 端(`lib/index.js`):音乐扫描、HTTP 流式、歌单 CRUD/持久化、`music_play`/`news_broadcast`/`news_schedule` 工具、AI 讲书(小说结构解析 + TTS 合成)、新闻播报(期次持久化 + 口播稿渲染分块 + TTS 懒合成)
67
+ - Web 端(`lib/client.js`):浏览器里的播放条 / 播放面板 / 频谱 / 歌单(收藏、一键清空)/ 讲书控制 / 新闻播报页签
69
68
 
70
69
  两者由一个 `cordis.patch.yml` 插入 `music-player` 行并自动组对(在 Web 端 `dsh.client` 声明即指回该行名并加载浏览器半体):
71
70
 
@@ -158,13 +157,38 @@ dsh plugin --profile <profile> add github:kendu76/dsh-music-player
158
157
  - `.txt`(自动识别 UTF-8 / UTF-16 / GBK/GB18030 编码,无需手工转码)
159
158
  - `.epub`(自动解压并按其目录(spine)顺序把章节转成纯文本朗读;标题/作者取自 epub 元数据,可识别章节结构;加密/DRM 的章节会自动跳过)
160
159
 
160
+ ## 每日新闻播报
161
+
162
+ 让 agent 用联网搜索收集当天头条,整理筛选成口播稿后用 AI 语音播报。**前置**:DSH 的 web 搜索可用(`web_search`,内置 DeepSeek 搜索提供方);语音播报需配置 xiaomi 提供方(与 AI 讲书共用,未配置时简报仍会生成、只是不可播)。
163
+
164
+ ### 使用
165
+
166
+ 1. **对话即时播报**(收集完立即播放):对 agent 说「**播报今天的新闻**」。它会按类别搜索当天头条(默认热点/国内/国际/科技/财经/体育/娱乐,可任意指定,如「播一下 AI 相关的新闻」)、跨源去重、每条写口播摘要并标注来源,然后自动开播;说「收集一下今天的新闻,先别播」则只生成不出声。
167
+ 2. **面板回看**:播放面板「新闻播报」页签——期次按时间倒序排列(**每班次独立保留最近 7 期**),未播放的标「待播」;点进详情可**播整期 / 播某类 / 点某一条新闻从该条播**;「文字版」按钮可全文阅读(不方便听语音时)。播放条上与讲书一致:📖 类别目录跳转、上/下一类、逐句字幕、AI 声音切换、`N%` 已读进度。
168
+ 3. **每日定时(Host 自维护)**:在「新闻播报」页签的「⏰ 每日定时」里可视化配置**多班次**(如 08:00 / 12:30 / 18:00),每个班次可独立指定收集范围,并勾选「收集后立即播放」(不勾选 = **静默收集**,只更新简报不出声)。**保存即生效**——定时器由插件在 DSH 主机进程内自维护(无需 agent 创建/同步 DSH 定时任务、无需手动开会话),到点自动执行。也可对 agent 说「每天早上 9 点播报新闻」让其引导配置。可在「⏰ 每日定时」里给执行会话选一个**新闻会话模型**(不选则跟随当前活跃会话)。
169
+ 4. **手动补收**:定时班次行有「▶ 立即执行」——一键自动跑一轮(不等时刻);同一班次 10 分钟内重复收集会被自动跳过。
170
+
171
+ ### 一次执行 = 一个会话
172
+
173
+ - **每次执行(定时到点或手动立即执行)都会新建一个独立的「执行会话」**去收集并绑定结果——上下文干净聚焦、互不干扰,不再有常驻复用会话。
174
+ - 执行会话自动归入侧边栏 **「新闻收集」分组**(专属工作区目录 `~/.dsh/news`),不再散落在「未分组」里;分组名可在工作区菜单里随意重命名。
175
+ - **每天凌晨 3 点自动清理「今天之前」的新闻**:删除前一天及更早的全部期次与失败记录(不再保留多天新闻),并联动销毁/归档对应的执行会话;**插件每次启动时也会立即检查一次**,存在非今天的新闻就直接清理(清理幂等,手动触发 `POST /dsh-music/news/purge-stale` 走同一入口)。
176
+ - 每期次/失败记录都会记录对应的**执行会话 id**;**删除某期新闻时,会连同删除它对应的执行会话**(结果与会话一一对应、可清理)。
177
+ - 定时器在 DSH 主机进程内自维护(Node setInterval 读已保存的班次偏好),**完全脱离会话存活**——会话销毁不影响每天到点触发;宿主重启后按持久化偏好自动重建定时器。
178
+
179
+ ### 数据与边界
180
+
181
+ - 收集与整理由 agent 在会话内完成(每次都是新鲜搜索,无常驻爬虫);播报稿由插件端模板渲染。期次持久化在 `~/.dsh/music-player-news.json`,音频不落盘(播放时按块懒合成)。
182
+ - **宁缺毋假**:收集失败(如主机断网、搜索服务故障)时该期次不生成、绝不用旧数据顶替;失败原因透传工具错误(不做推断),面板展示并支持补收。仅浏览器离线不影响收集(收集在 DSH 主机进程完成,浏览器没开只影响"出声")。
183
+ - 每条新闻必标来源(如「新华社」「微博热搜」);内容由 AI 自动收集整理,以来源报道为准,请自行甄别。
184
+
161
185
  ## 开发
162
186
 
163
187
  需要 Node.js ≥ 20(vitest 建议 20.19+)与 npm。开发依赖:`vitest` + `react`/`react-dom`/`jsdom`(用于前端渲染冒烟测试):
164
188
 
165
189
  ```sh
166
190
  npm install
167
- npm test # 跑 vitest 测试套件(Host 单测 + Web 渲染冒烟,共 120+ 用例)
191
+ npm test # 跑 vitest 测试套件(Host 单测 + Web 渲染冒烟,共 500+ 用例)
168
192
  ```
169
193
 
170
194
  修改 `lib/` 后,在本机 profile 里用 link 方式本地调试并验证:
@@ -201,9 +225,37 @@ AI 语音目前仅支持 xiaomi 提供方(限时免费)。请先在 DSH 模
201
225
  **本地音乐没有 .lrc,歌词是怎么来的?**
202
226
  播放器会**在线兜底取词**:先用文件名(可带歌手/时长)在 QQ 音乐匿名接口匹配官方歌词(外语歌带逐句翻译),QQ 无果再查 LRCLIB(免费公开歌词库,返回同步 LRC)。结果按曲目在进程内缓存(正命中 6 小时 / 空命中 30 分钟),避免重复请求;无匹配或失败时静默保持无歌词,不影响播放。歌词为版权内容,仅供个人试听。
203
227
 
228
+ **有些音乐文件本身就带了歌词,会读取吗?**
229
+ 会。播放器优先读取音频文件**内嵌歌词**(FLAC/OGG 的 `LYRICS`/`UNSYNCEDLYRICS` 标签、MP3 的 `USLT` 帧),无需额外 `.lrc` 文件,即可直接显示同步歌词。取词优先级为:**同名 `.lrc` → 文件内嵌歌词 → 在线兜底**(同名 `.lrc` 仍是第一优先,其次内嵌,都没有才走在线)。内嵌歌词通常就是标准 LRC 格式(含 `[mm:ss]` 时间戳),与普通 `.lrc` 一样逐句高亮、支持歌词面板。
230
+
231
+ **本地歌词带翻译(原文/翻译逐句),能显示吗?**
232
+ 能。若本地 `.lrc`(或内嵌歌词)里是「**翻译行带自己的时间戳、紧跟在原句后**」的写法,播放器会自动识别逐句翻译,并像在线歌词一样合并成「**原文 / 翻译**」显示(播放条与歌词面板都生效)。**支持双向方向**——既支持主流「外文歌 → 中文翻译」:
233
+ ```
234
+ [00:01.00]Sparrows outside the window
235
+ [00:01.50]窗外的麻雀
236
+ ```
237
+ 也支持「中文歌 → 外文翻译」:
238
+ ```
239
+ [00:01.00]窗外的麻雀
240
+ [00:01.50]Sparrows outside the window
241
+ ```
242
+ 识别从严:主语言由整首歌词统计决定(外文为主则中文行是翻译,中文为主则外文行是翻译),只有「相邻两行、时间戳接近」的翻译行才会被合并;歌名/水印等中英混杂的杂项行不误判,无翻译的歌词保持原样。
243
+
204
244
  **想支持更多音频格式?**
205
245
  格式支持由 Host 端 `AUDIO_TYPES` 表驱动,在 `lib/index.js` 里加扩展名与 MIME 即可(播放器本身用浏览器原生 `<audio>` 解码,最终能否播放还取决于浏览器对该编码的支持)。
206
246
 
247
+ **新闻播报里的新闻是怎么收集的?来源可靠吗?**
248
+ 由 agent 在会话里用 `web_search` 联网搜索(内置 DeepSeek 搜索提供方),按类别多查询、跨源去重、只保留可确认时效的条目,每条必标来源(新华社、微博热搜等)。收集在 DSH 主机进程完成——浏览器没开不影响,只是不能出声;搜索服务故障/断网时该期次不生成(宁缺毋假),面板会显示失败原因并支持一键补收。
249
+
250
+ **新闻定时任务设置了却不触发?**
251
+ 定时器由插件在 DSH 主机进程内自维护(读面板已保存的班次偏好,每 30s 检查一次,到点触发)——**请确认 dsh-desktop / dsh 服务主机进程保持运行**;浏览器没开不影响收集(只影响出声)。每次触发会新建一个执行会话去收集并绑定结果(归入侧边栏「新闻收集」分组)。可在「新闻播报」页签的「⏰ 每日定时」里查看/修改班次;保存即生效。
252
+
253
+ **收集时看到 `web_fetch` 报 `WEB_BLOCKED_URL`(non-public IP)?**
254
+ 说明本机开着 TUN 代理的 **fake-ip DNS 模式**(Clash/mihomo、sing-box 等):所有域名都会被解析成 `198.18.x.x` 这类代理内部地址,DSH 的 `web_fetch` 防 SSRF 保护会拒绝连接。收集流程会正常尝试抓取原文,但遇到这种报错会自动跳过、降级为只用 `web_search` 摘要继续整理,**新闻照常生成**。想让 `web_fetch` 恢复可用:把代理的 DNS 改为真实 IP 解析即可(Clash/mihomo 设 `enhanced-mode: redir-host`;sing-box 删除 DNS 配置里的 `fakeip`)。
255
+
256
+ **新闻期次为什么少了 / 旧的去哪了?**
257
+ 新闻**只保留当天**:每天凌晨 3 点自动删除前一天及更早的全部期次与失败记录(插件启动时也会立即检查一次),并归档对应的执行会话;当天之内每个班次独立保留最近 7 期,超出自动裁剪;也可以在面板里手动删除。「未听」的期次会带「待播」徽标,方便快速找到漏掉的。
258
+
207
259
  ## License
208
260
 
209
261
  [MIT](LICENSE) © kendu76