Spaces:
Running
Running
# System_Checks_Lib.py | |
######################################### | |
# System Checks Library | |
# This library is used to check the system for the necessary dependencies to run the script. | |
# It checks for the OS, the availability of the GPU, and the availability of the ffmpeg executable. | |
# If the GPU is available, it asks the user if they would like to use it for processing. | |
# If ffmpeg is not found, it asks the user if they would like to download it. | |
# The script will exit if the user chooses not to download ffmpeg. | |
#### | |
#################### | |
# Function List | |
# | |
# 1. platform_check() | |
# 2. cuda_check() | |
# 3. decide_cpugpu() | |
# 4. check_ffmpeg() | |
# 5. download_ffmpeg() | |
# | |
#################### | |
# Import necessary libraries | |
import logging | |
import os | |
import platform | |
import requests | |
import shutil | |
import subprocess | |
import zipfile | |
# Import Local Libraries | |
#from App_Function_Libraries import | |
# | |
####################################################################################################################### | |
# Function Definitions | |
# | |
def platform_check(): | |
global userOS | |
if platform.system() == "Linux": | |
print("Linux OS detected \n Running Linux appropriate commands") | |
userOS = "Linux" | |
elif platform.system() == "Windows": | |
print("Windows OS detected \n Running Windows appropriate commands") | |
userOS = "Windows" | |
else: | |
print("Other OS detected \n Maybe try running things manually?") | |
exit() | |
# Check for NVIDIA GPU and CUDA availability | |
def cuda_check(): | |
global processing_choice | |
try: | |
# Run nvidia-smi to capture its output | |
nvidia_smi_output = subprocess.check_output("nvidia-smi", shell=True).decode() | |
# Look for CUDA version in the output | |
if "CUDA Version" in nvidia_smi_output: | |
cuda_version = next( | |
(line.split(":")[-1].strip() for line in nvidia_smi_output.splitlines() if "CUDA Version" in line), | |
"Not found") | |
print(f"NVIDIA GPU with CUDA Version {cuda_version} is available.") | |
processing_choice = "cuda" | |
else: | |
print("CUDA is not installed or configured correctly.") | |
processing_choice = "cpu" | |
except subprocess.CalledProcessError as e: | |
print(f"Failed to run 'nvidia-smi': {str(e)}") | |
processing_choice = "cpu" | |
except Exception as e: | |
print(f"An error occurred: {str(e)}") | |
processing_choice = "cpu" | |
# Optionally, check for the CUDA_VISIBLE_DEVICES env variable as an additional check | |
if "CUDA_VISIBLE_DEVICES" in os.environ: | |
print("CUDA_VISIBLE_DEVICES is set:", os.environ["CUDA_VISIBLE_DEVICES"]) | |
else: | |
print("CUDA_VISIBLE_DEVICES not set.") | |
# Ask user if they would like to use either their GPU or their CPU for transcription | |
def decide_cpugpu(): | |
global processing_choice | |
processing_input = input("Would you like to use your GPU or CPU for transcription? (1/cuda)GPU/(2/cpu)CPU): ") | |
if processing_choice == "cuda" and (processing_input.lower() == "cuda" or processing_input == "1"): | |
print("You've chosen to use the GPU.") | |
logging.debug("GPU is being used for processing") | |
processing_choice = "cuda" | |
elif processing_input.lower() == "cpu" or processing_input == "2": | |
print("You've chosen to use the CPU.") | |
logging.debug("CPU is being used for processing") | |
processing_choice = "cpu" | |
else: | |
print("Invalid choice. Please select either GPU or CPU.") | |
# check for existence of ffmpeg | |
def check_ffmpeg(): | |
if shutil.which("ffmpeg") or (os.path.exists("Bin") and os.path.isfile(".\\Bin\\ffmpeg.exe")): | |
logging.debug("ffmpeg found installed on the local system, in the local PATH, or in the './Bin' folder") | |
pass | |
else: | |
logging.debug("ffmpeg not installed on the local system/in local PATH") | |
print( | |
"ffmpeg is not installed.\n\n You can either install it manually, or through your package manager of " | |
"choice.\n Windows users, builds are here: https://www.gyan.dev/ffmpeg/builds/") | |
if userOS == "Windows": | |
download_ffmpeg() | |
elif userOS == "Linux": | |
print( | |
"You should install ffmpeg using your platform's appropriate package manager, 'apt install ffmpeg'," | |
"'dnf install ffmpeg' or 'pacman', etc.") | |
else: | |
logging.debug("running an unsupported OS") | |
print("You're running an unspported/Un-tested OS") | |
exit_script = input("Let's exit the script, unless you're feeling lucky? (y/n)") | |
if exit_script == "y" or "yes" or "1": | |
exit() | |
# Download ffmpeg | |
def download_ffmpeg(): | |
user_choice = input("Do you want to download ffmpeg? (y)Yes/(n)No: ") | |
if user_choice.lower() in ['yes', 'y', '1']: | |
print("Downloading ffmpeg") | |
url = "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip" | |
response = requests.get(url) | |
if response.status_code == 200: | |
print("Saving ffmpeg zip file") | |
logging.debug("Saving ffmpeg zip file") | |
zip_path = "ffmpeg-release-essentials.zip" | |
with open(zip_path, 'wb') as file: | |
file.write(response.content) | |
logging.debug("Extracting the 'ffmpeg.exe' file from the zip") | |
print("Extracting ffmpeg.exe from zip file to '/Bin' folder") | |
with zipfile.ZipFile(zip_path, 'r') as zip_ref: | |
# Find the ffmpeg.exe file within the zip | |
ffmpeg_path = None | |
for file_info in zip_ref.infolist(): | |
if file_info.filename.endswith("ffmpeg.exe"): | |
ffmpeg_path = file_info.filename | |
break | |
if ffmpeg_path is None: | |
logging.error("ffmpeg.exe not found in the zip file.") | |
print("ffmpeg.exe not found in the zip file.") | |
return | |
logging.debug("checking if the './Bin' folder exists, creating if not") | |
bin_folder = "Bin" | |
if not os.path.exists(bin_folder): | |
logging.debug("Creating a folder for './Bin', it didn't previously exist") | |
os.makedirs(bin_folder) | |
logging.debug("Extracting 'ffmpeg.exe' to the './Bin' folder") | |
zip_ref.extract(ffmpeg_path, path=bin_folder) | |
logging.debug("Moving 'ffmpeg.exe' to the './Bin' folder") | |
src_path = os.path.join(bin_folder, ffmpeg_path) | |
dst_path = os.path.join(bin_folder, "ffmpeg.exe") | |
shutil.move(src_path, dst_path) | |
logging.debug("Removing ffmpeg zip file") | |
print("Deleting zip file (we've already extracted ffmpeg.exe, no worries)") | |
os.remove(zip_path) | |
logging.debug("ffmpeg.exe has been downloaded and extracted to the './Bin' folder.") | |
print("ffmpeg.exe has been successfully downloaded and extracted to the './Bin' folder.") | |
else: | |
logging.error("Failed to download the zip file.") | |
print("Failed to download the zip file.") | |
else: | |
logging.debug("User chose to not download ffmpeg") | |
print("ffmpeg will not be downloaded.") | |
# | |
# | |
####################################################################################################################### | |