Files
jail-launcher/jlauncher/metadata.py
T
JailDesigner e0a93a9c28 Estil targeta tipus web a les files + tema seleccionable (system/clar/fosc)
UI:
- Files amb estil de targeta: icona arrodonida, títol gran, subtítol atenuat i
  'pills' amb estat, versió, data de llançament, jugadors, autor i topics. Els
  pills envolten amb un FlowLayout nou quan no caben.
- Submenú Opcions > Tema amb Sistema/Clar/Fosc; persisteix a settings.json
  (theme) i s'aplica a l'instant. El watcher del SO només actua en mode Sistema.

Dades:
- GameMeta guarda topics i created_at, llegits de la resposta de Gitea que ja
  demanàvem (gratis, auto-sincronitzats).
- games.toml: camps opcionals players i author per joc (la resta surt de Gitea).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 10:13:32 +02:00

63 lines
1.9 KiB
Python

"""Lectura/escritura de la metadata cacheada de cada juego (info.json + icon.png)."""
from __future__ import annotations
import json
from dataclasses import asdict, dataclass, field
from pathlib import Path
from .paths import metadata_dir
INFO_NAME = "info.json"
ICON_NAME = "icon.png"
@dataclass
class GameMeta:
description: str = ""
version: str = ""
default_branch: str = "main"
updated_at: str = "" # ISO-8601; lo rellena el worker tras un update
topics: list[str] = field(default_factory=list) # tags de Gitea (controller, sdl3…)
created_at: str = "" # ISO-8601 de creación del repo en Gitea (≈ lanzamiento)
def info_path(root: Path, game_id: str) -> Path:
return metadata_dir(root, game_id) / INFO_NAME
def icon_path(root: Path, game_id: str) -> Path:
return metadata_dir(root, game_id) / ICON_NAME
def load_meta(root: Path, game_id: str) -> GameMeta:
"""Lee info.json cacheado; devuelve GameMeta vacío si no existe o es ilegible."""
path = info_path(root, game_id)
if not path.exists():
return GameMeta()
try:
data = json.loads(path.read_text(encoding="utf-8"))
except (OSError, json.JSONDecodeError):
return GameMeta()
return GameMeta(
description=data.get("description", ""),
version=data.get("version", ""),
default_branch=data.get("default_branch", "main"),
updated_at=data.get("updated_at", ""),
topics=list(data.get("topics", [])),
created_at=data.get("created_at", ""),
)
def save_meta(root: Path, game_id: str, meta: GameMeta) -> None:
path = info_path(root, game_id)
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(
json.dumps(asdict(meta), ensure_ascii=False, indent=2),
encoding="utf-8",
)
def has_icon(root: Path, game_id: str) -> bool:
return icon_path(root, game_id).exists()