前言¶
DSH 的工作臺是長駐窗口,一打開就是幾小時。純色背景看久了容易疲勞,但給界面加背景這件事,多數皮膚插件只做到「換一套配色」,真正把壁紙放進去的很少。已有的做法通常是自己抓一張圖塞進 CSS,端口一變、文件路徑一變就失效,而且圖片緩存沒有着落。
下面介紹的 dsh-skin(架上包名 dsh-skin-bg)就是爲了這件事:把圖牀直鏈、本地圖片、Wallpaper Engine 庫裏的素材鋪到 DSH 界面背後,再配上透明度、模糊、輪播和快捷鍵。插件由 Avan0203 維護,在社區目錄裏歸在「趣味換裝」分類下,許可證爲 MIT。
這是什麼¶
一句話:這是一個 DSH 界面皮膚插件,把壁紙渲染在應用框架之下,用同源 HTTP 路由讀取本地媒體,用設置頁集中管理來源與外觀。
它解決三個問題:
- Web UI 跑在
http://127.0.0.1:<port>上,瀏覽器讀不了file://路徑,而localStorage又會因爲端口變化失效——所以配置和媒體都放在 Host 半邊。 - 壁紙來源不止一種(圖牀、本地、Wallpaper Engine),來源之間要能互斥切換,切換後立刻重建播放列表。
- 換壁紙不能影響操作:彈窗要保持實心、快捷鍵要能改、其他皮膚插件同時開啓時不要互相覆蓋顏色。
核心能力¶
三種壁紙來源¶
三選一,切換後立即重新加載並重建播放列表。
- 圖牀鏈接:每行一個
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。升級步驟:
- profile 的
package.json裏把dsh-skin換成dsh-skin-bg(依賴與dsh.profile.bundles兩處); 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 | 兩張壁紙交叉淡入淡出時長(秒)。 |
典型用法¶
裝好之後,打開 設置 → 背景壁紙,按下面的順序配:
- 在「圖牀鏈接 / 本地圖片 / Wallpaper Engine」裏選一個來源,切換後立即重新加載。
- 填來源:粘貼圖牀直鏈、添加本地文件或目錄、或填 Wallpaper Engine 目錄後點「重新掃描」。
- 調外觀:先把「界面不透明度」調到 40~70,壁紙和控件都能看清;想讓壁紙更乾淨就把模糊加到 10~20 px。
- 設播放:輪播間隔按自己的節奏定,需要背景圖常變就把間隔設小;視頻不想要聲音就保持默認靜音。
- 用快捷鍵切圖:
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