omegafox/pythonlib/camoufox/xpi_dl.py
daijro ca7c3e3aa8 No progress bar on addon download #65
- Removed progress bars on addon download (shows as percent instead)
- Default addons are downloaded on `camoufox fetch`
2024-11-03 04:01:17 -06:00

67 lines
2.2 KiB
Python

import os
from multiprocessing import Lock
from typing import List, Optional
from .addons import DefaultAddons
from .pkgman import get_path, unzip, webdl
def add_default_addons(
addons_list: List[str], exclude_list: Optional[List[DefaultAddons]] = None
) -> None:
"""
Adds default addons, minus any specified in exclude_list, to addons_list
"""
# Build a dictionary from DefaultAddons, excluding keys found in exclude_list
if exclude_list is None:
exclude_list = []
addons = [addon for addon in DefaultAddons if addon not in exclude_list]
with Lock():
maybe_download_addons(addons, addons_list)
def download_and_extract(url: str, extract_path: str, name: str) -> None:
"""
Downloads and extracts an addon from a given URL to a specified path
"""
# Create a temporary file to store the downloaded zip
buffer = webdl(url, desc=f"Downloading addon ({name})", bar=False)
unzip(buffer, extract_path, f"Extracting addon ({name})", bar=False)
def get_addon_path(addon_name: str) -> str:
"""
Returns a path to the addon
"""
return get_path(os.path.join("addons", addon_name))
def maybe_download_addons(
addons: List[DefaultAddons], addons_list: Optional[List[str]] = None
) -> None:
"""
Downloads and extracts addons from a given dictionary to a specified list
Skips downloading if the addon is already downloaded
"""
for addon in addons:
# Get the addon path
addon_path = get_addon_path(addon.name)
# Check if the addon is already extracted
if os.path.exists(addon_path):
# Add the existing addon path to addons_list
if addons_list is not None:
addons_list.append(addon_path)
continue
# Addon doesn't exist, create directory and download
try:
os.makedirs(addon_path, exist_ok=True)
download_and_extract(addon.value, addon_path, addon.name)
# Add the new addon directory path to addons_list
if addons_list is not None:
addons_list.append(addon_path)
except Exception as e:
print(f"Failed to download and extract {addon.name}: {e}")