Fix updates and startup delays
This commit is contained in:
@@ -23,6 +23,10 @@ def _load_app_info():
|
|||||||
try:
|
try:
|
||||||
# Finde config.json relativ zum Skript oder im PyInstaller Bundle
|
# Finde config.json relativ zum Skript oder im PyInstaller Bundle
|
||||||
if getattr(sys, "frozen", False):
|
if getattr(sys, "frozen", False):
|
||||||
|
if platform.system() == "Darwin":
|
||||||
|
# Path(sys.executable) ist fcco-Converter.app/Contents/MacOS/executable
|
||||||
|
base_dir = Path(sys.executable).parent.parent.parent.parent
|
||||||
|
else:
|
||||||
base_dir = Path(sys.executable).parent
|
base_dir = Path(sys.executable).parent
|
||||||
else:
|
else:
|
||||||
base_dir = Path(__file__).parent.parent
|
base_dir = Path(__file__).parent.parent
|
||||||
|
|||||||
@@ -841,6 +841,25 @@ class App(ctk.CTk):
|
|||||||
if not IS_MACOS:
|
if not IS_MACOS:
|
||||||
w.after(200, lambda: w.grab_set())
|
w.after(200, lambda: w.grab_set())
|
||||||
|
|
||||||
|
def check_updates(self, manual=False):
|
||||||
|
import threading
|
||||||
|
|
||||||
|
def _do_check():
|
||||||
|
try:
|
||||||
|
has_upd, ver, url = check_for_updates()
|
||||||
|
if has_upd:
|
||||||
|
self.after(0, lambda: self._prompt_update(ver, url))
|
||||||
|
elif manual:
|
||||||
|
self.after(0, lambda: messagebox.showinfo("Updates", "Du bist auf der neuesten Version!"))
|
||||||
|
except Exception as e:
|
||||||
|
if manual:
|
||||||
|
self.after(0, lambda: messagebox.showerror("Fehler", f"Fehler bei Update-Prüfung:\n{e}"))
|
||||||
|
|
||||||
|
if manual:
|
||||||
|
self.after(30, self._activate)
|
||||||
|
|
||||||
|
threading.Thread(target=_do_check, daemon=True).start()
|
||||||
|
|
||||||
def _save_s(self, wg, win):
|
def _save_s(self, wg, win):
|
||||||
try:
|
try:
|
||||||
th = int(wg["threads"].get())
|
th = int(wg["threads"].get())
|
||||||
|
|||||||
+40
-24
@@ -39,37 +39,53 @@ def _fetch_json(url: str) -> list | dict:
|
|||||||
return json.loads(resp.read().decode("utf-8"))
|
return json.loads(resp.read().decode("utf-8"))
|
||||||
|
|
||||||
|
|
||||||
def check_for_updates() -> dict | None:
|
def _parse_version(v: str) -> list[int]:
|
||||||
"""Prüft, ob ein neues Release verfügbar ist.
|
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:
|
Returns:
|
||||||
Dict mit Release-Infos (tag_name, name, body, assets) oder None.
|
(has_update, new_version_string, asset_download_url)
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
releases = _fetch_json(RELEASES_URL)
|
req = Request(RELEASES_URL, headers={'User-Agent': 'fcco-Updater/1.0'})
|
||||||
if not releases:
|
with urlopen(req, timeout=5) as resp:
|
||||||
return None
|
data = json.loads(resp.read().decode('utf-8'))
|
||||||
|
|
||||||
# Neuestes (nicht als Draft/Prerelease markiertes) Release
|
if not data:
|
||||||
for release in releases:
|
return False, "", ""
|
||||||
if release.get("draft") or release.get("prerelease"):
|
|
||||||
continue
|
|
||||||
|
|
||||||
tag = release.get("tag_name", "").lstrip("v")
|
# Gitea gibt Releases sortiert zurück, 0 = neuestes
|
||||||
if tag and tag != CURRENT_VERSION:
|
release_info = data[0]
|
||||||
# Einfacher Versionsvergleich
|
tag_name = release_info.get("tag_name", "")
|
||||||
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
|
# Entferne eventuelles "v" Präfix
|
||||||
except (URLError, json.JSONDecodeError, OSError):
|
latest_version = tag_name.lstrip("vV")
|
||||||
return None
|
|
||||||
|
# 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:
|
def _get_platform_asset_name() -> str:
|
||||||
|
|||||||
Reference in New Issue
Block a user