Steam 截图副本整理脚本

介绍

GitHub 仓库:https://github.com/ihainan/Steam-Screenshots-Organizer

基于 之前一个大佬的工作,编写了一个小工具用于批量整理 Steam 的未压缩截图副本。

脚本的运行效果:

整理前:

before

整理后:

after

使用

下载 screenshot-org.bat 和 screenshot-org.ps1 放到 Steam 截图副本目录下。

当需要整理截图的时候运行 screenshot-org.bat 文件,运行结束之后截图就会被移动到对应游戏名字的目录下面,如果有非 Steam 游戏的截图则会被放到 “Uncategorized Screenshots” 目录中。

原理

Steam 的截图副本命名格式类似于:1332010_20240526130334_1.png,其中 1332010 是游戏 ID。

Steam 本身提供了一个 API https://api.steampowered.com/ISteamApps/GetAppList/v2/ 能够获取商店中所有游戏的列表,包含游戏的 ID 和对应的名字。

脚本会将 API 的返回转换为一张表,根据截图名字的游戏 ID 检索得到游戏名,创建目录并将截图移动到该目录下面。

细节

Steam 提供的 API 在大陆地区访问非常慢,所以 我搭建了一个反代。在我自己的测试环境下速度提升非常明显。脚本默认使用了我这个反代:

1
2
$apiUrl = "https://steam.ihainan.me/ISteamApps/GetAppList/v2/"       # ihainan 反代的官方 API,用于提升在大陆地区的下载速度
# $apiUrl = "https://api.steampowered.com/ISteamApps/GetAppList/v2/" # Steam 官方 API 地址

只有在第一次使用脚本,或者截图对应游戏的 ID 不在本地缓存(app.json 文件)中时(可能是比较新的游戏),脚本才会调用 Steam API 重新获取完整的 App List(大约 80MB),从而提高平日运行的速度。

脚本在创建游戏目录之前会检查和过滤目录名不允许的无效字符。我测试过 Steam 数据库中的所有游戏,对于一些特殊名字的游戏做了处理以保证能够正常创建游戏目录。比如 这个游戏 API 返回的游戏名是 <|>,删除无效字符之后就剩下空串了,我就使用游戏 ID 做为目录名。

脚本还支持比较新的 AVIF HDR 截图文件。后续如果 Steam 还支持新的文件格式,可以修改如下代码行:

1
$fileExtensions = @("*.png", "*.avif")                               # 将会被整理的文件类型

问题

处理后的游戏名会有重名的可能,目前没有什么好的解决思路。

此外,Steam API 不知道为什么偶尔返回的 app 列表里面是缺失某些游戏的,如果脚本更新本地缓存之后还出现游戏被错误归类的问题,建议删除 app.json 重新运行。

其他

一个 AHK 脚本,每五分钟自动整理截图。

1
2
3
4
5
6
7
8
9
10
11
Loop
{
try {
RunWait A_ComSpec ' /c "Y:\Games\Screenshots\screenshot-org.bat"', , 'Hide'
} catch as e {
; wait for the next run
}

; sleep 5 minutes
Sleep 300000
}