91 lines
3.0 KiB
Markdown
91 lines
3.0 KiB
Markdown
# Non-Steam Shortcuts через VDF
|
|
|
|
## Главное правило
|
|
|
|
**Steam должен быть выключен** перед записью shortcuts.vdf. Если Steam работает — он перезапишет файл из памяти при следующем запуске.
|
|
|
|
## Единственный правильный способ — vdf.binary_load
|
|
|
|
Использовать модуль `vdf` (установлен на HTPC через pip). **Никогда** не редактировать бинарный VDF через ручную сборку байтов или замену строк — это ломает файл.
|
|
|
|
```python
|
|
import os, vdf, shutil, binascii, struct
|
|
|
|
vdf_path = os.path.expanduser('~/.steam/steam/userdata/147839491/config/shortcuts.vdf')
|
|
|
|
# 1. Бэкап
|
|
shutil.copy2(vdf_path, vdf_path + '.bak')
|
|
|
|
# 2. Загрузить существующий
|
|
with open(vdf_path, 'rb') as f:
|
|
data = vdf.binary_load(f)
|
|
|
|
shortcuts = data.get('shortcuts', {})
|
|
|
|
# 3. Вычислить appid (алгоритм Steam)
|
|
def compute_appid(name, exe):
|
|
key = exe + name
|
|
top = binascii.crc32(key.encode('utf-8')) | 0x80000000
|
|
return struct.unpack('i', struct.pack('I', top))[0]
|
|
|
|
# 4. Создать entry
|
|
next_idx = str(len(shortcuts))
|
|
shortcuts[next_idx] = {
|
|
'AppName': 'Game Name',
|
|
'Exe': '/path/to/game.exe',
|
|
'StartDir': '/path/to/',
|
|
'LaunchOptions': '',
|
|
'appid': compute_appid('Game Name', '/path/to/game.exe'),
|
|
'IsHidden': 0,
|
|
'AllowDesktopConfig': 1,
|
|
'AllowOverlay': 1,
|
|
'OpenVR': 0,
|
|
'Devkit': 0,
|
|
'DevkitGameID': '',
|
|
'DevkitOverrideAppID': 0,
|
|
'LastPlayTime': 0,
|
|
'FlatpakAppID': '',
|
|
'sortas': '',
|
|
'tags': {},
|
|
}
|
|
|
|
# 5. Записать
|
|
data['shortcuts'] = shortcuts
|
|
with open(vdf_path, 'wb') as f:
|
|
vdf.binary_dump(data, f)
|
|
```
|
|
|
|
## CompatToolMapping (Proton) в config.vdf
|
|
|
|
После добавления shortcut нужно прописать Proton в текстовом `config.vdf`:
|
|
|
|
```python
|
|
import vdf
|
|
|
|
CONFIG_PATH = os.path.expanduser('~/.local/share/Steam/config/config.vdf')
|
|
with open(CONFIG_PATH, 'r') as f:
|
|
config = vdf.load(f)
|
|
|
|
compat_map = config['InstallConfigStore']['Software']['Valve']['Steam'].setdefault('CompatToolMapping', {})
|
|
compat_map[str(appid_signed)] = {
|
|
'name': 'GE-Proton10-34', # или 'proton_experimental'
|
|
'config': '',
|
|
'Priority': '250',
|
|
}
|
|
|
|
with open(CONFIG_PATH, 'w') as f:
|
|
vdf.dump(config, f)
|
|
```
|
|
|
|
## Полный скилл
|
|
|
|
Вся процедура (shortcuts + Proton + artwork) описана в скилле `steam-emulator-shortcuts`. Смотреть там.
|
|
|
|
## Бэкап
|
|
|
|
Автоматический бэкап `shortcuts.vdf` делается ежедневно скриптом `backup-saves.sh` на HTPC, версии хранятся в `/run/media/bazzite/Data/backups/saves/shortcuts/` (последние 30 копий).
|
|
|
|
## Перезагрузка Steam
|
|
|
|
После записи VDF — перезапустить Steam, чтобы он подхватил изменения.
|