| Total Complexity | 7 |
| Total Lines | 47 |
| Duplicated Lines | 0 % |
| Changes | 0 | ||
| 1 | import plistlib |
||
| 2 | from pathlib import Path |
||
| 3 | |||
| 4 | import log |
||
| 5 | |||
| 6 | from . import script |
||
| 7 | |||
| 8 | FUNCTIONS = Path(__file__).parent / "browser.applescript" |
||
| 9 | PREFERENCES = ( |
||
| 10 | Path.home() |
||
| 11 | / "Library" |
||
| 12 | / "Preferences" |
||
| 13 | / "com.apple.LaunchServices/com.apple.launchservices.secure.plist" |
||
| 14 | ) |
||
| 15 | |||
| 16 | NAMES = { |
||
| 17 | "com.apple.safari": "Safari", |
||
| 18 | "com.google.chrome": "Google Chrome", |
||
| 19 | "org.mozilla.firefox": "Firefox", |
||
| 20 | } |
||
| 21 | DEFAULT = NAMES["com.google.chrome"] |
||
| 22 | |||
| 23 | |||
| 24 | def detect(data: dict | None = None) -> str: |
||
| 25 | if data is None: |
||
| 26 | if PREFERENCES.exists(): |
||
| 27 | with PREFERENCES.open("rb") as fp: |
||
| 28 | data = plistlib.load(fp) |
||
| 29 | else: |
||
| 30 | log.debug(f"File not found: {PREFERENCES}") |
||
| 31 | data = {} |
||
| 32 | |||
| 33 | for handler in data.get("LSHandlers", []): |
||
| 34 | if handler.get("LSHandlerURLScheme") == "http": |
||
| 35 | role = handler["LSHandlerRoleAll"] |
||
| 36 | name = NAMES[role] |
||
| 37 | log.info(f"Detected default browser: {name}") |
||
| 38 | return name |
||
| 39 | |||
| 40 | log.warn("Unable to determine the default browser") |
||
| 41 | return DEFAULT |
||
| 42 | |||
| 43 | |||
| 44 | def close(name: str = "") -> bool: |
||
| 45 | replacements = {DEFAULT: name or detect()} |
||
| 46 | return script.call(FUNCTIONS, "close()", replacements) |
||
| 47 |