---
title: 'TTG Batocera Store'
url: 'https://wiki.teletypegames.org/hu/stores/ttg-batocera-store'
markdown: 'https://wiki.teletypegames.org/hu/stores/ttg-batocera-store.md'
lang: hu
date: '2026-08-10'
description: 'A ttg-batocera-store felteszi a katalógusunkat a Batocerára. A https://teletypegames.org WarpEngine-katalógusából lehúzza a játékokat a dobozra, kiírja az EmulationStation-metaadatokat és a borítóképeket, és saját menübejegyzést ad az áruháznak — Teletype Games —, ahonnan újra futtatható az új kia…'
taxonomy:
  tag:
    - howto
---

# TTG Batocera Store

> A `ttg-batocera-store` felteszi a katalógusunkat a [Batocerára](https://batocera.org). A <https://teletypegames.org> [WarpEngine](https://wiki.teletypegames.org/hu/engines/warp-engine)-katalógusából lehúzza a játékokat a dobozra, kiírja az EmulationStation-metaadatokat és a borítóképeket, és **saját menübejegyzést** ad az áruháznak — *Teletype Games* —, ahonnan újra futtatható az új kiadásokért.

Ez a repó csak az áruházdefiníció: egy `config.json` és két indítószkript. A logika a közös motorban van, a [warp-engine-batocera-store](https://wiki.teletypegames.org/hu/stores/warp-engine-batocera-store) repóban — ez annak a Teletype Games-konfigurációja.

Ha nem Batocera-dobozon, hanem RetroArchon szeretnéd — asztali gépen, Androidon, Steam Decken, kézikonzolon —, használd a [TTG RetroArch Store](https://wiki.teletypegames.org/hu/stores/ttg-retroarch-store) áruházat.

# Amit kapsz

- **Saját menübejegyzés** — *Teletype Games* a fő körhintában, benne platformonként egy mappával és egy *Update Teletype Games* bejegyzéssel, amely egy kattintással letölt minden újdonságot.
- **Parancssor SSH-n** — `list`, `sync`, `remove`, `config`, szárazon futtatással, címenkénti szinkronnal és felülbírálásokkal.
- **A könyvtáradhoz nem nyúl** — a játékok a `/userdata/roms/teletypegames/` alatt élnek, nem a doboz saját rendszereiben, így a szinkron vagy a takarítás semmihez nem érhet hozzá, ami a tiéd. A mi játékainkon a kedvencek és a játékszámlálók túlélik az újraírást.
- **Borítókép és metaadat** — cím, leírás, szerző és kép beleolvad a `gamelist.xml` fájlba, így a játékok úgy néznek ki, mintha be lettek volna szkennelve.
- **Nulla függőség** — csak a Python 3 szabványkönyvtára.
- **Idempotens szinkronok** — a meglévő fájlokhoz nem nyúl, egy kiadásemelés kicseréli a régi assetet. A letöltések az `/api/download` végponton mennek, de a teletypegames.org szándékosan kihagyja a letöltésszámból az áruház `warpstore/*` user agentjét, így a dobozra telepítések nem jelennek meg a statisztikában.

# Áttekintés

```
Teletype Games ▸ "Update Teletype Games"
        │
        ├─ GET /api/software                        a teljes katalógus
        ├─ a doboz által futtatható platformok      c64 → c64, plus4 → cplus4, tic80 → tic80
        ├─ a legfrissebb nem dev kiadás             amely a megfelelő assetet hordozza
        ├─ GET /api/download?path=<asset>           .prg / .tic az áruház mappájába
        ├─ GET <software.imageUrl>                  borítókép
        ├─ gamelist.xml kiírása                     cím, leírás, szerző, kép
        └─ es_systems_ttg.cfg kiírása               a menübejegyzés
```

**Repó:** <https://git.teletypegames.org/stores/ttg-batocera-store>**Motor:** [warp-engine-batocera-store](https://wiki.teletypegames.org/hu/stores/warp-engine-batocera-store)**RetroArch-megfelelője:** [TTG RetroArch Store](https://wiki.teletypegames.org/hu/stores/ttg-retroarch-store)**Batocera:** <https://batocera.org>**Katalógusoldal:** [WarpEngine](https://wiki.teletypegames.org/hu/engines/warp-engine) (`libs/ruby/warp_engine` a `teletypegames` repóban)

---

# Telepítés

SSH-n a Batocera-dobozon:

```sh
curl -fsSL https://git.teletypegames.org/stores/ttg-batocera-store/raw/branch/master/install.sh | sh
```

Vagy egy checkoutból:

```sh
scp -r ttg-batocera-store root@batocera:/tmp/
ssh root@batocera /tmp/ttg-batocera-store/install.sh
```

A telepítő lehúzza a motort — a [warp-engine-batocera-store](https://wiki.teletypegames.org/hu/stores/warp-engine-batocera-store) és a [warpstore](https://wiki.teletypegames.org/hu/engines/warpstore) azon commitját, amellyel ezt a konfigurációt kipróbáltuk; ezek az `install.sh` elején vannak rögzítve, az `ENGINE_REF` és a `WARPSTORE_REF` felülírja őket —, azt és ezt a konfigurációt a `/userdata/system/batocera-store/ttg/` könyvtárba teszi, kiírja a `ttg-store` indítót, és lefuttatja az első szinkront — amely letölti a játékokat és kiírja a menübejegyzést. Indítsd újra az EmulationStationt, hogy lásd:

```sh
batocera-es-swissknife --restart
```

A telepítő újrafuttatása a frissítési út: felfrissíti a motort, a konfigurációt (a régit `config.json.bak` néven megtartva) és a gyorsítótárazott logót, a `state.json` fájlhoz pedig nem nyúl. Checkoutból futtatva a logót is a checkoutból veszi.

**Ha 4.0 előtti telepítésről jössz**, az első szinkron a szerkezetet is átalakítja: a játékok kikerülnek a `c64/teletypegames/`, `tic80/teletypegames/` és `ports/teletypegames/` mappákból a `/userdata/roms/teletypegames/` alá, a régi *Ports ▸ Teletype Games Store* bejegyzés pedig eltűnik — a frissítő már a menübejegyzésen belül van. A költözés nem fájlmozgatás, hanem eltávolítás plusz friss letöltés, ami a mai katalógussal percek kérdése. A gamelistjeidet a mi csomópontjaink nélkül újraírja, nem törli, a `gamelist.xml.ttg-backup` másolatokat pedig kilistázza, de érintetlenül hagyja. A `-n sync` előre megmutatja az egészet; a `config.json` `emulationstation.menu.mode: "merge"` beállítása megtartja a régi elrendezést.

---

# Használat

**Az eszközön.** *Teletype Games ▸ „Update Teletype Games"*. Letölt mindent, ami új, majd újraindítja az EmulationStationt. Az ES által indított szkriptnek nincs konzolja, így a kimenet a `/userdata/system/batocera-store/ttg/store.log` fájlba megy.

```
fő körhinta:  …  ▸  Teletype Games  ▸  ┌ Commodore 64
                                       ├ Commodore Plus/4
                                       ├ TIC-80
                                       ├ Ports                    a natív buildek
                                       └ Update Teletype Games    a szinkron
```

A bejegyzés a saját TTG-logónkat viseli, amely az áruházrepóban van (`logo.png`, plusz egy vektoros `logo.svg` azoknak a témáknak, amelyek csak SVG-t keresnek), és amelyet a motor a doboz minden témájának logómappájába telepít. Ahová nem ér el, ott a téma szövegként mutatja: *TELETYPE GAMES*. A Batocera-image-hez adott témák a csak olvasható rendszeren élnek, így a másolatuk a RAM-overlayben van, és újraindításkor eltűnne; a motor néhány sort tesz a `/boot/postshare.sh`-ba, amely az EmulationStation indulása előtt visszateszi, az eltávolítás pedig kiveszi ezeket a sorokat.

Csak azok a platformok jelennek meg, amelyekre van telepített tartalom, és a játékok pontosan úgy indulnak, ahogy a doboz indítaná őket: a motor a doboz saját `c64`, `cplus4`, `tic80` és `ports` rendszereiről másolja át az indítóparancsot és az emulátorlistát, így amit a C64-hez beállítottál, az a mi C64-es játékainkra is érvényes. Hogy ez hogyan áll össze, azt a [motor oldala](https://wiki.teletypegames.org/hu/stores/warp-engine-batocera-store) írja le.

**SSH-n**, az indítón keresztül:

```sh
S=/userdata/system/batocera-store/ttg-store

$S list                 # kompatibilis katalógusbejegyzések; * telepítve, ^ van frissítés
$S sync                 # minden újdonság letöltése, a gamelistek és a menü frissítése
$S sync blessingofra    # csak egy cím (soha nem takarít)
$S -n sync              # szárazon futtatás
$S remove c64-demo      # eltávolítás (a c64:c64-demo is jó)
$S config               # az érvényes konfiguráció, és hogy hol van a menübejegyzés
```

A globális kapcsolók az alparancs **elé** jönnek: `$S --roms-root /tmp/roms sync`.

| Kapcsoló | Jelentés |
|---|---|
| `--config <path>` | az áruház konfigurációs fájlja (alapérték `/userdata/system/batocera-store/ttg/config.json`) |
| `--base-url <url>` | a katalógus alap-URL-jének felülbírálása |
| `--roms-root <path>` | a ROM-gyökér felülbírálása |
| `-n`, `--dry-run` | jelenti a műveleteket, de semmit nem változtat |
| `-v`, `--verbose` | bőbeszédű naplózás |
| `--version` | verzió kiírása |

Két alparancs a gépnek szól, nem a felhasználónak: a `sync-from-es` az, amit a menübejegyzés hív, az `apply-gamelists --wait-pid <pid>` pedig az általa indított leválasztott gyerekfolyamat.

---

# Hova kerülnek a dolgok

```
/userdata/system/batocera-store/
├── ttg-store                            indító
└── ttg/
    ├── store.py, warpstore.py           a motor és a közös magja
    ├── config.json                      az áruház, amely kiválasztotta
    └── state.json, catalog.json, store.log

/userdata/system/configs/emulationstation/es_systems_ttg.cfg   a menübejegyzés
<minden téma>/<a logómappája>/ttg.png, ttg.svg                  a bejegyzés logója
/boot/postshare.sh                       jelölt blokk, amely bootkor visszateszi a logót

/userdata/roms/teletypegames/            az áruház saját ROM-mappája
├── c64/
│   ├── blessingofra-2.2.0.prg, rabbit-1.0.0.prg, …
│   ├── images/blessingofra.png, …
│   └── gamelist.xml
├── cplus4/  …
├── tic80/  …
├── ports/
│   ├── rabbitroller.sh, images/rabbitroller.png
│   ├── .data/rabbitroller/              a kicsomagolt program
│   └── gamelist.xml
└── store/                               maga a menübejegyzés
    ├── update.sh                        a szinkron, ahogy a menü indítja
    └── gamelist.xml
```

A doboz saját rendszermappáihoz egyáltalán nem nyúl: a takarítás nem érheti el a ROM-jaidat, mert azok nincsenek ugyanabban a fában, a mi mappánkon belül pedig csak az törlődik, amit a `state.json` nyilvántart — egy oda bemásolt saját ROM megtartja a fájlját és a gamelist-bejegyzését.

---

# Konfiguráció

`/userdata/system/batocera-store/ttg/config.json`, ebből a repóból:

```json
{
  "store": {
    "id": "ttg",
    "name": "Teletype Games",
    "base_url": "https://teletypegames.org",
    "api": {
      "catalog": "/api/software",
      "download": "/api/download"
    }
  },

  "paths": {
    "roms_root": "/userdata/roms",
    "subfolder": "teletypegames"
  },

  "emulationstation": {
    "menu": {
      "mode": "system",
      "updater": true,
      "logo": [
        "https://git.teletypegames.org/stores/ttg-batocera-store/raw/branch/master/logo.png",
        "https://git.teletypegames.org/stores/ttg-batocera-store/raw/branch/master/logo.svg"
      ]
    },
    "folder_name": "Teletype Games",
    "restart": true
  },

  "catalog": {
    "statuses": ["released", "archived"],
    "owner_id": null,
    "only": [],
    "exclude": []
  },

  "platforms": {
    "c64": { "system": "c64", "kind": "cartridge", "ext": ".prg", "enabled": true },
    "plus4": { "system": "cplus4", "kind": "cartridge", "ext": ".prg", "enabled": true },
    "tic80": { "system": "tic80", "kind": "cartridge", "ext": ".tic", "enabled": true },

    "ebitengine": { "system": "ports", "install": "port",
                    "kind": { "x86_64": "linux_x64", "aarch64": "linux_arm64" },
                    "ext": ".zip", "enabled": true },
    "bevy": { "system": "ports", "install": "port",
              "kind": { "x86_64": "linux_x64", "aarch64": "linux_arm64" },
              "ext": ".zip", "enabled": true },
    "godot": { "system": "ports", "install": "port",
               "kind": { "x86_64": "linux_x64" },
               "ext": ".zip", "enabled": true },
    "love": { "system": "ports", "install": "port",
              "kind": { "x86_64": "linux_x64" },
              "ext": ".zip", "enabled": true }
  },

  "behavior": {
    "prune": true,
    "timeout": 30,
    "insecure": false
  }
}
```

A teljes kulcsreferencia a [motor oldalán](https://wiki.teletypegames.org/hu/stores/warp-engine-batocera-store#konfiguracio) van. A dobozon végzett szerkesztések a következő telepítésig maradnak meg, amely a régi fájlt `config.json.bak` néven megtartja. Ami tartós, az a repóba való; a repó CI-ja (`scripts/ci-check.sh`) a rögzített motorral betölti a konfigurációt, és elbukik minden olyan kulcson, amelyet a motor nem ismer — egy elírt kulcsot különben csendben figyelmen kívül hagyna.

## Platform-leképezés

Egy platform akkor telepíthető, ha a kiadási assetje olyan fájl, amelyet a dobozon meglévő valamelyik rendszer közvetlenül el tud indítani — a „meglévő" itt azt jelenti, hogy szerepel a doboz saját `es_systems.cfg` fájljában, tehát ebbe az image-be beleépült az emulátor:

| Katalógusplatform | Asset típusa | Batocera-rendszer | Kiterjesztés |
|---|---|---|---|
| [`c64`](https://wiki.teletypegames.org/hu/platforms/c64) | `cartridge` | `c64` (VICE) | `.prg` |
| [`plus4`](https://wiki.teletypegames.org/hu/platforms/plus4) | `cartridge` | `cplus4` (VICE `xplus4`) | `.prg` |
| [`tic80`](https://wiki.teletypegames.org/hu/platforms/tic80) | `cartridge` | `tic80` | `.tic` |

Az `ebitengine`, `bevy`, `godot` és `love` natív Linux-buildet szállít, és úgy települ, ahogy a Batocera Ports rendszere csinálja — egy `.sh` indító a kicsomagolt program mellett, a *Teletype Games ▸ Ports* alatt, a doboz architektúrájához választott assettel (`linux_x64` vagy `linux_arm64`; a `godot` és a `love` csak x86\_64). A `phaser` csak webes buildet szállít, így nincs leképezve. A natív címek többsége `demo` státuszú, amit a `catalog.statuses` kihagy; a felvétele konfigurációs szerkesztés:

```json
"catalog": { "statuses": ["released", "archived", "demo"] }
```

Egy platformot kihagy, ha a doboznak nincs meg a rendszere; a `list` ezt jelenti: `skipped <name>: this box has no '<system>' system`.

---

# Eltávolítás

```sh
curl -fsSL https://git.teletypegames.org/stores/ttg-batocera-store/raw/branch/master/uninstall.sh | sh
```

Eltávolítja a játékokat (a kicsomagolt port-tartalmat is), a mi gamelistjeinket, a menübejegyzést, a témáidba tett logókat és a `/boot/postshare.sh` blokkját, az indítót és az áruház könyvtárát, majd újraindítja az EmulationStationt. A `DRY_RUN=1` megmutatja, mi tűnne el; a `KEEP_HOME=1` megtartja a `state.json` fájlt és a naplót az újratelepítéshez.

A tiédből semmi nem megy vele: minden, amit az áruház telepített, egyetlen saját mappában van, így az eltávolítás pontosan úgy hagyja a dobozt, ahogy volt. Olyan dobozon, amely még a régi elrendezést használja, a gamelistjeidet a mi csomópontjaink nélkül újraírja, nem törli, így a játékszámlálók és a kedvencek megmaradnak, a `gamelist.xml.ttg-backup` másolatokat pedig kilistázza, de érintetlenül hagyja.

---

# Hibakeresés

| Tünet | Mit ellenőrizz |
|---|---|
| Frissítés után nem jelenik meg semmi | `/userdata/system/batocera-store/ttg/store.log`, majd `batocera-es-swissknife --restart` |
| `skipped <name>: this box has no '<system>' system` | az az emulátor nincs benne ebben a Batocera-image-ben |
| Hiányzik a *Teletype Games* bejegyzés | a szinkron írja a `/userdata/system/configs/emulationstation/es_systems_ttg.cfg` fájlt; nézd meg a naplót, majd indítsd újra az ES-t |
| TLS-hibák egy tesztpéldány felé | állítsd a `behavior.insecure` értéket `true`-ra a `config.json` fájlban |
| Egy címet soha ne telepítsen | vedd fel a katalógusnevét a `config.json` `catalog.exclude` listájába |
| A gamelist hibásnak tűnik | a miénk a `/userdata/roms/teletypegames/<system>/gamelist.xml`; a 4.0 előtti eredeti a `<system>/gamelist.xml.ttg-backup` |
| Újraindítás után a bejegyzés szövegként mutatja: *TELETYPE GAMES* | a `ttg-store: theme logos` blokk a `/boot/postshare.sh`-ban; ha hiányzik, a napló megmondja, miért (a `/boot` nem volt írhatóra csatolható) — futtasd újra a telepítőt |
| `skipped <name>: sold on the store's site` | fizetős cím; az áruház névtelenül tölt le, ezért az oldalon kell megvenni |
| A játékok eltűntek egy szinkron után | egy hiányzó ROM-felcsatolás szándékosan megszakítja a szinkront; ellenőrizd, hogy a `/userdata/roms` fel van-e csatolva |

'; var prevLevel = 2; for (var i = 0; i < headings.length; i++) { var h = headings\[i\]; var text = h.textContent.trim(); var slug = text.toLowerCase() .replace(/\[áàâä\]/g,'a').replace(/\[éèêë\]/g,'e').replace(/\[íìîï\]/g,'i') .replace(/\[óòôöő\]/g,'o').replace(/\[úùûüű\]/g,'u') .replace(/\[^a-z0-9\]+/g, '-').replace(/^-|-$/g, ''); if (!slug) slug = 'heading-' + i; if (used\[slug\]) { slug += '-' + i; } used\[slug\] = true; h.id = slug; var level = parseInt(h.tagName.charAt(1)); var cls = level > 2 ? ' class="toc-child"' : ''; html += '- [' + text + '](#'%20+%20slug%20+%20')
'; } html += '
'; toc.innerHTML = html; // Scroll-spy: highlight current heading var links = toc.querySelectorAll('a'); var ids = \[\]; for (var j = 0; j < links.length; j++) ids.push(links\[j\].getAttribute('href').slice(1)); function updateActive() { var current = ''; for (var k = 0; k < ids.length; k++) { var el = document.getElementById(ids\[k\]); if (el && el.getBoundingClientRect().top <= 80) current = ids\[k\]; } for (var m = 0; m < links.length; m++) { links\[m\].parentNode.classList.toggle('active', links\[m\].getAttribute('href') === '#' + current); } } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); })();

---

## Navigation

- Parent: [Áruházak](https://wiki.teletypegames.org/hu/stores.md)
- Next: [TTG RetroArch Store](https://wiki.teletypegames.org/hu/stores/ttg-retroarch-store.md)
