dsh-theme-mediascape
Media-scape theme for the DSH web UI: standing/character-art and video wallpapers (mp4/webm, local + online) with boot animation, base color schemes (single-source JSON + presets + picker), capsule host-element styling, ambient particles, background music player (covers/playlists/random), typing sou
Install
dsh plugin --profile web add dsh-theme-mediascape
Sandbox test
This plugin has not been tested yet. Submit a test →
README
dsh-theme-mediascape
媒体景观主题 —— DeepSeek Harness(DSH)Web UI 主题插件:立绘/视频壁纸 × 基底配色 × 开屏动画 × 氛围粒子 × 背景音乐 × 打字音效。
界面预览:theme-studio/ 独立预览环境(真实前后端,见「theme-studio/ 预览环境」)
- [功能总览](#功能总览)
- [一、壁纸系统](#一壁纸系统)
- [二、基底配色](#二基底配色)
- [三、开屏动画](#三开屏动画)
- [四、氛围粒子与字号调节](#四氛围粒子与字号调节)
- [五、背景音乐](#五背景音乐)
- [六、打字音效](#六打字音效)
- [七、界面操作(dock 工具条)](#七界面操作dock-工具条)
- [八、在线资源与自定义素材](#八在线资源与自定义素材)
- [目录结构](#目录结构)
- [媒体加载与鉴权代理](#媒体加载与鉴权代理视频开屏加载不出来时看这里)
- [安装与要求](#安装与要求)
- [theme-studio/ 预览环境](#theme-studio-预览环境)
- [配色盘独立分发调研](#配色盘独立分发调研设计前置考量保持内置的理由)
- [演进总结(提交消息归纳)](#演进总结提交消息归纳)
- [版本记录](#版本记录)
- [注意事项](#注意事项)
功能总览
功能块 · 做什么 · 入口
mht 快照还原预览 · preview.html 直接解析 DSH 界面 .mht 快照还原为静态预览(聊天框+侧边栏+壁纸背景+dock),叠加假数据(操作日志→模拟用户消息、任务列表「预览页加载」自动完成、工作区一个文件夹一个会话)、侧边栏收起按 DSH 真实行为(会话列表 DOM 移除)、操作日志/顶部提示默认隐藏+「日志」开关 · theme-studio/preview.html
宿主元素配色 · 胶囊配方外置 JSON(选择器/背景源/透明度/圆角/padding)+ 层级注入(按 parent 拓扑排序:父先子后、子级自然覆盖父级)+ 品牌区 sidebar-brand 独立键(lPcGpa_brand 背景+文字一体),取色器胶囊 tab 可编辑保存并自动 build · theme-studio/capsules.json
启动播放策略 · 视频壁纸/背景音乐启动时是否自动播放独立配置 · theme-studio/playback.json
开屏动画 · 启动页 gif/图片/视频多画面轮换 + 渐显式无黑屏窗口(浮层立即盖界面,等待期氛围粒子+呼吸光圈、媒体首帧就绪后渐变淡入)+ 可配置标题副标题 + 视频 Range 流式 + HTTP 缓存(ETag+If-Range 重播省 80% 流量);file:"auto" 时开屏即当前视频壁纸(与壁纸层同一份流,播完移交、不重复加载) · boot/boot.json 配置
字号调节 · 会话区与状态文字四档缩放(小/标准/大/特大),点击「字」循环切换、按钮不显示大小(大小自行感知) · dock「字」按钮
壁纸系统 · 图片/视频壁纸铺底、上传持久化、本地在线共存。背景氛围粒子 · dock「景」按钮
上传体系 · 中途不落盘(上传数据先攒内存缓冲,上限=可用内存 20% 动态,超限转 .tmp 保底)、暂停落盘 .part + 继续从 .part 续传(?offset= 追加续写,取消 DELETE /upload/part 清理快照)、上传前「文件名+大小」去重预检(重复的文件在二级面板提示「已跳过」,不发送请求)、dock「传」统一上传入口(按文件后缀天然识别壁纸/音乐,一次多选统一分发)、上传进度二级面板(多行对齐/进度条/大小/速度 EMA/暂停/继续/取消)、上传开始前与结束后各刷新一次列表(内置在公共函数)、上传完释放连接(串行上传不占满浏览器同源 6 连接) · dock「传」按钮
打字音效 · 输入框打字按键音 + 壁纸音量调节 · dock「声」按钮
背景音乐 · 播放器(旋转唱片/封面/进度条可拖动)、歌单选择/随机、本机添加 · dock「乐」按钮
一、壁纸系统
- 全屏
cover铺底;中间画面全透明(壁纸区域不铺底色:--dsw-alias-bg-base: transparent、html 深色兜底#0a0c12、无蒙雾遮罩层;主题色只作用于侧边栏/对话框/按钮等组件) - 双层结构(图片常驻 + 视频可选覆盖):图片壁纸一直存在(无类型切换按钮);「视频:开/关」开关决定是否加载视频,开则视频覆盖在图片之上显示(图片仍在,仅被完全挡住),关则只显示图片。图片层与视频层各自独立记忆当前壁纸
- 选择:弹出缩略图网格(正方形预览、固定三行、可滚动),点卡片直接应用——按视频开关只显示一层:关=图片列表,开=视频列表
- 模式切换(面板「模式」一行):按钮标题跟随状态——亮=「视频」/ 暗=「图片」(标题实时切换,不再固定显示「视频壁纸」);dock「景」按钮悬停标题也只显示当前层(视频模式→视频名 / 图片模式→图片名),不再并列两个标题
- 移除:勾选后移除 = 真实删除服务器文件(壁纸/音乐统一同一份删除逻辑:开始前/结束后各刷新一次列表,音乐封面随歌曲一并删除)
- 随机:随机模式走面板模式单按钮(循环/顺序/随机单按钮切换;选择器已去掉随机按钮)——进入随机后按当前层轮换,随机间隔自定义分钟(默认 5 分钟);随机/顺序作用于最上层(视频开→视频层内切换,视频播完自动切下一张;关→图片层分钟定时切换);随机池跨层兼容——池在图片模式勾选而当前是视频层(或反之)时自动回退当前层全部,视频播完仍会切换、不会停住
- 切换日志:每次壁纸切换(视频 ended 切下一张 / 图片定时随机 / 手动切壁纸 / 模式切换)自动上报一行到运行态
$DSH_HOME/theme-mediascape/logs/wallpaper.log(GET /theme-mediascape-assets/wallpaper/log?lines=50可回读最近 N 行,自检/排查切换是否发生用) - 视频无缝切换预加载(2026-09-29):顺序/随机模式多视频轮换时,当前视频播放剩余 3s(
timeupdate阈值)即预创建并预缓冲下一视频(隐藏元素、preload=auto、未挂 DOM);ended切换时若预载目标命中且已就绪(readyState≥2)直接复用该元素(已缓冲数据,播放即出画面)——切换无加载间隙黑屏;未命中/未就绪照常新建不阻塞;关闭视频层/切换不匹配时自动清理预载(不占用连接)。 - 添加壁纸:dock「传」按钮统一入口(按文件后缀天然识别壁纸/音乐,一次多选统一分发)——上传立即生效并服务器磁盘持久化(
$DSH_HOME/theme-mediascape/wallpaper/,刷新/重启/换浏览器都在)——上传视频(mp4/webm,浏览器原生可播)自动开视频层并加载它;上传图片更新图片层(视频开关状态不变) - 落盘 = 原始文件名(不做 SHA 重命名;同名同大小视为重复复用,同名不同大小自动加 (1)(2)… 后缀);前端直接显示文件名(去扩展名)
- 中途不落盘:上传数据先攒内存缓冲(上限=可用内存 20% 动态,
os.freemem()),超限自动转写.upload-<traceId>.tmp保底(超大文件不 OOM);上传过程中素材目录不出现.part中间态,end后正式文件落定(finalizeUpload按「文件名+大小」去重);上传完成落定后自动清理同名孤儿.part快照(上次中断/暂停未续传的残留,不留盘) - 暂停落盘
.part+ 继续从.part续传:点「⏸」abort 当前请求 → 服务端把已收内存缓冲落盘为<正式名>.part暂停快照(内存即刻释放);点「▶」带?offset=<已传字节>续传 —— 服务端校验.part存在且大小一致(不匹配返回 409,前端从头重传,杜绝残缺落盘),对.part追加续写,收完 rename 落定,不重传已传部分;「✕」取消 →DELETE /upload/part?name=<文件>清理快照 - 上传前「文件名+大小」去重预检:重复的文件在二级面板提示「已跳过」(不请求);去重基准/移除目标只认「真实可用」项(列表 stat 失败的文件已从服务端列表剔除,前端
isItemUsable只认 file/name + size 数字) - 上传进度:上传时 dock 二级面板自动弹出(
dock.__mediascapeDshCenter定位靠 dock,点外自动收起)——每任务一行(文件名 + 进度条 + 叠加「已传/总 · 速度」),多任务动态多行且各列对齐,无任务自动隐藏;速度读数 EMA 平滑(progress 事件间隔不均不跳变) - 开始前/结束后各刷新一次列表(内置在公共上传/移除函数内):上传前刷新保证去重基准最新,结束后刷新保证新文件即时入列表;移除同理(删除前刷新、删除后刷新)
- 上传完释放连接:串行上传(一次一个请求,不占满浏览器同源 6 连接),每个 XHR 完成即释放引用
- 上传不关闭二级面板:
input.click()打开系统选择器的 click 冒泡不再触发「点外关闭」(捕获阶段 stopPropagation) - 跨设备即时可见:打开壁纸面板自动刷新列表,其他设备上传的壁纸无需手动刷新网页
- 上传上限:按服务器剩余磁盘空间动态计算(默认单文件最多占剩余空间 80%,底线 512MB),快满自动收紧
- 默认壁纸:首次安装(无历史记录)时展示真实数据目录第一张壁纸(本地/在线均可)
- 面板点右上角「—」或再点「选择」收起;「确定」收起设置面板,设置实时生效并持久化
二、基底配色
- 覆盖 100+ 个
--dsw-*设计令牌,随主题即时生效;正式基底 = 左侧「应用」写入真源 json 的当前值(以lib/client-parts/foundation/tokens.js与取色器为准,文档不写死) - 单 json 真源 + 预设包(V2 架构,json 化):应用配色只读一个 json——真源
theme-studio/json/theme-colors.json(label/badge + bg 系层级 bg/bgSoft/bgLayer + colors 全部元素色,每个颜色带不透明度 alpha{hex, alpha},是唯一写盘目标);预设包是theme-studio/json/preset/*.json(只承载颜色集合 + 显示名,不含 bg 系),用于把真源快速改成预设配色;没有预设也能纯手改(左侧输入颜色值)。apply自始至终只跟真源 json 相关 - 取色器
theme-studio/theme-swatch.html(双 tab:配色 / 胶囊):配色 tab 顶部 = 背景层级区块(bg→bgSoft→bgLayer 缩进展示,改 bg 系 → dock/面板/胶囊 layer 跟随层联动),左侧 = 当前主题元素 class 控件列表(json 数据驱动,每行 6 列:元素名/类键/色号手输/色块/真实元素样子分片/不透明度滑块,滑块先预览第 5 列、点「应用」才写盘),「重置」还原真源,「应用」真正写入真源 json 并自动 build(POST /api/theme-apply { items:[{key,hex,alpha}] },原子写真源 → identity.js/tokens.js → build);右侧 = 预设包(下拉选择 + 逐行显示该预设颜色,「套到左侧全部」全量套 / 每行「应用」= 单项套该预设该键色到左侧,键缺失→无色透明行且不可应用;「存为新预设」POST /api/theme-export;「改名」写回预设 json 的 label,改/导出只作用预设包)。键 = 元素 class:15 键各自唯一(btn-primary/text-primary/gold-glow/status-capsule/sidebar-left/sidebar-brand…),无独立语义键,应用/写回按同名键直取;不透明度滑块读取真源 json 的 alpha 现值(非默认 1),拖滑先预览第 5 列真实元素样子、点「应用」才写盘 - 品牌区单独控制:
sidebar-brand键驱动左侧边栏品牌区(lPcGpa_brand,CSS Modules 尾缀_brand/_brandName稳定不随 hash 变)——背景 + 品牌名文字一体(--dsw-specific-sidebar-brand/--dsw-specific-sidebar-brand-text令牌);层级注入:sidebar-left(整体,--dsw-specific-sidebar-fill)先注入 → 品牌区后注入,同特异性自然覆盖整体底 - 胶囊层级注入:
capsuleCSS()渲染时按parent关系拓扑排序(深度优先、父先子后)——外层胶囊先注入、内层后注入,同特异性选择器后写覆盖先写(子级自然覆盖父级);同层保持原数组顺序(
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::2,最后更新 2026-10-13