Files
obsidian-vault/family/how-to/htpc-steam-nonsteam-shortcuts.md
T
2026-05-29 08:57:18 +00:00

3.0 KiB

Non-Steam Shortcuts через VDF

Главное правило

Steam должен быть выключен перед записью shortcuts.vdf. Если Steam работает — он перезапишет файл из памяти при следующем запуске.

Единственный правильный способ — vdf.binary_load

Использовать модуль vdf (установлен на HTPC через pip). Никогда не редактировать бинарный VDF через ручную сборку байтов или замену строк — это ломает файл.

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:

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, чтобы он подхватил изменения.