dsh-skin:給 DeepSeek Harness 界面鋪一層壁紙

前言

DSH 的工作臺是長駐窗口,一打開就是幾小時。純色背景看久了容易疲勞,但給界面加背景這件事,多數皮膚插件只做到「換一套配色」,真正把壁紙放進去的很少。已有的做法通常是自己抓一張圖塞進 CSS,端口一變、文件路徑一變就失效,而且圖片緩存沒有着落。

下面介紹的 dsh-skin(架上包名 dsh-skin-bg)就是爲了這件事:把圖牀直鏈、本地圖片、Wallpaper Engine 庫裏的素材鋪到 DSH 界面背後,再配上透明度、模糊、輪播和快捷鍵。插件由 Avan0203 維護,在社區目錄裏歸在「趣味換裝」分類下,許可證爲 MIT。

這是什麼

一句話:這是一個 DSH 界面皮膚插件,把壁紙渲染在應用框架之下,用同源 HTTP 路由讀取本地媒體,用設置頁集中管理來源與外觀。

它解決三個問題:

  1. Web UI 跑在 http://127.0.0.1:<port> 上,瀏覽器讀不了 file:// 路徑,而 localStorage 又會因爲端口變化失效——所以配置和媒體都放在 Host 半邊。
  2. 壁紙來源不止一種(圖牀、本地、Wallpaper Engine),來源之間要能互斥切換,切換後立刻重建播放列表。
  3. 換壁紙不能影響操作:彈窗要保持實心、快捷鍵要能改、其他皮膚插件同時開啓時不要互相覆蓋顏色。

核心能力

三種壁紙來源

三選一,切換後立即重新加載並重建播放列表。

  • 圖牀鏈接:每行一個 https://… 直鏈,最多 100 條。支持 png jpg jpeg jfif webp gif avif bmp svg,也接受 mp4 webm ogv mov m4v 視頻。每次切換都會帶 fresh=1 重新取圖並按地址存檔,舊圖留在「已加載圖片」裏,重啓後仍在。
  • 本地圖片:填單個文件或整個目錄,最多分別爲 200 條和 50 條;也可以在設置裏點「選擇文件夾」導入(導入的是副本,原文件不動)。
  • Wallpaper Engine:指向創意工坊 431960 目錄或任意已下載壁紙目錄,自動掃描圖片和視頻,視頻靜音循環播放。

外觀與播放

三個滑桿控制層級:壁紙透明度(0–100)、界面不透明度(0–100,越低壁紙越明顯)、高斯模糊(0–80 px)。界面層的半透明是通過改寫 --dsw-alias-bg-base、--dsw-specific-sidebar-fill、--dsw-alias-bg-layer-1/2、--dsw-alias-bg-overlay 的 alpha 實現的,讀取的是當前令牌值,所以別的皮膚換的配色照樣會透出壁紙;彈窗用同一令牌的不透明副本兜住,[role="dialog"]、[aria-modal="true"] 始終實心。

輪播方面:間隔 3 秒~24 小時、隨機順序、0–5 秒交叉淡入淡出;視頻可以「播完自動切」或循環,默認靜音(被瀏覽器攔截自動播放時自動回退靜音)。

快捷鍵與持久化

兩條命令 dsh-skin-bg.next 和 dsh-skin-bg.previous 對應下一張 / 上一張,默認 Ctrl+Alt+←/→,macOS 爲 ⌘+⌥+Shift,可以在 設置 → 通用 → 快捷鍵 裏改鍵。註冊失敗會在面板裏說明,不會靜默忽略。

配置存在 $DSH_HOME/data/dsh-skin/config.json;媒體路由支持 Range,視頻可以拖動播放。界面語言中英雙語,跟隨 DSH 語言設置。

安裝與啓用

插件只在 Web UI 上渲染,前提是 DSH(桌面版或 dsh web)帶有 webServer 服務。DSH 的插件是裝在 profile 裏的普通 npm 包,沒有統一的 dsh plugin add 命令,需要自己進 profile 目錄執行。

方式一,從 GitHub 安裝(README 推薦的做法):

cd "$HOME/.dsh/profiles/desktop"
pnpm add github:Avan0203/dsh-skin

Windows 下 profile 默認在 %USERPROFILE%\.dsh\profiles\desktop。然後編輯同目錄的 package.json,把包名加進 dsh.profile.bundles:

{
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "dsh-skin-bg"
      ]
    }
  }
}

重啓 DSH,打開 設置 → 背景壁紙。注意一個容易踩的坑:倉庫名是 dsh-skin,但架上包名是 dsh-skin-bg——dsh-skin 這個名字在 npm 和插件市場索引裏已被同名插件佔用,bundles 裏要寫的是 dsh-skin-bg。

方式二,用 Release 裏的壓縮包:

cd "$HOME/.dsh/profiles/desktop"
pnpm add ./dsh-skin-bg-1.0.3.tgz

從 Releases 下載 dsh-skin-bg-<版本>.tgz(若該版本沒附帶壓縮包,用方式一或 GitHub 自動生成的 Source code 壓縮包),同樣把 "dsh-skin-bg" 加進 dsh.profile.bundles 並重啓。

方式三,本地開發 link,適合改代碼時用:

git clone https://github.com/Avan0203/dsh-skin.git
cd "$HOME/.dsh/profiles/desktop"
pnpm add link:/絕對路徑/dsh-skin

之後改 client.js 刷新頁面即可生效,改 index.js(Host 半邊)需要重啓 DSH。

1.0.x 升級時的包名變更

包名從 dsh-skin 改成了 dsh-skin-bg。升級步驟:

  1. profile 的 package.json 裏把 dsh-skin 換成 dsh-skin-bg(依賴與 dsh.profile.bundles 兩處);
  2. pnpm install,重啓 DSH。

設置和已存檔的壁紙不會動:數據目錄仍是 $DSH_HOME/data/dsh-skin/,HTTP 路由前綴仍是 /plugin-skin。唯一會變的是快捷鍵 id(dsh-skin.next → dsh-skin-bg.next),自定義過按鍵的話要在 設置 → 通用 → 快捷鍵 裏重設一次。

配置項

設置保存在 $DSH_HOME/data/dsh-skin/config.json,也可以直接改這個文件,改完重啓 DSH 或打開設置頁保存一次。常用字段如下:

字段 默認值 範圍 / 取值 說明
enabled true 布爾 關閉後立即移除壁紙層。
source "urls" urls / local / wallpaper 當前使用的來源。
urls [] 最多 100 條 圖牀直鏈。
folders [] 最多 50 條 本地圖片 / 視頻目錄。
files [] 最多 200 條 本地單個媒體文件。
cacheUrls true 布爾 開啓後每次切到圖牀圖都重新下載並另存;關閉後直接請求圖牀、不落盤(歷史存檔仍會列出)。
cacheDir "" 路徑 留空用 $DSH_HOME/data/dsh-skin/library。
wallpaperDir "" 路徑 Wallpaper Engine 創意工坊目錄。
opacity 100 0–100 壁紙本身的透明度。
surfaceOpacity 62 0–100 主界面面板的不透明度。
blur 0 0–80 壁紙的高斯模糊(像素)。
intervalSec 30 3–86400 輪播間隔(秒)。
random false 布爾 隨機播放。
advanceOnEnd true 布爾 視頻播完自動切下一張。
videoMuted true 布爾 視頻默認靜音。
fadeSec 1.2 0–5 兩張壁紙交叉淡入淡出時長(秒)。

典型用法

裝好之後,打開 設置 → 背景壁紙,按下面的順序配:

  1. 在「圖牀鏈接 / 本地圖片 / Wallpaper Engine」裏選一個來源,切換後立即重新加載。
  2. 填來源:粘貼圖牀直鏈、添加本地文件或目錄、或填 Wallpaper Engine 目錄後點「重新掃描」。
  3. 調外觀:先把「界面不透明度」調到 40~70,壁紙和控件都能看清;想讓壁紙更乾淨就把模糊加到 10~20 px。
  4. 設播放:輪播間隔按自己的節奏定,需要背景圖常變就把間隔設小;視頻不想要聲音就保持默認靜音。
  5. 用快捷鍵切圖:Ctrl+Alt+←/→。想讓壁紙只在不用 DSH 時出現,比起改快捷鍵,更直接的是用 enabled 開關或調低 opacity。

圖牀來源的圖會按地址分文件夾緩存,列表最多展示最近 5000 張。「已加載圖片」裏點縮略圖立即切回,懸停點 × 刪單張;右上的「清空」只清掉當前來源的地址列表,不刪緩存文件。

實現與安全邊界

插件分成兩半。index.js 是 Host 半邊,負責持久化配置並以同源 HTTP 路由提供媒體文件;client.js 是瀏覽器半邊,負責壁紙層、輪播、設置頁和快捷鍵;另有 cordis.patch.yml 往 profile 裏 insert 這個 bundle,locale/{zh,en}.json 提供雙語文案。

Host 需要一個 HTTP 路由前綴,掛在 /plugin-skin 下:

方法 路徑 用途
GET /plugin-skin/state 讀配置 + 當前播放列表,?refresh=1 強制重掃目錄。
POST /plugin-skin/config 保存整份配置(JSON)。
GET/HEAD /plugin-skin/media?path=… 流式讀取本地媒體文件。
GET/HEAD /plugin-skin/remote?url=… 代理並緩存圖牀圖片,&fresh=1 取一張新的並另存。
GET /plugin-skin/cache 列出已緩存的圖牀圖片。
POST /plugin-skin/upload?name=… 「選擇文件夾」導入時把文件寫入緩存目錄。

安全邊界寫得比較明確:

  • media 路由只放行當前配置裏聲明過的目錄 / 文件(由 source 決定白名單),其餘路徑 403;
  • 只放行白名單內的圖片 / 視頻擴展名,其餘 415;
  • 目錄掃描最多 4 層、4000 個條目,遠程下載 64 MB 上限、20 秒超時;
  • 除你主動添加的圖牀地址外不發起任何外部請求,不上傳、不統計,本地媒體只經 127.0.0.1 同源路由。

適用場景與注意

適合這幾類人:想把 DSH 工作臺換成自己熟悉的壁紙、已經有 Wallpaper Engine 素材庫、或者需要給截圖和錄屏換一個乾淨背景的開發者。只要用的是帶 webServer 的 DSH 構建,桌面版和 dsh web 都可以。

幾點要注意。

  • 插件以當前 DSH 進程的權限運行,並會註冊同源 HTTP 路由、讀寫 $DSH_HOME/data/ 下的目錄和 profile 裏的 package.json。安裝前先讀一遍源碼與許可證(本倉庫爲 MIT)再決定是否引入。
  • 已知邊界:圖牀來源的隨機播放不生效,圖牀按地址順序輪播;視頻播完自動切時,輪播間隔對該視頻不生效,切換時機由視頻時長決定;壁紙層固定在 z-index:-1,只做背景,不替換任何官方控件。
  • 與其他皮膚插件同時開啓不會打架:界面不透明度監聽 theme/change,每次用當時的令牌值重算 alpha。
  • 改動提醒:改 index.js 必須重啓 DSH,改 client.js 只需刷新頁面。

結尾

dsh-skin 做的事情很窄——把壁紙鋪到 DSH 界面底下,不碰控件、不做主題系統。真正值得借鑑的是它的工程取捨:配置放 Host 側、本地媒體走同源路由、內存之外再留一份按地址分文件夾的存檔,因此重啓不丟東西,快捷鍵和播放狀態也有兜底。

如果只是想換個背景、又不想自己維護一堆 CSS,這個插件可以直接用;想更進一步,/plugin-skin 的路由表和 cordis.patch.yml 就是全部實現入口。

  • 社區目錄:https://www.skillhub.cn/plugins/Avan0203/dsh-skin
  • 倉庫:https://github.com/Avan0203/dsh-skin
羽毛球分组比赛记分
小程序二维码

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

小夜