Track pack download lifetime across release asset swaps.

Increment lifetime when API zip totals rise; preserve lifetime when totals drop after asset replacement. README badge reads release_zip_downloads_lifetime.
This commit is contained in:
niklascfw 2026-06-04 21:20:17 +02:00
parent dc6a20d957
commit fe697f0aed
No known key found for this signature in database
4 changed files with 56 additions and 8 deletions

View file

@ -1,5 +1,7 @@
{ {
"switch_firmware": "22.1.0", "switch_firmware": "22.1.0",
"release_zip_downloads_snapshot": 2318,
"release_zip_downloads_lifetime": 2318,
"release_zip_downloads_total": 2318, "release_zip_downloads_total": 2318,
"omninx_pack_version": "1.0.0-b12" "omninx_pack_version": "1.0.0-b12"
} }

View file

@ -1,4 +1,4 @@
# Aktualisiert täglich .github/badges/data.json (Download-Summe, OmniNX-Version, kompatible FW = Tag des letzten Releases in OmniNX/NX_Firmware). # Aktualisiert täglich .github/badges/data.json (Download-Lifetime mit Asset-Swap-Erkennung, OmniNX-Version, FW-Tag).
# Läuft auf Gitea Actions wie die übrigen Workflows (.github/workflows); github.api_url = Gitea-API. # Läuft auf Gitea Actions wie die übrigen Workflows (.github/workflows); github.api_url = Gitea-API.
name: Update badge-data name: Update badge-data

View file

@ -2,7 +2,7 @@
[![Aktuelle Version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgit.niklascfw.de%2FOmniNX%2FOmniNX%2Fraw%2Fbranch%2Fmain%2F.github%2Fbadges%2Fdata.json&query=%24.omninx_pack_version&label=OmniNX%20Version&color=blue)](https://git.niklascfw.de/OmniNX/OmniNX/releases/latest) [![Aktuelle Version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgit.niklascfw.de%2FOmniNX%2FOmniNX%2Fraw%2Fbranch%2Fmain%2F.github%2Fbadges%2Fdata.json&query=%24.omninx_pack_version&label=OmniNX%20Version&color=blue)](https://git.niklascfw.de/OmniNX/OmniNX/releases/latest)
[![Firmware](https://img.shields.io/github/v/release/THZoria/NX_Firmware?display_name=release&filter=*22.1.0&label=Kompatibel%20mit%20FW&color=189c11&logo=nintendoswitch)](https://github.com/THZoria/NX_Firmware/releases/tag/22.1.0) [![Firmware](https://img.shields.io/github/v/release/THZoria/NX_Firmware?display_name=release&filter=*22.1.0&label=Kompatibel%20mit%20FW&color=189c11&logo=nintendoswitch)](https://github.com/THZoria/NX_Firmware/releases/tag/22.1.0)
[![OmniNX Pack Downloads](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgit.niklascfw.de%2FOmniNX%2FOmniNX%2Fraw%2Fbranch%2Fmain%2F.github%2Fbadges%2Fdata.json&query=%24.release_zip_downloads_total&label=OmniNX%20Downloads&color=6f42c1)](https://git.niklascfw.de/OmniNX/OmniNX/releases) [![OmniNX Pack Downloads](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgit.niklascfw.de%2FOmniNX%2FOmniNX%2Fraw%2Fbranch%2Fmain%2F.github%2Fbadges%2Fdata.json&query=%24.release_zip_downloads_lifetime&label=OmniNX%20Downloads&color=6f42c1)](https://git.niklascfw.de/OmniNX/OmniNX/releases)
OmniNX ist ein vollständiges Custom-Firmware-Setup für die Nintendo Switch, verfügbar in drei Varianten mit Fokus auf Flexibilität und Modularität. OmniNX ist ein vollständiges Custom-Firmware-Setup für die Nintendo Switch, verfügbar in drei Varianten mit Fokus auf Flexibilität und Modularität.
@ -121,7 +121,7 @@ Orientierung an den [NiklasCFW Docs](https://docs.niklascfw.de/switch/omninx/ein
OmniNX/ OmniNX/
├── .github/ ├── .github/
│ ├── badges/ │ ├── badges/
│ │ └── data.json # README-Shields (Version, Downloads, FW); täglich per CI scripts/update-badge-data.py │ │ └── data.json # README-Shields (Version, FW, Download-Lifetime); täglich per CI scripts/update-badge-data.py
│ └── workflows/ │ └── workflows/
├── staging/ # Gemeinsame Install-Stage-Dateien (Bootloader, Payloads, Nyx, etc.) ├── staging/ # Gemeinsame Install-Stage-Dateien (Bootloader, Payloads, Nyx, etc.)
├── variants/ # Varianten-Inhalt ├── variants/ # Varianten-Inhalt

View file

@ -1,5 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Schreibt .github/badges/data.json aus der Releases-API (OmniNX-Pack + NX_Firmware-Tag, Gitea/GitHub-kompatibel).""" """Schreibt .github/badges/data.json aus der Releases-API (OmniNX-Pack + NX_Firmware-Tag, Gitea/GitHub-kompatibel).
Download-Zähler: Summe aller *.zip-Assets (API). lifetime steigt nur bei current >= snapshot;
bei Asset-Tausch (current < snapshot) wird lifetime nicht reduziert.
"""
from __future__ import annotations from __future__ import annotations
@ -90,14 +94,50 @@ def first_non_draft_tag(releases: list) -> str | None:
return None return None
def load_existing_firmware() -> str | None: def load_existing_badge_data() -> dict:
if not os.path.isfile(BADGE_PATH): if not os.path.isfile(BADGE_PATH):
return None return {}
try: try:
with open(BADGE_PATH, encoding="utf-8") as f: with open(BADGE_PATH, encoding="utf-8") as f:
return json.load(f).get("switch_firmware") data = json.load(f)
return data if isinstance(data, dict) else {}
except (OSError, json.JSONDecodeError, TypeError): except (OSError, json.JSONDecodeError, TypeError):
return {}
def load_existing_firmware() -> str | None:
fw = load_existing_badge_data().get("switch_firmware")
return str(fw).strip() if fw else None
def _int_or_none(value: object) -> int | None:
if value is None:
return None return None
try:
return int(value)
except (TypeError, ValueError):
return None
def load_existing_download_counters() -> tuple[int | None, int | None]:
"""Liest snapshot und lifetime; migriert alte release_zip_downloads_total."""
data = load_existing_badge_data()
snapshot = _int_or_none(data.get("release_zip_downloads_snapshot"))
if snapshot is None:
snapshot = _int_or_none(data.get("release_zip_downloads_total"))
lifetime = _int_or_none(data.get("release_zip_downloads_lifetime"))
if lifetime is None:
lifetime = _int_or_none(data.get("release_zip_downloads_total"))
return snapshot, lifetime
def update_download_lifetime(current: int, snapshot: int | None, lifetime: int | None) -> tuple[int, int]:
"""Gibt (neuer_snapshot, neue_lifetime) zurück."""
if snapshot is None or lifetime is None:
return current, current
if current >= snapshot:
lifetime += current - snapshot
return current, lifetime
def main() -> int: def main() -> int:
@ -135,9 +175,15 @@ def main() -> int:
if not fw: if not fw:
fw = load_existing_firmware() or "unknown" fw = load_existing_firmware() or "unknown"
current = sum_zip_downloads(omninx_releases)
prev_snapshot, prev_lifetime = load_existing_download_counters()
snapshot, lifetime = update_download_lifetime(current, prev_snapshot, prev_lifetime)
data = { data = {
"switch_firmware": fw, "switch_firmware": fw,
"release_zip_downloads_total": sum_zip_downloads(omninx_releases), "release_zip_downloads_snapshot": snapshot,
"release_zip_downloads_lifetime": lifetime,
"release_zip_downloads_total": current,
"omninx_pack_version": omninx_tag, "omninx_pack_version": omninx_tag,
} }