Source code for stouputils.installer.downloader
""" Downloader module for the installer subpackage.
Provides functions for downloading and installing programs from URLs.
It handles platform-specific downloads, checking if programs are already installed,
and setting up the downloaded programs for use.
This module works with the main installer module to provide a complete installation
solution for programs that need to be downloaded from the internet.
"""
# Imports
import os
import platform
import subprocess
import sys
from ..print import info, warning
from .main import install_program
# Functions
[docs]
def download_executable(download_urls: dict[str, str], program_name: str, append_to_path: str = "") -> bool:
""" Ask the user if they want to download the program (ex: waifu2x-ncnn-vulkan).
If yes, try to download the program from the GitHub releases page.
Args:
download_urls (dict[str, str]): The URLs to download the program from.
program_name (str): The name of the program to download.
Returns:
bool: True if the program is now ready to use, False otherwise.
"""
# Ask the user if they want to download the upscaler
program_url: str = next(iter(download_urls.values())).split("/download/")[0]
warning(
f"Program executable not found, would you like to download it automatically from GitHub? (Y/n) :\n"
f"({program_url})"
)
# Handle the user's response
if input().lower() == "n":
info("User declined to download the upscaler.")
return False
# Get the platform
system: str = platform.system()
download_url: str = download_urls.get(system, "")
if not download_url:
warning(
f"Unsupported platform: {system}, please download the program manually from the following URL:\n"
f" {program_url}"
)
return False
# Download the upscaler
if not install_program(download_url, program_name=program_name, append_to_path=append_to_path):
warning("Failed to download the upscaler, please download it manually from the following URL:")
print(f" {download_url}")
return False
return True
[docs]
def check_executable(
executable: str,
executable_help_text: str,
download_urls: dict[str, str],
append_to_path: str = ""
) -> None:
""" Check if the executable exists, optionally download it if it doesn't.
Args:
executable (str): The path to the executable.
executable_help_text (str): The help text to check for in the executable's output.
download_urls (dict[str, str]): The URLs to download the executable from.
append_to_path (str): The path to append to the executable's path.
(ex: "bin" if executables are in the bin folder)
"""
program_name: str = os.path.basename(executable)
try_download: bool = True
# Run the command, capture output, don't check exit code immediately
try:
result: subprocess.CompletedProcess[str] = subprocess.run(
[executable, "-h"],
capture_output=True,
text=True, # Decode stdout/stderr as text
check=False # Don't raise exception on non-zero exit code
)
# If the command failed (no help text matching), try to download the upscaler
try_download: bool = executable_help_text.lower() not in result.stdout.lower()
except FileNotFoundError:
try_download: bool = True
# If the command failed, try to download the upscaler
if try_download:
if not download_executable(download_urls, program_name, append_to_path=append_to_path):
warning(f"'{program_name}' is required but not available. Exiting.")
else:
info(f"'{program_name}' downloaded successfully, please restart the script.")
sys.exit(1)