본문으로 건너뛰기
J

dsh-plugin-wallpaper-cleanup

jokerkenny00137/dsh-plugin-wallpaper-cleanup

Cleans a Wallpaper Engine workshop folder against a screenshot of your subscriptions: it finds the blue check badges, OCRs the tile titles, matches them to each project.json title, and moves non-subscribed wallpapers to the Recycle Bin. Ships a settings page and a floating modal, and is Windows-only.

설치

dsh plugin --profile web add github:jokerkenny00137/dsh-plugin-wallpaper-cleanup

README

dsh-plugin-wallpaper-cleanup

Wallpaper Engine 工坊清理插件。你选择 Steam 工坊内容文件夹 和 “我的订阅壁纸”截图(可多张,分页时一次选全),插件找出不属于你的壁纸文件夹,并把它们移入 Windows 回收站(可恢复)。

带图形界面:设置 → 壁纸清理,或右下角悬浮按钮。也保留两个 agent 工具,供对话里直接调用。

不依赖任何第三方 npm 包:截图识别用 Windows 自带的 Windows.Media.Ocr,回收站用 Microsoft.VisualBasic.FileIO,文件夹选择用系统原生对话框,全部通过随包携带的 PowerShell 脚本完成。因此只支持 Windows。

图形界面(推荐)

两种入口,内容完全一样:

  • 右下角悬浮按钮「壁纸清理」→ 点一下直接弹出模态框(Esc 或点空白处关闭)。
  • 或 设置(侧栏底部齿轮)→ 左侧 壁纸清理。
  1. 工坊文件夹:
    • 桌面版 DSH 会调用内置的原生目录选择器;
    • 普通浏览器打开时,点「选择文件夹…」会在页面里展开一个目录浏览器(驱动器 → 逐级进入 → 「使用此文件夹」);
    • 也可以直接把路径粘贴到输入框。
  2. 订阅截图:点「选择截图…」,可以一次选中多张(订阅列表有多页时,把每一页都选中)。桌面版直接读取本地绝对路径(不复制文件);浏览器版会先上传到 DSH 数据目录。
  3. 点 开始扫描(每张截图约 20 秒)。插件会:
    • 逐张识别每个磁贴右上角的蓝色勾选徽章,得到每一页的订阅数量;
    • 用多倍率 OCR 读出每个磁贴的标题;
    • 把所有页的磁贴合并后,与文件夹里的 project.json 标题做 IDF 加权模糊匹配;
    • 列出“将保留”和“将移入回收站”两份清单。
  4. 核对清单后点 移入回收站(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 接口要求同源请求头,跨站页面无法调用。

匹配原理(简述)

  1. 颜色聚类找出每张截图里每个磁贴右上角的蓝色勾选徽章,得到磁贴网格和该页的订阅数量。
  2. Windows OCR 在 3×/4×/5× 三个放大倍数下识别整张截图,按坐标把文字归到各磁贴;跨磁贴的合并行会同时喂给相邻两个磁贴。
  3. 对所有页的磁贴,用 IDF 加权的字符二元组覆盖率 给所有文件夹标题打分:稀有词(“通缉”“刻晴”)权重高,通用词(“明日方舟”“Wuthering Waves”)权重低,OCR 误字和多余文字不会拖垮正确匹配。
  4. 跨页全局贪心分配:每个磁贴最多认领一个文件夹、每个文件夹最多被一个磁贴认领;同一壁纸出现在多页时只算一次。
  5. 只要有一个磁贴没配上,或配上的数量与徽章总数不一致,就标记为不安全,界面会禁用删除。

限制

  • Windows only;需要系统安装中文 OCR 语言包(中文 Windows 默认自带)。没有中文 OCR 时建议用“手动补充标题”。
  • 截图需要是 Wallpaper Engine 默认深色主题的“已订阅/已安装”网格(蓝色勾选徽章)。自定义主题若更换了勾选颜色,请用标题模式。
  • 多页订阅列表必须一次全部选中;插件无法从单页截图推断是否还有下一页,但会在这类计划上给出警告。
  • 每个磁贴仍需能被 OCR 读到至少一部分文字;完全读不出的磁贴会让计划变为“不安全”,可用标题模式补齐。

관련 플러그인