前言¶
DeepSeek Harness(DSH)的右侧栏与「文件 / 终端 / 浏览器」共用同一套 apps 机制,第三方插件可以在里面再挂一个入口。长时间写 prompt、跑终端、查文档时,若希望旁边有一块不抢主工作区的「氛围区」——带画面、能听台、又不依赖单独开浏览器标签——就需要一个嵌在侧栏里的轻量方案。
下面介绍维护者 lemonhall 的 dsh-radio-dock(社区分类:趣味换装)。它把作者 Godot 项目 godot_citys 里的车载电台逻辑移植到 DSH:右侧栏一个 tab,three.js 渲染车内视角与弯夜公路,电台频道来自 radio-browser.info,预设标签含 City Pop 等方向。
这是什么¶
- 仓库:lemonhall/dsh-radio-dock
- 目录页:skillhub.cn 插件页
- 版本(package.json):0.1.1
- 许可证:MIT
一句话:在 DSH 桌面版右侧栏增加「📻 车载电台」——左边照常聊天与开发,右边是夜路场景 + 网络电台 UI(开关、切台、音量、快捷槽)。
核心功能¶
视觉与场景(客户端)¶
- 车内视角:驾驶位高度、仪表台与方向盘剪影;月光、星空、带光晕的月亮。
- 会弯的公路:路面由三个正弦叠加曲线做顶点位移(96 段);相机横向跟随曲线、朝向跟随切线。
- 车流与环境:同向慢车被超越(红尾灯)、对向车辆掠过(暖白大灯);护栏柱、路灯、远处城市剪影循环。车流为程序生成,非真实交通模拟。
three.js 使用包内 vendor(r169),不依赖 CDN。
电台(UI + 宿主中转)¶
- 频道目录来自 radio-browser;界面提供四个标签预设:City Pop / Jazz / Synthwave / Lofi,以及频道列表、8 个快捷槽,以及开关 / 上下台 / 音量。
- 断流自愈:公共电台常被服务器断开;客户端含重连与看门狗(含「未暂停但播放位置不前进」的僵尸连接检测)。
音频与目录请求经宿主半边路由中转(见下文「架构」),以便走本机代理、避免混合内容与 CORS。
宿主提供的 HTTP 路由¶
| 路径 | 作用 |
|---|---|
/dsh-radio/ping |
配置自检 |
/dsh-radio/stations |
取频道目录(经本机代理访问 radio-browser) |
/dsh-radio/stream |
音频流转发(curl 走代理,边收边 pipe) |
/dsh-radio/three.module.js |
提供插件自带的 three.module.js |
安装与启用¶
官方 README 给出的安装方式为 plugin_manager install_bundle,目标为本地链接路径(请换成你机器上的实际路径):
plugin_manager install_bundle target=link:E:\development\dsh-radio-dock
若仓库已在本地,将 target=link: 后改为该目录即可。README 亦给出 clone 后替换路径的示例,但安装动作仍是 install_bundle,而非其他臆造的 CLI 子命令。
注意:客户端半边(右侧栏 tab)的改动需要重启一次 DSH 应用;宿主半边可热生效。
装好后:右侧栏点「+」→ 选择 📻 车载电台。
典型用法¶
- 安装 bundle 并按要求重启(若刚更新客户端脚本)。
- 在右侧栏添加「车载电台」tab,展开后可看到当前播放台、四个风格标签与 radio-browser 实时结果列表。
- 用开关、上下台、音量与 8 个快捷槽切换常听频道;场景在 tab 内持续渲染夜路。
- 若目录或流拉取失败,检查
cordis.patch.yml中的代理与 API 基址是否与你的网络环境一致(默认代理为http://127.0.0.1:7897)。
热键语义移植自原 Godot 项目 project.godot 中的 vehicle_radio 相关动作(如 power_toggle、next、prev、quick_open 等),具体是否在 DSH 内全部映射以当前版本客户端为准。
配置¶
编辑插件包内的 cordis.patch.yml:
| 键 | 默认 | 说明 |
|---|---|---|
apiBase |
https://de1.api.radio-browser.info |
电台目录 API |
proxy |
http://127.0.0.1:7897 |
目录与音频流均经此代理 |
defaultCountry / defaultTag |
Japan / city pop |
默认筛选方向 |
cacheTtlMs |
21600000(6h) |
目录缓存时长 |
streamTimeoutMs |
21600000(6h) |
音频流总时限(对应 curl --max-time);过小会导致播一会儿自行停止 |
架构简述¶
lib/index.js 宿主:上述 /dsh-radio/* 路由
lib/client.js 客户端:注册 sidebarRightTabs;RadioScene(three.js)+ RadioPanel(电台 UI)
vendor/three.module.js three r169
为何音频要宿主中转(README 说明):目录与音频需走本机代理;许多公共台为 http 流,而页面为 http://127.0.0.1:19387,直接请求会触发混合内容拦截;同时绕开 CORS。
原 Godot 侧的 FFmpeg GDExtension 后端在本插件中不需要;浏览器 <audio> 直接播放经宿主转发的流即可。
适用场景与注意¶
适合:已在用 DSH 桌面版、希望右侧栏多一个轻量「夜驾 + 电台」氛围;习惯 City Pop / Jazz 等标签从 radio-browser 选台的用户。
限制(README 明确):
- 频道依赖公共目录与公共流,可用性不保证(挂台、限流常见)。
- 未实现「当前播放曲目」展示(多数公共流无可靠 ICY 元数据)。
安全与权限:插件以当前 DSH 进程权限运行;宿主会通过配置的 proxy 用 curl 拉取外部目录与音频流。安装前请阅读 源码仓库 与 MIT 许可证,确认 proxy、API 与路由行为符合你的环境策略。
DSH 社区插件目录(如 skillhub.cn)为独立生态站点,与 DeepSeek / 幻方无官方从属关系;安装来源以你信任的目录页或 GitHub 为准。
结尾¶
dsh-radio-dock 把 godot_citys 的车载电台体验收进 DSH 右侧栏:three.js 夜路与弯公路负责画面,radio-browser 负责选台,宿主路由负责代理与混流兼容。若你需要在开发主界面旁挂一个可切台的 City Pop 侧栏,可按 README 的 install_bundle 步骤接入。