Fix updates and startup delays

This commit is contained in:
joel
2026-07-20 17:56:19 +02:00
parent 240779052f
commit 6f8074ff43
3 changed files with 67 additions and 28 deletions
+43 -27
View File
@@ -39,37 +39,53 @@ def _fetch_json(url: str) -> list | dict:
return json.loads(resp.read().decode("utf-8"))
def check_for_updates() -> dict | None:
"""Prüft, ob ein neues Release verfügbar ist.
def _parse_version(v: str) -> list[int]:
parts = []
for p in v.lstrip("vV").split("."):
try:
parts.append(int(p))
except ValueError:
parts.append(0)
while len(parts) < 3:
parts.append(0)
return parts
def check_for_updates() -> tuple[bool, str, str]:
"""Prüft, ob auf Gitea ein neues Release (nach SemVer) vorliegt.
Returns:
Dict mit Release-Infos (tag_name, name, body, assets) oder None.
(has_update, new_version_string, asset_download_url)
"""
try:
releases = _fetch_json(RELEASES_URL)
if not releases:
return None
# Neuestes (nicht als Draft/Prerelease markiertes) Release
for release in releases:
if release.get("draft") or release.get("prerelease"):
continue
tag = release.get("tag_name", "").lstrip("v")
if tag and tag != CURRENT_VERSION:
# Einfacher Versionsvergleich
try:
remote_parts = [int(x) for x in tag.split(".")]
local_parts = [int(x) for x in CURRENT_VERSION.split(".")]
if remote_parts > local_parts:
return release
except ValueError:
continue
break # Nur das neueste Release prüfen
return None
except (URLError, json.JSONDecodeError, OSError):
return None
req = Request(RELEASES_URL, headers={'User-Agent': 'fcco-Updater/1.0'})
with urlopen(req, timeout=5) as resp:
data = json.loads(resp.read().decode('utf-8'))
if not data:
return False, "", ""
# Gitea gibt Releases sortiert zurück, 0 = neuestes
release_info = data[0]
tag_name = release_info.get("tag_name", "")
# Entferne eventuelles "v" Präfix
latest_version = tag_name.lstrip("vV")
# Intelligenter Versions-Vergleich
if _parse_version(latest_version) > _parse_version(CURRENT_VERSION):
# Finde die passende Zip-Datei
expected_asset = _get_platform_asset_name()
for asset in release_info.get("assets", []):
if asset.get("name") == expected_asset:
return True, latest_version, asset.get("browser_download_url", "")
return False, "", ""
return False, "", ""
except Exception as e:
print(f"Update Check Error: {e}")
return False, "", ""
def _get_platform_asset_name() -> str: