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 步驟接入。

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

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

小夜