dsh-radio-dock:DSH 右侧栏车载电台(three.js 夜路 + radio-browser)

前言

DeepSeek Harness(DSH)的右侧栏与「文件 / 终端 / 浏览器」共用同一套 apps 机制,第三方插件可以在里面再挂一个入口。长时间写 prompt、跑终端、查文档时,若希望旁边有一块不抢主工作区的「氛围区」——带画面、能听台、又不依赖单独开浏览器标签——就需要一个嵌在侧栏里的轻量方案。

下面介绍维护者 lemonhall 的 dsh-radio-dock(社区分类:趣味换装)。它把作者 Godot 项目 godot_citys 里的车载电台逻辑移植到 DSH:右侧栏一个 tab,three.js 渲染车内视角与弯夜公路,电台频道来自 radio-browser.info,预设标签含 City Pop 等方向。

这是什么

一句话:在 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 应用;宿主半边可热生效。

装好后:右侧栏点「+」→ 选择 📻 车载电台。

典型用法

  1. 安装 bundle 并按要求重启(若刚更新客户端脚本)。
  2. 在右侧栏添加「车载电台」tab,展开后可看到当前播放台、四个风格标签与 radio-browser 实时结果列表。
  3. 用开关、上下台、音量与 8 个快捷槽切换常听频道;场景在 tab 内持续渲染夜路。
  4. 若目录或流拉取失败,检查 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 步骤接入。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye