From 53cac655405405dfb1165281fd11da760c835d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Misty=20De=20M=C3=A9o?= Date: Wed, 19 Feb 2025 11:03:58 -0800 Subject: [PATCH] CLI: improve Chrome finding on Mac On macOS, we can find Chrome even if it's installed in a non-default path by querying `mdfind`. This is the CLI entrypoint to Spotlight, and we can use it to look up applications using their unique bundle identifiers. If `mdfind` fails to find anything, this falls back to the hardcoded paths. This should ensure this still works if Spotlight indexing is off, but Chrome is in the default path. --- brozzler/cli.py | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/brozzler/cli.py b/brozzler/cli.py index ab73602..ffdbfe5 100755 --- a/brozzler/cli.py +++ b/brozzler/cli.py @@ -29,6 +29,7 @@ import requests import doublethink import signal import string +import subprocess import sys import threading import time @@ -126,8 +127,36 @@ def configure_logging(args): ) -def suggest_default_chrome_exe(): - # mac os x application executable paths +def mdfind(identifier): + try: + result = subprocess.check_output( + ["mdfind", f"kMDItemCFBundleIdentifier == {identifier}"], text=True + ) + # Just treat any errors as "couldn't find app" + except subprocess.CalledProcessError: + return None + + if result: + return result.rstrip("\n") + + +def suggest_default_chrome_exe_mac(): + path = None + # Try Chromium first, then Chrome + result = mdfind("org.chromium.Chromium") + if result is not None: + path = f"{result}/Contents/MacOS/Chromium" + + result = mdfind("com.google.Chrome") + if result is not None: + path = f"{result}/Contents/MacOS/Google Chrome" + + if path is not None and os.path.exists(path): + return path + + # Fall back to default paths if mdfind couldn't find it + # (mdfind might fail to find them even in their default paths + # if the system has Spotlight disabled.) for path in [ "/Applications/Chromium.app/Contents/MacOS/Chromium", "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", @@ -135,6 +164,14 @@ def suggest_default_chrome_exe(): if os.path.exists(path): return path + +def suggest_default_chrome_exe(): + # First ask mdfind, which lets us find it in non-default paths + if sys.platform == "darwin": + path = suggest_default_chrome_exe_mac() + if path is not None: + return path + # "chromium-browser" is the executable on ubuntu trusty # https://github.com/internetarchive/brozzler/pull/6/files uses "chromium" # google chrome executable names taken from these packages: