[2026-06-21] eagle: family/how-to/htpc-emulators-setup.md family/how-to/htpc-steam-nonsteam-shortcuts.md
This commit is contained in:
@@ -412,7 +412,7 @@ CACHE="$HOME/.var/app/org.libretro.RetroArch/config/retroarch/system/Mupen64plus
|
|||||||
|
|
||||||
| Игра | ROM slug | Статус |
|
| Игра | ROM slug | Статус |
|
||||||
|------|----------|--------|
|
|------|----------|--------|
|
||||||
| Animal Crossing New Horizons | `animal_crossing.nsp` | ❓ |
|
| Animal Crossing New Horizons | `animal_crossing.nsp` | ✅ работает |
|
||||||
| Donkey Kong Country Tropical Freeze | `donkey_kong.nsp` | ✅ работает |
|
| Donkey Kong Country Tropical Freeze | `donkey_kong.nsp` | ✅ работает |
|
||||||
| Super Mario Odyssey | `mario_odyssey.nsp` | ✅ работает |
|
| Super Mario Odyssey | `mario_odyssey.nsp` | ✅ работает |
|
||||||
| Mario Kart 8 Deluxe | `mario_kart_8.nsp` | ✅ работает |
|
| Mario Kart 8 Deluxe | `mario_kart_8.nsp` | ✅ работает |
|
||||||
|
|||||||
@@ -16,38 +16,46 @@ systemctl --user start gamescope-session-plus@steam.service
|
|||||||
|
|
||||||
Если после stop Steam всё ещё активен — повторить.
|
Если после stop Steam всё ещё активен — повторить.
|
||||||
|
|
||||||
## Единственный правильный способ — vdf.binary_load
|
## Процедура (один bash-скрипт)
|
||||||
|
|
||||||
**Процедура (один py-скрипт, с бэкапом):**
|
Один скрипт на HTPC: останавливает Steam → делает бэкап → редактирует VDF → запускает Steam.
|
||||||
|
|
||||||
1. Остановить Steam
|
|
||||||
2. Сделать бэкап shortcuts.vdf
|
|
||||||
3. Отредактировать VDF
|
|
||||||
4. Запустить Steam
|
|
||||||
|
|
||||||
Использовать модуль `vdf` (установлен на HTPC через pip). **Никогда** не редактировать бинарный VDF через ручную сборку байтов или замену строк — это ломает файл.
|
Использовать модуль `vdf` (установлен на HTPC через pip). **Никогда** не редактировать бинарный VDF через ручную сборку байтов или замену строк — это ломает файл.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 1. Остановить Steam
|
||||||
|
systemctl --user stop gamescope-session-plus@steam.service
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# 2. Бэкап
|
||||||
|
cp ~/.steam/steam/userdata/147839491/config/shortcuts.vdf{,.bak}
|
||||||
|
|
||||||
|
# 3. Редактировать VDF (скрипт лежит рядом)
|
||||||
|
python3 /path/to/edit_vdf.py
|
||||||
|
|
||||||
|
# 4. Запустить Steam
|
||||||
|
systemctl --user start gamescope-session-plus@steam.service
|
||||||
|
```
|
||||||
|
|
||||||
|
Python-скрипт (`edit_vdf.py`):
|
||||||
```python
|
```python
|
||||||
import os, vdf, shutil, binascii, struct
|
import os, vdf, shutil, binascii, struct
|
||||||
|
|
||||||
vdf_path = os.path.expanduser('~/.steam/steam/userdata/147839491/config/shortcuts.vdf')
|
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:
|
with open(vdf_path, 'rb') as f:
|
||||||
data = vdf.binary_load(f)
|
data = vdf.binary_load(f)
|
||||||
|
|
||||||
shortcuts = data.get('shortcuts', {})
|
shortcuts = data.get('shortcuts', {})
|
||||||
|
|
||||||
# 3. Вычислить appid (алгоритм Steam)
|
|
||||||
def compute_appid(name, exe):
|
def compute_appid(name, exe):
|
||||||
key = exe + name
|
key = exe + name
|
||||||
top = binascii.crc32(key.encode('utf-8')) | 0x80000000
|
top = binascii.crc32(key.encode('utf-8')) | 0x80000000
|
||||||
return struct.unpack('i', struct.pack('I', top))[0]
|
return struct.unpack('i', struct.pack('I', top))[0]
|
||||||
|
|
||||||
# 4. Создать entry
|
|
||||||
next_idx = str(len(shortcuts))
|
next_idx = str(len(shortcuts))
|
||||||
shortcuts[next_idx] = {
|
shortcuts[next_idx] = {
|
||||||
'AppName': 'Game Name',
|
'AppName': 'Game Name',
|
||||||
@@ -68,12 +76,13 @@ shortcuts[next_idx] = {
|
|||||||
'tags': {},
|
'tags': {},
|
||||||
}
|
}
|
||||||
|
|
||||||
# 5. Записать
|
|
||||||
data['shortcuts'] = shortcuts
|
data['shortcuts'] = shortcuts
|
||||||
with open(vdf_path, 'wb') as f:
|
with open(vdf_path, 'wb') as f:
|
||||||
vdf.binary_dump(data, f)
|
vdf.binary_dump(data, f)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Скрипты на HTPC загружать через scp, не через heredoc.
|
||||||
|
|
||||||
## CompatToolMapping (Proton) в config.vdf
|
## CompatToolMapping (Proton) в config.vdf
|
||||||
|
|
||||||
После добавления shortcut нужно прописать Proton в текстовом `config.vdf`:
|
После добавления shortcut нужно прописать Proton в текстовом `config.vdf`:
|
||||||
|
|||||||
Reference in New Issue
Block a user