From c5de427a85567b3e8b5832a01165111151754922 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 18 Jun 2026 20:46:57 +0000 Subject: [PATCH] =?UTF-8?q?fix(stt):=20d=C3=A9tection=20navigateur=20cross?= =?UTF-8?q?-distro=20(AlmaLinux/Fedora=20+=20Debian/Ubuntu)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _open_browser tente les binaires natifs (rpm + deb : brave-browser / chromium / chromium-browser / google-chrome…) puis Flatpak (com.brave.Browser, org.chromium.Chromium, com.google.Chrome…), sinon repli sur le navigateur par défaut. systemd --user, lanceurs .desktop et pipx sont déjà identiques sur les deux familles. Doc : note de compatibilité distros. Bump 0.4.0 → 0.4.1. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_017Qjq5jHiqNepnobJpHYpCa --- admin/ia/stt.md | 7 +++++++ stt/client/pyproject.toml | 2 +- stt/client/stt/ui/app.py | 33 +++++++++++++++++++++++++++------ 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/admin/ia/stt.md b/admin/ia/stt.md index a1b08ec..fc75d14 100644 --- a/admin/ia/stt.md +++ b/admin/ia/stt.md @@ -210,6 +210,13 @@ stt --version # version installée avoir installé via `pipx` depuis git. Astuce : toujours bumper la version du paquet à chaque release, sinon le cache de build pipx/uv peut resservir l'ancienne (cf. `pyproject.toml`). +**Compatibilité distros** : tout le client repose sur des standards communs — `systemd --user`, +lanceurs `.desktop` (XDG `~/.local/share/applications/`), `pipx` — donc **identique sur +AlmaLinux/Fedora (RHEL) et Debian/Ubuntu**. Seul le navigateur diffère : `_open_browser` teste +les binaires natifs (rpm + deb) puis **Flatpak** (`com.brave.Browser`, `org.chromium.Chromium`…), +sinon repli sur le navigateur par défaut. `update-desktop-database` (`desktop-file-utils`) est +optionnel — son absence n'empêche rien. + --- ## Roadmap diff --git a/stt/client/pyproject.toml b/stt/client/pyproject.toml index 46b9ae0..12c24ff 100644 --- a/stt/client/pyproject.toml +++ b/stt/client/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "stt" -version = "0.4.0" +version = "0.4.1" description = "STT — client vocal Jarvis du homelab Funk (voix + HUD, parle au STT-server)" requires-python = ">=3.11" readme = "README.md" diff --git a/stt/client/stt/ui/app.py b/stt/client/stt/ui/app.py index 77b55b9..00a95af 100644 --- a/stt/client/stt/ui/app.py +++ b/stt/client/stt/ui/app.py @@ -114,21 +114,42 @@ def _run_engine(engine, emit) -> None: def _open_browser(url: str, mode: str) -> None: - """Ouvre le HUD. mode : 'app' (fenêtre chromeless, type Discord) | 'kiosk' (plein écran).""" + """Ouvre le HUD. mode : 'app' (fenêtre chromeless, type Discord) | 'kiosk' (plein écran). + + Cross-distro AlmaLinux/Fedora (RHEL) et Debian/Ubuntu : on tente les binaires natifs + (noms rpm + deb), puis Flatpak (courant sur Fedora/AlmaLinux), sinon repli sur le + navigateur par défaut. Chromium-like : `--app=` = fenêtre sans onglets, `--kiosk` = plein écran. + """ import shutil import subprocess import webbrowser - # Chromium-like : --app= = fenêtre dédiée sans onglets ; --kiosk = plein écran. + flags = ["--kiosk", url] if mode == "kiosk" else [f"--app={url}"] + + # 1) Binaire natif (rpm/deb) for browser in ( - "brave-browser", "brave", "chromium", "chromium-browser", + "brave-browser", "brave", + "chromium", "chromium-browser", "google-chrome", "google-chrome-stable", + "microsoft-edge", "vivaldi", ): if shutil.which(browser): - args = [browser, "--kiosk", url] if mode == "kiosk" else [browser, f"--app={url}"] - subprocess.Popen(args) + subprocess.Popen([browser, *flags]) return - webbrowser.open(url) # repli : onglet dans le navigateur par défaut + + # 2) Flatpak (universel — souvent la voie sur Fedora/AlmaLinux) + if shutil.which("flatpak"): + for appid in ("com.brave.Browser", "org.chromium.Chromium", + "com.google.Chrome", "com.microsoft.Edge"): + installed = subprocess.run( + ["flatpak", "info", appid], capture_output=True + ).returncode == 0 + if installed: + subprocess.Popen(["flatpak", "run", appid, *flags]) + return + + # 3) Repli : onglet dans le navigateur par défaut + webbrowser.open(url) def _apply_settings(client, engine, data: dict, loop) -> None: