diff --git a/.github/badges/data.json b/.github/badges/data.json index f934cba..1d5ac1a 100644 --- a/.github/badges/data.json +++ b/.github/badges/data.json @@ -1,5 +1,7 @@ { "switch_firmware": "22.1.0", + "release_zip_downloads_snapshot": 2318, + "release_zip_downloads_lifetime": 2318, "release_zip_downloads_total": 2318, "omninx_pack_version": "1.0.0-b12" } diff --git a/.github/workflows/update-badge-data.yml b/.github/workflows/update-badge-data.yml index f959a24..e542c6d 100644 --- a/.github/workflows/update-badge-data.yml +++ b/.github/workflows/update-badge-data.yml @@ -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. name: Update badge-data diff --git a/README.md b/README.md index c22e73a..499566b 100644 --- a/README.md +++ b/README.md @@ -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) [![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. @@ -121,7 +121,7 @@ Orientierung an den [NiklasCFW Docs](https://docs.niklascfw.de/switch/omninx/ein OmniNX/ ├── .github/ │ ├── 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/ ├── staging/ # Gemeinsame Install-Stage-Dateien (Bootloader, Payloads, Nyx, etc.) ├── variants/ # Varianten-Inhalt diff --git a/scripts/update-badge-data.py b/scripts/update-badge-data.py index 665e0a4..058ecc9 100644 --- a/scripts/update-badge-data.py +++ b/scripts/update-badge-data.py @@ -1,5 +1,9 @@ #!/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 @@ -90,14 +94,50 @@ def first_non_draft_tag(releases: list) -> str | None: return None -def load_existing_firmware() -> str | None: +def load_existing_badge_data() -> dict: if not os.path.isfile(BADGE_PATH): - return None + return {} try: 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): + 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 + 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: @@ -135,9 +175,15 @@ def main() -> int: if not fw: 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 = { "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, }