# jail-launcher Lanzador de juegos de **jailgames**. A partir de `games.toml`, lista los juegos, los clona/actualiza desde sus repos Gitea, lee su icono y descripción, y los compila/ejecuta. GUI en **Python + PySide6**, pensada para compilarse a binario nativo con **Nuitka**. ## Requisitos - Python 3.11+ (usa `tomllib` de la stdlib) - `git` en el PATH - `pip install PySide6` ## Ejecutar desde fuente ```bash pip install PySide6 python -m jail_launcher ``` La app crea una carpeta `jail_launcher_data/` junto al proyecto (o junto al binario, si está compilado) con esta estructura **anidada (Versión 1)**: ``` jail_launcher_data/ / repo/ # git clone del juego metadata/ info.json # descripción, versión, rama por defecto, fecha de actualización icon.png # copiado desde repo/release/icons/icon.png ``` ## Botones (interfaz en catalán) - **Descarrega**: si no existe el clone, hace `git clone`. Si existe, trae el remoto **forzado** (`git fetch` + `git reset --hard origin/` + `git clean -fd`), descartando cualquier cambio local. Después refresca la metadata: - descripción desde la API de Gitea (`/api/v1/repos//`), - versión ejecutando `version_cmd` (por defecto `git describe --tags --always`), - icono desde `release/icons/icon.png`. - **Juga**: si hay `build_cmd`, compila primero; luego ejecuta `run_cmd`. Para estos juegos basta `run_cmd = "make run"` (compila y ejecuta), con `build_cmd` vacío. - **Esborra**: elimina la descarga local (carpeta del juego en `jail_launcher_data/`), sin quitar el juego del `games.toml`. Menú **Opcions**: *Amaga els jocs no descarregats* (filtro persistente) y *Comprova actualitzacions* (marca los juegos descargados con commits pendientes). Las preferencias se guardan en `settings.json` junto al ejecutable. Las operaciones corren en segundo plano (QThreadPool); el log aparece en el panel inferior. ## Configuración: `games.toml` Una entrada `[[game]]` por juego. Campos: | Campo | Obligatorio | Descripción | |---------------|-------------|--------------------------------------------------------------------| | `id` | sí | slug → nombre de carpeta en `jail_launcher_data/` | | `name` | sí | nombre visible | | `clone_url` | sí | URL de git clone / pull | | `run_cmd` | sí | comando que ejecuta el juego (cwd = repo) | | `build_cmd` | no | comando de compilado; vacío = `run_cmd` ya compila | | `version_cmd` | no | comando que imprime la versión (def. `git describe --tags --always`)| | `info_url` | no | API Gitea del repo (def. derivada de `clone_url`) | | `icon_rel` | no | ruta del icono dentro del repo (def. `release/icons/icon.png`) | ## Compilar a binario (Nuitka, onefile) `build.sh` lo hace todo: crea el `.venv`, instala dependencias (PySide6 + Nuitka + zstandard) y compila un único ejecutable comprimido, empaquetándolo en `dist/jail-launcher-v--.tar.gz` junto a `games.toml`. ```bash ./build.sh # binario: dist/jail-launcher (+ dist/games.toml) ``` El binario crea `jail_launcher_data/` y `settings.json` **junto a sí mismo** (resuelto vía `NUITKA_ONEFILE_DIRECTORY`). El punto de entrada para empaquetar es `app.py` (desde fuente se ejecuta con `python -m jail_launcher`). ### Prerequisitos del sistema (no los instala el script) - **Python 3.11+** (usa `tomllib`). - Un **compilador C**: - Linux: `gcc` y `patchelf` (p. ej. `apt install build-essential patchelf python3-dev`). - macOS: **Xcode Command Line Tools** (`xcode-select --install`); aquí *no* hace falta patchelf (Nuitka usa `install_name_tool`). - `git` en el PATH. ### macOS (.app + .dmg) Compila en el propio Mac (Nuitka no compila cruzado). En macOS, `./build.sh` no genera un binario suelto sino una **app nativa**: ```bash ./build.sh # -> dist/Jail Launcher.app # -> dist/jail-launcher-v-macos-.dmg (arrastrar la app a Aplicaciones) ``` El icono vive en `icon/`: el build usa `icon/icon.icns` para el bundle y copia `icon/icon.png` (1024×1024) dentro del `.app` para el diálogo «Quant a». Para cambiarlo, sustituye esos ficheros (regenerables con `icon/create_icons.py`). A diferencia del onefile, la `.app` **no** escribe junto a sí misma (rompería al moverla a `/Applications`): guarda sus datos en `~/Library/Application Support/jailgames/jail-launcher/` (`jail_launcher_data/`, `settings.json` y una copia editable de `games.toml`, sembrada la primera vez desde el bundle). La app va **sin firma Developer ID** (firma ad-hoc), así que Gatekeeper avisará la primera vez: ábrela con **clic derecho → Abrir**, o ejecuta `xattr -dr com.apple.quarantine "/Applications/Jail Launcher.app"`.