From be0951543bc403a4690479e4e1d88fcb85406473 Mon Sep 17 00:00:00 2001 From: daijro Date: Sat, 7 Mar 2026 02:20:26 -0600 Subject: [PATCH] Update help msg, icon, & bugfix - Don't fall back to old browsers if the active one isnt installed - Remade the icon for the gui - Better exception info --- pythonlib/README.md | 49 +++++++++--------- pythonlib/camoufox/__main__.py | 69 +++++++++++++++---------- pythonlib/camoufox/gui/assets/icon.ico | Bin 27917 -> 28205 bytes pythonlib/camoufox/multiversion.py | 15 +++--- pythonlib/camoufox/pkgman.py | 23 ++++++++- 5 files changed, 96 insertions(+), 60 deletions(-) diff --git a/pythonlib/README.md b/pythonlib/README.md index b3d03ae..db03620 100644 --- a/pythonlib/README.md +++ b/pythonlib/README.md @@ -81,7 +81,6 @@ camoufox gui https://github.com/user-attachments/assets/992b1830-6b21-4024-9165-728854df1473 -
See help message @@ -90,33 +89,33 @@ $ python -m camoufox --help Usage: python -m camoufox [OPTIONS] COMMAND [ARGS]... -╭─ Options ─────────────────────────────────────────────────────────────────────────╮ -│ --help Show this message and exit. │ -╰───────────────────────────────────────────────────────────────────────────────────╯ -╭─ Commands ──────────────────────────────────────────────────────────────────────────────────╮ -│ active Print the current active version │ -│ fetch Install the active version, or a specific version. │ -│ gui Launch the Camoufox Manager GUI (requires PySide6) │ -│ list List Camoufox versions │ -│ path Print the install directory path │ -│ remove Remove Camoufox data directory, or an installed browser version │ -│ Or, remove a specific version: │ -│ Select a version: camoufox remove --select │ -│ Remove a version: camoufox remove official/stable/134.0.2-beta.20 │ -│ server Launch a Playwright server │ -│ set Interactive selector for versions and settings │ -│ Or, pass a specifier to activate directly: │ -│ Pin version: camoufox set official/stable/134.0.2-beta.20 │ -│ Auto-update channel: camoufox set official/stable │ -│ sync Sync available versions from remote repositories. │ -│ test Open the Playwright inspector │ -│ version Display version, package, browser, and storage info │ -╰─────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Options ─────────────────────────────────────────────────────────────────────────────╮ +│ --help Show this message and exit. │ +╰───────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Commands ────────────────────────────────────────────────────────────────────────────╮ +│ active Print the current active version │ +│ fetch Install the active version, or a specific version │ +│ gui Launch the Camoufox Manager GUI (requires PySide6) │ +│ list List Camoufox versions │ +│ path Print the install directory path │ +│ remove Remove downloaded data. By default, this removes everything. │ +│ Pass --select to pick a browser version to remove. │ +│ server Launch a Playwright server │ +│ set Set the active Camoufox version to use & fetch. │ +│ By default, this opens an interactive selector for versions and settings. │ +│ You can also pass a specifier to activate directly: │ +│ Pin version: │ +│ camoufox set official/stable/134.0.2-beta.20 │ +│ Automatically find latest in a channel source: │ +│ camoufox set official/stable │ +│ sync Sync available versions from remote repositories │ +│ test Open the Playwright inspector │ +│ version Display version, package, browser, and storage info │ +╰───────────────────────────────────────────────────────────────────────────────────────╯ ```
- ### `sync` Pull a list of release assets from GitHub. @@ -253,7 +252,7 @@ Python Packages Playwright v1.57.1.dev0+g732639b35.d20251217 Browser Active official/stable/135.0.1-beta.24 - Browser v135.0.1-beta.24 + Current browser v135.0.1-beta.24 Installed Yes Latest in official/stable? Yes Last Sync 2026-03-07 00:23 diff --git a/pythonlib/camoufox/__main__.py b/pythonlib/camoufox/__main__.py index 4873073..fc4fa86 100644 --- a/pythonlib/camoufox/__main__.py +++ b/pythonlib/camoufox/__main__.py @@ -226,7 +226,7 @@ def cli() -> None: ) def sync(spoof_os, spoof_arch): """ - Sync available versions from remote repositories. + Sync available versions from remote repositories """ if spoof_os == "auto": spoof_os = None @@ -239,7 +239,7 @@ def sync(spoof_os, spoof_arch): @click.argument("version", default=None, required=False) def fetch(version): """ - Install the active version, or a specific version. + Install the active version, or a specific version \b Examples: @@ -343,8 +343,6 @@ def _set_channel(repo_name: str, channel_type: str): config = load_config() config["channel"] = f"{repo_name}/{channel_type}" config.pop("pinned", None) - save_config(config) - click.secho(f"Channel: {repo_name.lower()}/{channel_type}", fg="cyan", bold=True) # Check if latest for this channel is already installed is_pre = channel_type == "prerelease" @@ -358,11 +356,18 @@ def _set_channel(repo_name: str, channel_type: str): latest_build = candidates[0]["build"] for inst in list_installed(): if inst.version.build == latest_build and inst.repo_name == repo_name.lower(): - set_active(inst.relative_path) + config["active_version"] = inst.relative_path + save_config(config) + click.secho( + f"Channel: {repo_name.lower()}/{channel_type}", fg="cyan", bold=True + ) click.secho(f"Using latest: {inst.channel_path} (installed)", fg="green") return break + config.pop("active_version", None) + save_config(config) + click.secho(f"Channel: {repo_name.lower()}/{channel_type}", fg="cyan", bold=True) click.secho("Run 'camoufox fetch' to install latest.", fg="yellow") @@ -373,13 +378,15 @@ def _set_pinned(repo_name: str, channel_type: str, ver_data: dict, inst): config = load_config() config["channel"] = f"{repo_name}/{channel_type}" config["pinned"] = f"{ver_data['version']}-{ver_data['build']}" - save_config(config) ver_str = f"{ver_data['version']}-{ver_data['build']}" display = f"{repo_name.lower()}/{channel_type}/{ver_str}" if inst: - set_active(inst.relative_path) + config["active_version"] = inst.relative_path + save_config(config) click.secho(f"Pinned: {display} (installed)", fg="green") else: + config.pop("active_version", None) + save_config(config) click.secho(f"Pinned: {display}", fg="cyan", bold=True) click.secho("Run 'camoufox fetch' to install.", fg="yellow") @@ -390,10 +397,13 @@ def _set_pinned(repo_name: str, channel_type: str, ver_data: dict, inst): def set_cmd(specifier, geoip): """ \b - Interactive selector for versions and settings - Or, pass a specifier to activate directly: - Pin version: camoufox set official/stable/134.0.2-beta.20 - Auto-update channel: camoufox set official/stable + Set the active Camoufox version to use & fetch. + By default, this opens an interactive selector for versions and settings. + You can also pass a specifier to activate directly: + Pin version: + camoufox set official/stable/134.0.2-beta.20 + Automatically find latest in a channel source: + camoufox set official/stable """ if geoip: _select_geoip_source() @@ -704,10 +714,8 @@ def _list_all(_show_paths: bool): def remove(version_path, select, yes): """ \b - Remove Camoufox data directory, or an installed browser version - Or, remove a specific version: - Select a version: camoufox remove --select - Remove a version: camoufox remove official/stable/134.0.2-beta.20 + Remove downloaded data. By default, this removes everything. + Pass --select to pick a browser version to remove. """ import shutil @@ -862,9 +870,9 @@ class VersionInfo: # Browser version if active_v: - self._row("Browser", f"v{active_v.version.full_string}") + self._row("Current browser", f"v{active_v.version.full_string}") else: - self._row("Browser", "—", style="dim") + self._row("Current browser", "Not installed", style="dim") # Is installed? if active_v: @@ -927,7 +935,7 @@ class VersionInfo: def _dir_size(self, path) -> str: if not path.exists(): - return "—" + return "Nothing here" total = sum(f.stat().st_size for f in path.rglob("*") if f.is_file()) for unit in ("B", "KB", "MB"): if total < 1024: @@ -968,21 +976,28 @@ def active_cmd(): """ Print the current active version """ - installed = list_installed() - for v in installed: - if v.is_active: - click.echo(v.channel_path) - return - config = load_config() pinned = config.get("pinned") channel = config.get("channel") or get_default_channel() + if pinned: - click.echo(f"{channel.lower()}/{pinned} ", nl=False) - rprint("(not installed)", fg="yellow") + # Check if the pinned version is installed + display = f"{channel.lower()}/{pinned}" + target = _find_installed(display) + if target: + click.echo(target.channel_path) + else: + click.echo(f"{display} ", nl=False) + rprint("(not fetched)", fg="yellow") else: + # Using channel, so find active installed version + installed = list_installed() + for v in installed: + if v.is_active: + click.echo(v.channel_path) + return click.echo(f"{channel.lower()} ", nl=False) - rprint("(not installed)", fg="yellow") + rprint("(not fetched)", fg="yellow") @cli.command(name="path") diff --git a/pythonlib/camoufox/gui/assets/icon.ico b/pythonlib/camoufox/gui/assets/icon.ico index ffdac085ac24d1b107a70cc8dc68202f60d35c36..1788048738338ab9337d7de85d0308fa942d09a0 100644 GIT binary patch literal 28205 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 literal 27917 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

%{(#i2ZBqUB>WeQ@S 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

w()2qbo_(G>)P&t33T`6=_Phnw`afG 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 List[InstalledVersion]: def get_active_path() -> Optional[Path]: """ - Get path to active version. Auto-selects newest if none set + Get path to active version. Returns None if no version is active. + Only auto-selects if no channel/pin was been set """ config = load_config() active = config.get('active_version') @@ -245,11 +246,13 @@ def get_active_path() -> Optional[Path]: if path.exists() and (path / 'version.json').exists(): return path - installed = list_installed() - if installed: - config['active_version'] = installed[0].relative_path - save_config(config) - return installed[0].path + # Only auto-select if user didnt set a channel or pin + if not config.get('channel') and not config.get('pinned'): + installed = list_installed() + if installed: + config['active_version'] = installed[0].relative_path + save_config(config) + return installed[0].path return None diff --git a/pythonlib/camoufox/pkgman.py b/pythonlib/camoufox/pkgman.py index 11d56cd..2b3dd2a 100644 --- a/pythonlib/camoufox/pkgman.py +++ b/pythonlib/camoufox/pkgman.py @@ -647,7 +647,15 @@ def installed_verstr() -> str: active = get_active_path() if active is None: - raise FileNotFoundError("No active version. Please run `camoufox fetch` to install.") + from .multiversion import get_default_channel, load_config + + config = load_config() + pinned = config.get("pinned") + channel = config.get("channel") or get_default_channel() + active_display = f"{channel}/{pinned}" if pinned else channel + raise CamoufoxNotInstalled( + f"{active_display} is not installed. " f"Please run `camoufox fetch` to install." + ) return Version.from_path(active).full_string @@ -670,7 +678,18 @@ def camoufox_path(download_if_missing: bool = True) -> Path: if not os.path.exists(INSTALL_DIR) or not os.listdir(INSTALL_DIR): if not download_if_missing: - raise FileNotFoundError(f"Camoufox executable not found at {INSTALL_DIR}") + from .multiversion import load_config, get_default_channel + + config = load_config() + pinned = config.get("pinned") + channel = config.get("channel") or get_default_channel() + if pinned: + active_display = f"{channel}/{pinned}" + else: + active_display = channel + raise CamoufoxNotInstalled( + f"{active_display} is not installed. " f"Please run `camoufox fetch` to install." + ) elif os.path.exists(INSTALL_DIR) and Version.from_path().is_supported(): return INSTALL_DIR