dsh-plugin-wallpaper-cleanup
jokerkenny00137/dsh-plugin-wallpaper-cleanup
对照“我的订阅壁纸”截图清理 Wallpaper Engine 工坊文件夹:识别蓝色勾选、OCR 磁贴标题并与 project.json 匹配,把非订阅壁纸移入回收站;带设置页与悬浮模态框,仅支持 Windows。
安装
dsh plugin --profile web add github:jokerkenny00137/dsh-plugin-wallpaper-cleanupREADME
dsh-plugin-wallpaper-cleanup
Wallpaper Engine 工坊清理插件。你选择 Steam 工坊内容文件夹 和 “我的订阅壁纸”截图(可多张,分页时一次选全),插件找出不属于你的壁纸文件夹,并把它们移入 Windows 回收站(可恢复)。
带图形界面:设置 → 壁纸清理,或右下角悬浮按钮。也保留两个 agent 工具,供对话里直接调用。
不依赖任何第三方 npm 包:截图识别用 Windows 自带的 Windows.Media.Ocr,回收站用 Microsoft.VisualBasic.FileIO,文件夹选择用系统原生对话框,全部通过随包携带的 PowerShell 脚本完成。因此只支持 Windows。
图形界面(推荐)
两种入口,内容完全一样:
- 右下角悬浮按钮「壁纸清理」→ 点一下直接弹出模态框(Esc 或点空白处关闭)。
- 或 设置(侧栏底部齿轮)→ 左侧 壁纸清理。
- 工坊文件夹:
- 桌面版 DSH 会调用内置的原生目录选择器;
- 普通浏览器打开时,点「选择文件夹…」会在页面里展开一个目录浏览器(驱动器 → 逐级进入 → 「使用此文件夹」);
- 也可以直接把路径粘贴到输入框。
- 订阅截图:点「选择截图…」,可以一次选中多张(订阅列表有多页时,把每一页都选中)。桌面版直接读取本地绝对路径(不复制文件);浏览器版会先上传到 DSH 数据目录。
- 点 开始扫描(每张截图约 20 秒)。插件会:
- 逐张识别每个磁贴右上角的蓝色勾选徽章,得到每一页的订阅数量;
- 用多倍率 OCR 读出每个磁贴的标题;
- 把所有页的磁贴合并后,与文件夹里的
project.json标题做 IDF 加权模糊匹配; - 列出“将保留”和“将移入回收站”两份清单。
- 核对清单后点 移入回收站(N 个),再点 确认执行。所有被移除的文件夹都进回收站,可还原。
如果某个磁贴 OCR 读不出来,页面会显示“未通过安全校验”并列出读到的文字(会标明是第几张截图的第几个磁贴)。展开“识别不准?手动补充标题”,把标题一行一个粘进去,再扫描一次即可(标题可以带 ... 截断)。
⚠️ 多页订阅列表请一次全部选中。只选其中一页时,其余页的壁纸会被当成“未订阅”,插件无法知道还有下一页;页面会在这种情况下给出“仅提供了 1 张截图”的额外警告。
安装 / 分发
从 GitHub 安装(推荐):
dsh plugin add github:jokerkenny00137/dsh-plugin-wallpaper-cleanup
也可以先克隆到本地,再用本地 bundle 安装:
plugin_manager install_bundle target: link:C:\path\to\dsh-plugin-wallpaper-cleanup
分发给别人时,把整个 dsh-plugin-wallpaper-cleanup 目录打包发过去,对方解压后用上面的命令安装即可(link: 指向解压后的目录)。安装后如果没看到“壁纸清理”,刷新一下页面(Ctrl+R)。
Agent 工具(可选)
对话里也可以让 agent 代跑:
wallpaper_cleanup_scan { "folder": "C:\\...\\431960", "screenshots": ["C:\\...\\page1.png", "C:\\...\\page2.png"] }
wallpaper_cleanup_apply { "planId": "<scan 返回的>", "confirm": true }
也兼容旧的单张写法 "screenshot": "C:\\...\\shot.png"。
scan 只生成计划不删除;apply 必须 confirm: true,计划不安全时要显式 force: true。
scan 也支持直接传 titles: ["标题1", "标题2", ...] 跳过 OCR(多页标题可以全部列进来)。
安全边界
- 只处理
folder的直接子目录,且目录名必须是纯数字(Steam 工坊 ID)。 - 必须有可读的
project.json标题,否则跳过并报告,绝不删除。 - 执行前重新检查:保留项仍在、待删项仍是直接子目录;任何异常都会整体中止。
- 只有所有截图的所有磁贴都匹配到文件夹、且数量与徽章总数一致时,才允许执行;缺一张截图、缺一个磁贴都会阻止删除。
- 只调用回收站 API,不永久删除;不碰
appworkshop_*.acf、Steam 配置或文件夹之外的任何内容。 - HTTP 接口要求同源请求头,跨站页面无法调用。
匹配原理(简述)
- 颜色聚类找出每张截图里每个磁贴右上角的蓝色勾选徽章,得到磁贴网格和该页的订阅数量。
- Windows OCR 在 3×/4×/5× 三个放大倍数下识别整张截图,按坐标把文字归到各磁贴;跨磁贴的合并行会同时喂给相邻两个磁贴。
- 对所有页的磁贴,用 IDF 加权的字符二元组覆盖率 给所有文件夹标题打分:稀有词(“通缉”“刻晴”)权重高,通用词(“明日方舟”“Wuthering Waves”)权重低,OCR 误字和多余文字不会拖垮正确匹配。
- 跨页全局贪心分配:每个磁贴最多认领一个文件夹、每个文件夹最多被一个磁贴认领;同一壁纸出现在多页时只算一次。
- 只要有一个磁贴没配上,或配上的数量与徽章总数不一致,就标记为不安全,界面会禁用删除。
限制
- Windows only;需要系统安装中文 OCR 语言包(中文 Windows 默认自带)。没有中文 OCR 时建议用“手动补充标题”。
- 截图需要是 Wallpaper Engine 默认深色主题的“已订阅/已安装”网格(蓝色勾选徽章)。自定义主题若更换了勾选颜色,请用标题模式。
- 多页订阅列表必须一次全部选中;插件无法从单页截图推断是否还有下一页,但会在这类计划上给出警告。
- 每个磁贴仍需能被 OCR 读到至少一部分文字;完全读不出的磁贴会让计划变为“不安全”,可用标题模式补齐。