
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
dsh-music-player
Advanced tools
DeepSeek Harness 音乐/小说播放插件。
写代码写累了、想摸鱼又不想切窗口?这个插件就是你的摸鱼神器——直接在 DeepSeek Harness 的网页里塞进一个 DSH音乐播放器:扫一下你电脑上的音乐目录(默认 ~/Music)就能在浏览器里听歌,带播放条和可拖拽的播放面板,还能自己建歌单。
光听歌还不够,它还能听书:把本地 .txt/.epub 小说丢给 AI 朗读,想听哪章点哪章、声音随便挑。现在还能听新闻:让 agent 用联网搜索收集当天头条(热点/国内/国际/科技/财经/体育/娱乐,或 AI 等任意自定义主题),整理筛选成口播稿用 AI 声音播报——支持每日多定时任务定时、静默收集、文字版阅读。还能听网络电台:中文主流台(央广/凤凰/CCTV 伴音等,含 HLS 流)与全球电台一键开播。最绝的是它注册了 music_play 等模型工具——你连鼠标都不用动,在对话框里跟 agent 说句「播放周杰伦的歌」,音乐分分钟响起来,摸鱼摸出新境界。
LYRICS/MP3 USLT 标签,无需额外 .lrc),其次同名 .lrc,都没有时自动在线匹配;在线 QQ 歌曲显示官方歌词(外语歌带逐句翻译);AI 讲书时显示当前朗读句子。单击播放条歌词可打开完整歌词/字幕面板(标识当前进度、可拖动/拉伸、位置独立记忆),面板默认开启透明模式——歌词像直接悬浮在页面上,可在「系统配置」关闭lib/client.js 的 VOL_WHEEL_* 常量).txt / .epub 小说 AI 语音朗读,自动识别书名/前言/章节/尾声结构,播放条带章节目录跳转(打开即定位到当前正在播放的章节)、章节切换,可选 4 种中文 AI 声音(默认白桦)music_play 模型工具:agent 可按关键词播放本地音乐,也可按小说名启动 AI 讲书mp3 / m4a / m4b / aac / flac / wav / ogg / opus / webm / aiff(自动递归扫描子目录,上限 500 首)FLAC · 无损 / MP3 · 高音质 / MP3 · 标准),与在线音乐的音质标签一致music_play 传 source=radio 可按台名直接开播;详见下文「网络电台」| 播放本地音乐 | 播放QQ音乐 |
|---|---|
![]() | ![]() |
| 播放酷狗音乐 | AI讲书 |
![]() | ![]() |
| QQ音乐面板 | 酷狗音乐面板 |
![]() | ![]() |
需要已安装 dsh CLI。
# 把 <profile> 换成实际 profile 名,如 web
dsh plugin --profile <profile> add dsh-music-player
# 把 <profile> 换成实际 profile 名,如 web
dsh plugin --profile <profile> add github:kendu76/dsh-music-player
安装后重启 DSH,打开 Web GUI:
~/Music),自动递归扫描插件为「Host 端 + Web 端」双面结构:
lib/index.js):音乐扫描、HTTP 流式、歌单 CRUD/持久化、music_play/news_broadcast/news_schedule 工具、AI 讲书(小说结构解析 + TTS 合成)、新闻播报(期次持久化 + 口播稿渲染分块 + TTS 懒合成)lib/client.js):浏览器里的播放条 / 播放面板 / 频谱 / 歌单(收藏、一键清空)/ 讲书控制 / 新闻播报页签两者由一个 cordis.patch.yml 插入 music-player 行并自动组对(在 Web 端 dsh.client 声明即指回该行名并加载浏览器半体):
- insert:
- id: music-player
name: 'dsh-music-player'
播放模式与音量等播放偏好都保存在 Host 端(见下),刷新后当前曲目与进度也会恢复(浏览器的自动播放可能被拦截,点一次 ▶ 即可解锁)。
状态持久化(重要):所有播放状态都持久化在 Host 端文件
~/.dsh/music-player-prefs.json,包括: 音量、播放顺序、AI 讲书声音、播放范围、面板位置、上次播放的曲目/进度、每本小说的进度、QQ 搜索历史、QQ 面板所在层、QQ「我喜欢」收藏兜底。 因此即使在 dsh-desktop 桌面版(每次启动随机端口、浏览器存储按源隔离)下,重启后这些状态照样能找回。 升级兼容:旧版本(<0.7)把同样的键存在浏览器localStorage里。升级后客户端优先读 Host,Host 没有的记录会自动回退读取旧localStorage副本并迁移进 Host,升级不丢用户数据。 音乐/小说目录、自建歌单、QQ 登录态也持久化在 Host 端(见下文),同样不受影响。
播放面板「本地音乐」页内新增子标签:曲库 / ♥ 我最喜欢 / +,支持自建歌单并把歌单作为播放来源——此时顺序/乱序循环只在该歌单内进行。
music_play 工具新增 playlist 参数,可让 agent 直接播放某个歌单(如「播放歌单 我最喜欢」)。~/.dsh/music-player-playlists.json,刷新/重启不丢;歌单可包含曲库目录之外的本地音频文件。播放面板顶部切到「QQ音乐」页签即可在线听歌。需先扫码登录(QQ 登录或微信登录),登录后可浏览/搜索/播放并访问「我的歌单」,VIP 曲目可播高音质。
使用声明(重要):在线 QQ 音乐功能通过非官方接口访问 QQ 音乐资源,所播放/收藏的内容版权归 版权方及 QQ 音乐平台所有。本功能仅供个人学习、技术研究、日常试听使用, 严禁用于任何商业用途、公开传播、二次分发或盈利行为。使用本功能即表示您已知悉并同意:
- 您应对自己的使用行为及其后果负责;
- 因使用非官方接口登录/播放导致的账号风控、封禁、限流,以及可能引发的法律、版权纠纷,均由使用者自行承担;
- 本项目作者不承担任何因此产生的直接或间接责任。 如您不同意以上条款,请勿使用本功能。
~/.dsh/music-player-qq-cookie.json),刷新/重启不丢;面板右上角可退出登录。播放面板侧栏切到「酷狗音乐」页签。需先用酷狗 App 扫码登录才能试听(未登录可浏览榜单/歌单/搜索,但取链播放需要登录态)。登录后支持:
~/.dsh/music-player-kugou-cookie.json,0600,含设备指纹),刷新/重启不丢。使用声明:与在线 QQ 音乐相同——非官方接口、仅供个人学习试听、严禁商业用途; 账号风控风险由使用者自行承担。技术细节与端点调研见 docs/kugou-integration-research.md。
播放面板侧栏切到「网易云」页签。需先用网易云音乐 App 扫码登录(与 QQ/酷狗一致,未登录只显示登录入口),登录后支持:
~/.dsh/music-player-netease-cookie.json,0600),刷新/重启不丢。music_play 工具传 source=netease 时,未登录也能播免费曲(供对话场景直接点播)。使用声明:与在线 QQ 音乐相同——非官方接口、仅供个人学习试听、严禁商业用途; 账号风控风险由使用者自行承担。技术细节与端点调研见 docs/netease-integration-research.md。
播放面板切到「网络电台」页签即可在线听全球电台(radio-browser.info 开放目录,无需登录、无 key)。子页签:我的电台(收藏)/ 最近播放 / 中文电台 / 热门电台 / 搜索。
lib/hls.js)实时解析 m3u8(支持 master 嵌套、防盗链 token 与 scheme-relative URL)→ 逐分片归一化为 AAC(ADTS) 连续流喂给浏览器——兼容 MPEG-TS 分片(央广/凤凰/CCTV)与裸 ADTS 分片(蜻蜓/喜马拉雅系 .aac,如「华语金曲500首」)两种容器,无需 hls.js/ffmpeg 任何新依赖,浏览器 <audio> 直接可播(LIVE 直播态/断流自动重连与纯流台一致)。HLS 台在列表显示绿色「HLS」徽章、播放条标「电台 · HLS」。~/.dsh/music-player-radio.json),「我的电台」随时回听。music_play 工具传 source=radio + 台名/国家,agent 可直接搜台开播(如「播放网络电台 中国之声」)。合规:目录为 CC 开放数据,播放的是各电台公开直播流;仅供个人收听,不录制/不二次分发,遵守台站 ToS。设计与实测记录见 docs/internet-radio-design.md。
把本地 .txt / .epub 小说交给 AI 朗读。AI 语音目前仅支持xiaomi提供方(限时免费),请在设置中配置好再使用此功能。
在 DSH 的模型设置里配置一个xiaomi提供方(含 api key)。未配置时,小说列表会提示"未配置xiaomi提供方"。
.txt / .epub 的目录(默认与音乐目录相同)。music_play 工具按小说名播放(如「播放《中国制造》」)。支持的格式:
.txt(自动识别 UTF-8 / UTF-16 / GBK/GB18030 编码,无需手工转码).epub(自动解压并按其目录(spine)顺序把章节转成纯文本朗读;标题/作者取自 epub 元数据,可识别章节结构;加密/DRM 的章节会自动跳过)让 agent 用联网搜索收集当天头条,整理筛选成口播稿后用 AI 语音播报。前置:DSH 的 web 搜索可用(web_search,内置 DeepSeek 搜索提供方);语音播报需配置 xiaomi 提供方(与 AI 讲书共用,未配置时简报仍会生成、只是不可播)。
N% 已读进度。web_search 只作补盲(热点榜单、自定义主题、池外突发);某源连续失败自动停用 24h。无 UI、无需任何配置——面板不展示信源池,Host 直接在后台使用(详见 RFC docs/news-rss-pool-rfc.md)。关掉信源池也不影响功能——收集完全退回 web_search,能力不降级。news_broadcast 提交时对标题归一化 + 相似度比对,自动剔除与本期次内或当日已有期次重复的条目(notice 透明报告);同一事件多个来源时,更权威源(official > major > secondary > kol)可升级替换当日旧期次里的旧条目。同类任务当天多次执行不会因去重短收:收集指令会注入【已报条目】清单(今天已播过哪些),且仅当当天该定时任务已执行过时才要求每类按目标条数 1.5~2 倍提交候选缓冲去重(首次执行零冗余、不浪费 token);工具层先去重(剔除重复候选)、再按定时任务条数收敛到目标——收集 8 条就播 8 条(详见 RFC §7.5)。~/.dsh/news),不再散落在「未分组」里;分组名可在工作区菜单里随意重命名。POST /dsh-music/news/purge-stale 走同一入口)。~/.dsh/music-player-news.json,音频不落盘(播放时按块懒合成)。需要 Node.js ≥ 20(vitest 建议 20.19+)与 npm。开发依赖:vitest + react/react-dom/jsdom(用于前端渲染冒烟测试):
npm install
npm test # 跑 vitest 测试套件(Host 单测 + Web 渲染冒烟,共 500+ 用例)
修改 lib/ 后,在本机 profile 里用 link 方式本地调试并验证:
dsh plugin --profile <profile> add ./ # 或直接改 profile 里的 link 目标
项目结构、测试策略与发布流程详见 CONTRIBUTING.md。
播放没有声音 / 显示"浏览器拦截了自动播放"? 浏览器安全策略禁止未经交互的音频播放。首次自动播放被拦截是正常的——在播放条上点一次 ▶ 即可解锁,之后恢复播放。
播放条固定在输入框上方,太抢注意力 / 想让它挪个地方? 打开播放面板 →「系统配置」→ 最下方的「播放条位置」,三选一:
| 选项 | 说明 |
|---|---|
| 输入框上方 | 默认(与旧版一致),全宽显示在输入卡片上方 |
| 页面底部 | 贴在窗口底边、横向对齐会话列的一条细条;插件会给输入区底座补一段等高的下内边距,让输入卡片整体上移,因此这条既压不住输入框、也不遮住对话内容 |
| 悬浮可拖动 | 紧凑三行卡片,高度固定不跳:① 歌词独占整行(第一行,中文歌词基本不用截断;当前没有歌词时留同高占位,所以有词/无词、空闲/播放中都不会变高变矮)② 歌名 + 实时频谱(频谱紧跟歌名/音质徽章)③ 时长 + 播放控制。整条可直接拖动,位置记在 Host 上、刷新后仍在;默认贴窗口右下角,「悬浮位置 → 重置位置」可复位 |
悬浮条闲置时会按「沉浸感」变淡,鼠标移上去恢复——不抢注意力但也一眼能找到。另外:改用页面底部或悬浮位置后,播放条不再挂在输入框区域,对话里的询问弹窗(它会接管输入区)不会再连播放条一起盖住,弹窗开着也能直接暂停/切歌。
同时开了好几个 DSH 标签页,会不会两首歌一起响? 不会。插件把多个标签页收拢成一个播放器:同一时刻只有一页出声(由开始播放的那一页担任「出声页」),其余页自动静音并同步显示同一个播放器的状态——同一首歌、同一播放进度、同一播放/暂停状态,歌词、播放模式、音量、讲书章节都一致。在任意一页上的操作都会作用到这个唯一播放器:播放/暂停、上一首/下一首、停止、音量、播放模式、讲书换声音/跳章、点歌/点电台/点书/点新闻期次,都会转发到出声页执行。静音的那些页会在播放条歌名后显示 「此页静音」 徽标,提示声音来自另一个标签页。出声页被关闭时,其余页会停在最后的位置(不会两页抢播),在任意一页点 ▶ 即可就地接着播(讲书按 Host 上保存的进度续播)。
音乐面板显示"暂无音乐"或"不是有效的音乐目录"?
点面板顶部「选择音乐目录」,选一个包含音频文件的实际目录(默认 ~/Music)。目录路径不可读或不存在时会回退到默认目录而不是报错。
改了音乐目录/新增了歌曲,但列表没更新? 播放器在启动时扫描一次,并支持手动重扫:点「选择音乐目录」旁边的新增 「刷新」按钮,会重新遍历当前目录并更新列表(音乐与小说通用;无需重选目录)。扫描上限 500 首、递归子目录深度上限 4 层。
music_play 工具说"音乐库为空"?
说明还没有可用的音乐目录。请先打开播放面板,点「选择音乐目录」配置一次。
小说列表提示"未配置 xiaomi/MiMo TTS 模型"? AI 语音目前仅支持 xiaomi 提供方(限时免费)。请先在 DSH 模型设置里配置 xiaomi/MiMo provider(含 api key),再使用讲书功能。
讲书播放时点后退/前进没反应? 讲书模式下后退/前进是跳上一章/下一章;如果当前小说没有识别出章节结构(目录按钮提示"暂无章节结构"),则无法跳章,只能整本顺序播。
听书偶尔"没声音但时间还在走"?
这种一般是某一段的合成结果异常(返回了退化/静音音频),或瞬时合成失败。0.3.3 起 Host 端会严格校验合成音频(拒绝空数据/非 PCM 等退化 WAV)并自动重试一次瞬时失败,同时把每次合成结果记录在诊断日志里。若再遇到,可访问 http://<DSH地址>/dsh-music/tts-logs 查看最近 60 条合成记录(含失败原因、退化音频事件),据此定位具体是哪个块出的问题。
本地音乐没有 .lrc,歌词是怎么来的? 播放器会在线兜底取词:先用文件名(可带歌手/时长)在 QQ 音乐匿名接口匹配官方歌词(外语歌带逐句翻译),QQ 无果再查 LRCLIB(免费公开歌词库,返回同步 LRC)。结果按曲目在进程内缓存(正命中 6 小时 / 空命中 30 分钟),避免重复请求;无匹配或失败时静默保持无歌词,不影响播放。歌词为版权内容,仅供个人试听。
有些音乐文件本身就带了歌词,会读取吗?
会。播放器优先读取音频文件内嵌歌词(FLAC/OGG 的 LYRICS/UNSYNCEDLYRICS 标签、MP3 的 USLT 帧),无需额外 .lrc 文件,即可直接显示同步歌词。取词优先级为:同名 .lrc → 文件内嵌歌词 → 在线兜底(同名 .lrc 仍是第一优先,其次内嵌,都没有才走在线)。内嵌歌词通常就是标准 LRC 格式(含 [mm:ss] 时间戳),与普通 .lrc 一样逐句高亮、支持歌词面板。
本地歌词带翻译(原文/翻译逐句),能显示吗?
能。若本地 .lrc(或内嵌歌词)里是「翻译行带自己的时间戳、紧跟在原句后」的写法,播放器会自动识别逐句翻译,并像在线歌词一样合并成「原文 / 翻译」显示(播放条与歌词面板都生效)。支持双向方向——既支持主流「外文歌 → 中文翻译」:
[00:01.00]Sparrows outside the window
[00:01.50]窗外的麻雀
也支持「中文歌 → 外文翻译」:
[00:01.00]窗外的麻雀
[00:01.50]Sparrows outside the window
识别从严:主语言由整首歌词统计决定(外文为主则中文行是翻译,中文为主则外文行是翻译),只有「相邻两行、时间戳接近」的翻译行才会被合并;歌名/水印等中英混杂的杂项行不误判,无翻译的歌词保持原样。
想支持更多音频格式?
格式支持由 Host 端 AUDIO_TYPES 表驱动,在 lib/index.js 里加扩展名与 MIME 即可(播放器本身用浏览器原生 <audio> 解码,最终能否播放还取决于浏览器对该编码的支持)。
新闻播报里的新闻是怎么收集的?来源可靠吗?
由 agent 在会话里用 web_search 联网搜索(内置 DeepSeek 搜索提供方),按类别多查询、跨源去重、只保留可确认时效的条目,每条必标来源(新华社、微博热搜等)。收集在 DSH 主机进程完成——浏览器没开不影响,只是不能出声;搜索服务故障/断网时该期次不生成(宁缺毋假),面板会显示失败原因并支持一键补收。
新闻定时任务设置了却不触发? 定时器由插件在 DSH 主机进程内自维护(读面板已保存的定时任务偏好,每 30s 检查一次,到点触发)——请确认 dsh-desktop / dsh 服务主机进程保持运行;浏览器没开不影响收集(只影响出声)。每次触发会新建一个执行会话去收集并绑定结果(归入侧边栏「新闻收集」分组)。可在「新闻播报」页签的「⏰ 每日定时」里查看/修改定时任务;保存即生效。
勾了「收集后立即播放」,为什么熄屏/锁屏时没自动出声? 熄屏/锁屏时插件不会自动起播新闻:页面不可见(后台标签/最小化/锁屏),或页面不再渲染帧(macOS 熄屏/锁屏时浏览器不把页面置为 hidden,但合成器停发帧)即视为「无人观看」——避免对着空房间把整期播完,也避免播放期反复申请/释放防熄屏锁让音频设备进出低功耗态(解锁瞬间的「咚咚」爆音)。该期会保持**「待播」**徽标,解锁后在「新闻播报」页签点一下即可播。若熄屏时本来就在听音乐/讲书(有人在听),定时播报照常插入,播完自动切回原内容。
收集时看到 web_fetch 报 WEB_BLOCKED_URL(non-public IP)?
说明本机开着 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)。
新闻期次为什么少了 / 旧的去哪了? 新闻只保留当天:每天凌晨 3 点自动删除前一天及更早的全部期次与失败记录(插件启动时也会立即检查一次),并归档对应的执行会话;当日期次全保留,也可以在面板里手动删除。「未听」的期次会带「待播」徽标,方便快速找到漏掉的。
MIT © kendu76
FAQs
Vibe coding时的好伴侣
The npm package dsh-music-player receives a total of 306 weekly downloads. As such, dsh-music-player popularity was classified as not popular.
We found that dsh-music-player demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.