Spaces:
Running
Running
oceansweep
commited on
Commit
•
22a38f7
1
Parent(s):
7a303e8
Update App_Function_Libraries/System_Checks_Lib.py
Browse files
App_Function_Libraries/System_Checks_Lib.py
CHANGED
@@ -1,184 +1,184 @@
|
|
1 |
-
# System_Checks_Lib.py
|
2 |
-
#########################################
|
3 |
-
# System Checks Library
|
4 |
-
# This library is used to check the system for the necessary dependencies to run the script.
|
5 |
-
# It checks for the OS, the availability of the GPU, and the availability of the ffmpeg executable.
|
6 |
-
# If the GPU is available, it asks the user if they would like to use it for processing.
|
7 |
-
# If ffmpeg is not found, it asks the user if they would like to download it.
|
8 |
-
# The script will exit if the user chooses not to download ffmpeg.
|
9 |
-
####
|
10 |
-
|
11 |
-
####################
|
12 |
-
# Function List
|
13 |
-
#
|
14 |
-
# 1. platform_check()
|
15 |
-
# 2. cuda_check()
|
16 |
-
# 3. decide_cpugpu()
|
17 |
-
# 4. check_ffmpeg()
|
18 |
-
# 5. download_ffmpeg()
|
19 |
-
#
|
20 |
-
####################
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
# Import necessary libraries
|
26 |
-
import logging
|
27 |
-
import os
|
28 |
-
import platform
|
29 |
-
import requests
|
30 |
-
import shutil
|
31 |
-
import subprocess
|
32 |
-
import zipfile
|
33 |
-
# Import Local Libraries
|
34 |
-
#from App_Function_Libraries import
|
35 |
-
#
|
36 |
-
#######################################################################################################################
|
37 |
-
# Function Definitions
|
38 |
-
#
|
39 |
-
|
40 |
-
def platform_check():
|
41 |
-
global userOS
|
42 |
-
if platform.system() == "Linux":
|
43 |
-
print("Linux OS detected \n Running Linux appropriate commands")
|
44 |
-
userOS = "Linux"
|
45 |
-
elif platform.system() == "Windows":
|
46 |
-
print("Windows OS detected \n Running Windows appropriate commands")
|
47 |
-
userOS = "Windows"
|
48 |
-
else:
|
49 |
-
print("Other OS detected \n Maybe try running things manually?")
|
50 |
-
exit()
|
51 |
-
|
52 |
-
|
53 |
-
# Check for NVIDIA GPU and CUDA availability
|
54 |
-
def cuda_check():
|
55 |
-
global processing_choice
|
56 |
-
try:
|
57 |
-
# Run nvidia-smi to capture its output
|
58 |
-
nvidia_smi_output = subprocess.check_output("nvidia-smi", shell=True).decode()
|
59 |
-
|
60 |
-
# Look for CUDA version in the output
|
61 |
-
if "CUDA Version" in nvidia_smi_output:
|
62 |
-
cuda_version = next(
|
63 |
-
(line.split(":")[-1].strip() for line in nvidia_smi_output.splitlines() if "CUDA Version" in line),
|
64 |
-
"Not found")
|
65 |
-
print(f"NVIDIA GPU with CUDA Version {cuda_version} is available.")
|
66 |
-
processing_choice = "cuda"
|
67 |
-
else:
|
68 |
-
print("CUDA is not installed or configured correctly.")
|
69 |
-
processing_choice = "cpu"
|
70 |
-
|
71 |
-
except subprocess.CalledProcessError as e:
|
72 |
-
print(f"Failed to run 'nvidia-smi': {str(e)}")
|
73 |
-
processing_choice = "cpu"
|
74 |
-
except Exception as e:
|
75 |
-
print(f"An error occurred: {str(e)}")
|
76 |
-
processing_choice = "cpu"
|
77 |
-
|
78 |
-
# Optionally, check for the CUDA_VISIBLE_DEVICES env variable as an additional check
|
79 |
-
if "CUDA_VISIBLE_DEVICES" in os.environ:
|
80 |
-
print("CUDA_VISIBLE_DEVICES is set:", os.environ["CUDA_VISIBLE_DEVICES"])
|
81 |
-
else:
|
82 |
-
print("CUDA_VISIBLE_DEVICES not set.")
|
83 |
-
|
84 |
-
|
85 |
-
# Ask user if they would like to use either their GPU or their CPU for transcription
|
86 |
-
def decide_cpugpu():
|
87 |
-
global processing_choice
|
88 |
-
processing_input = input("Would you like to use your GPU or CPU for transcription? (1/cuda)GPU/(2/cpu)CPU): ")
|
89 |
-
if processing_choice == "cuda" and (processing_input.lower() == "cuda" or processing_input == "1"):
|
90 |
-
print("You've chosen to use the GPU.")
|
91 |
-
logging.debug("GPU is being used for processing")
|
92 |
-
processing_choice = "cuda"
|
93 |
-
elif processing_input.lower() == "cpu" or processing_input == "2":
|
94 |
-
print("You've chosen to use the CPU.")
|
95 |
-
logging.debug("CPU is being used for processing")
|
96 |
-
processing_choice = "cpu"
|
97 |
-
else:
|
98 |
-
print("Invalid choice. Please select either GPU or CPU.")
|
99 |
-
|
100 |
-
|
101 |
-
# check for existence of ffmpeg
|
102 |
-
def check_ffmpeg():
|
103 |
-
if shutil.which("ffmpeg") or (os.path.exists("Bin") and os.path.isfile(".\\Bin\\ffmpeg.exe")):
|
104 |
-
logging.debug("ffmpeg found installed on the local system, in the local PATH, or in the './Bin' folder")
|
105 |
-
pass
|
106 |
-
else:
|
107 |
-
logging.debug("ffmpeg not installed on the local system/in local PATH")
|
108 |
-
print(
|
109 |
-
"ffmpeg is not installed.\n\n You can either install it manually, or through your package manager of "
|
110 |
-
"choice.\n Windows users, builds are here: https://www.gyan.dev/ffmpeg/builds/")
|
111 |
-
if userOS == "Windows":
|
112 |
-
download_ffmpeg()
|
113 |
-
elif userOS == "Linux":
|
114 |
-
print(
|
115 |
-
"You should install ffmpeg using your platform's appropriate package manager, 'apt install ffmpeg',"
|
116 |
-
"'dnf install ffmpeg' or 'pacman', etc.")
|
117 |
-
else:
|
118 |
-
logging.debug("running an unsupported OS")
|
119 |
-
print("You're running an unspported/Un-tested OS")
|
120 |
-
exit_script = input("Let's exit the script, unless you're feeling lucky? (y/n)")
|
121 |
-
if exit_script == "y" or "yes" or "1":
|
122 |
-
exit()
|
123 |
-
|
124 |
-
|
125 |
-
# Download ffmpeg
|
126 |
-
def download_ffmpeg():
|
127 |
-
user_choice = input("Do you want to download ffmpeg? (y)Yes/(n)No: ")
|
128 |
-
if user_choice.lower() in ['yes', 'y', '1']:
|
129 |
-
print("Downloading ffmpeg")
|
130 |
-
url = "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip"
|
131 |
-
response = requests.get(url)
|
132 |
-
|
133 |
-
if response.status_code == 200:
|
134 |
-
print("Saving ffmpeg zip file")
|
135 |
-
logging.debug("Saving ffmpeg zip file")
|
136 |
-
zip_path = "ffmpeg-release-essentials.zip"
|
137 |
-
with open(zip_path, 'wb') as file:
|
138 |
-
file.write(response.content)
|
139 |
-
|
140 |
-
logging.debug("Extracting the 'ffmpeg.exe' file from the zip")
|
141 |
-
print("Extracting ffmpeg.exe from zip file to '/Bin' folder")
|
142 |
-
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
|
143 |
-
# Find the ffmpeg.exe file within the zip
|
144 |
-
ffmpeg_path = None
|
145 |
-
for file_info in zip_ref.infolist():
|
146 |
-
if file_info.filename.endswith("ffmpeg.exe"):
|
147 |
-
ffmpeg_path = file_info.filename
|
148 |
-
break
|
149 |
-
|
150 |
-
if ffmpeg_path is None:
|
151 |
-
logging.error("ffmpeg.exe not found in the zip file.")
|
152 |
-
print("ffmpeg.exe not found in the zip file.")
|
153 |
-
return
|
154 |
-
|
155 |
-
logging.debug("checking if the './Bin' folder exists, creating if not")
|
156 |
-
bin_folder = "Bin"
|
157 |
-
if not os.path.exists(bin_folder):
|
158 |
-
logging.debug("Creating a folder for './Bin', it didn't previously exist")
|
159 |
-
os.makedirs(bin_folder)
|
160 |
-
|
161 |
-
logging.debug("Extracting 'ffmpeg.exe' to the './Bin' folder")
|
162 |
-
zip_ref.extract(ffmpeg_path, path=bin_folder)
|
163 |
-
|
164 |
-
logging.debug("Moving 'ffmpeg.exe' to the './Bin' folder")
|
165 |
-
src_path = os.path.join(bin_folder, ffmpeg_path)
|
166 |
-
dst_path = os.path.join(bin_folder, "ffmpeg.exe")
|
167 |
-
shutil.move(src_path, dst_path)
|
168 |
-
|
169 |
-
logging.debug("Removing ffmpeg zip file")
|
170 |
-
print("Deleting zip file (we've already extracted ffmpeg.exe, no worries)")
|
171 |
-
os.remove(zip_path)
|
172 |
-
|
173 |
-
logging.debug("ffmpeg.exe has been downloaded and extracted to the './Bin' folder.")
|
174 |
-
print("ffmpeg.exe has been successfully downloaded and extracted to the './Bin' folder.")
|
175 |
-
else:
|
176 |
-
logging.error("Failed to download the zip file.")
|
177 |
-
print("Failed to download the zip file.")
|
178 |
-
else:
|
179 |
-
logging.debug("User chose to not download ffmpeg")
|
180 |
-
print("ffmpeg will not be downloaded.")
|
181 |
-
|
182 |
-
#
|
183 |
-
#
|
184 |
-
#######################################################################################################################
|
|
|
1 |
+
# System_Checks_Lib.py
|
2 |
+
#########################################
|
3 |
+
# System Checks Library
|
4 |
+
# This library is used to check the system for the necessary dependencies to run the script.
|
5 |
+
# It checks for the OS, the availability of the GPU, and the availability of the ffmpeg executable.
|
6 |
+
# If the GPU is available, it asks the user if they would like to use it for processing.
|
7 |
+
# If ffmpeg is not found, it asks the user if they would like to download it.
|
8 |
+
# The script will exit if the user chooses not to download ffmpeg.
|
9 |
+
####
|
10 |
+
|
11 |
+
####################
|
12 |
+
# Function List
|
13 |
+
#
|
14 |
+
# 1. platform_check()
|
15 |
+
# 2. cuda_check()
|
16 |
+
# 3. decide_cpugpu()
|
17 |
+
# 4. check_ffmpeg()
|
18 |
+
# 5. download_ffmpeg()
|
19 |
+
#
|
20 |
+
####################
|
21 |
+
|
22 |
+
|
23 |
+
|
24 |
+
|
25 |
+
# Import necessary libraries
|
26 |
+
import logging
|
27 |
+
import os
|
28 |
+
import platform
|
29 |
+
import requests
|
30 |
+
import shutil
|
31 |
+
import subprocess
|
32 |
+
import zipfile
|
33 |
+
# Import Local Libraries
|
34 |
+
#from App_Function_Libraries import
|
35 |
+
#
|
36 |
+
#######################################################################################################################
|
37 |
+
# Function Definitions
|
38 |
+
#
|
39 |
+
|
40 |
+
def platform_check():
|
41 |
+
global userOS
|
42 |
+
if platform.system() == "Linux":
|
43 |
+
print("Linux OS detected \n Running Linux appropriate commands")
|
44 |
+
userOS = "Linux"
|
45 |
+
elif platform.system() == "Windows":
|
46 |
+
print("Windows OS detected \n Running Windows appropriate commands")
|
47 |
+
userOS = "Windows"
|
48 |
+
else:
|
49 |
+
print("Other OS detected \n Maybe try running things manually?")
|
50 |
+
exit()
|
51 |
+
|
52 |
+
|
53 |
+
# Check for NVIDIA GPU and CUDA availability
|
54 |
+
def cuda_check():
|
55 |
+
global processing_choice
|
56 |
+
try:
|
57 |
+
# Run nvidia-smi to capture its output
|
58 |
+
nvidia_smi_output = subprocess.check_output("nvidia-smi", shell=True).decode()
|
59 |
+
|
60 |
+
# Look for CUDA version in the output
|
61 |
+
if "CUDA Version" in nvidia_smi_output:
|
62 |
+
cuda_version = next(
|
63 |
+
(line.split(":")[-1].strip() for line in nvidia_smi_output.splitlines() if "CUDA Version" in line),
|
64 |
+
"Not found")
|
65 |
+
print(f"NVIDIA GPU with CUDA Version {cuda_version} is available.")
|
66 |
+
processing_choice = "cuda"
|
67 |
+
else:
|
68 |
+
print("CUDA is not installed or configured correctly.")
|
69 |
+
processing_choice = "cpu"
|
70 |
+
|
71 |
+
except subprocess.CalledProcessError as e:
|
72 |
+
print(f"Failed to run 'nvidia-smi': {str(e)}")
|
73 |
+
processing_choice = "cpu"
|
74 |
+
except Exception as e:
|
75 |
+
print(f"An error occurred: {str(e)}")
|
76 |
+
processing_choice = "cpu"
|
77 |
+
|
78 |
+
# Optionally, check for the CUDA_VISIBLE_DEVICES env variable as an additional check
|
79 |
+
if "CUDA_VISIBLE_DEVICES" in os.environ:
|
80 |
+
print("CUDA_VISIBLE_DEVICES is set:", os.environ["CUDA_VISIBLE_DEVICES"])
|
81 |
+
else:
|
82 |
+
print("CUDA_VISIBLE_DEVICES not set.")
|
83 |
+
|
84 |
+
|
85 |
+
# Ask user if they would like to use either their GPU or their CPU for transcription
|
86 |
+
def decide_cpugpu():
|
87 |
+
global processing_choice
|
88 |
+
processing_input = input("Would you like to use your GPU or CPU for transcription? (1/cuda)GPU/(2/cpu)CPU): ")
|
89 |
+
if processing_choice == "cuda" and (processing_input.lower() == "cuda" or processing_input == "1"):
|
90 |
+
print("You've chosen to use the GPU.")
|
91 |
+
logging.debug("GPU is being used for processing")
|
92 |
+
processing_choice = "cuda"
|
93 |
+
elif processing_input.lower() == "cpu" or processing_input == "2":
|
94 |
+
print("You've chosen to use the CPU.")
|
95 |
+
logging.debug("CPU is being used for processing")
|
96 |
+
processing_choice = "cpu"
|
97 |
+
else:
|
98 |
+
print("Invalid choice. Please select either GPU or CPU.")
|
99 |
+
|
100 |
+
|
101 |
+
# check for existence of ffmpeg
|
102 |
+
def check_ffmpeg():
|
103 |
+
if shutil.which("ffmpeg") or (os.path.exists("Bin") and os.path.isfile(".\\Bin\\ffmpeg.exe")):
|
104 |
+
logging.debug("ffmpeg found installed on the local system, in the local PATH, or in the './Bin' folder")
|
105 |
+
pass
|
106 |
+
else:
|
107 |
+
logging.debug("ffmpeg not installed on the local system/in local PATH")
|
108 |
+
print(
|
109 |
+
"ffmpeg is not installed.\n\n You can either install it manually, or through your package manager of "
|
110 |
+
"choice.\n Windows users, builds are here: https://www.gyan.dev/ffmpeg/builds/")
|
111 |
+
if userOS == "Windows":
|
112 |
+
download_ffmpeg()
|
113 |
+
elif userOS == "Linux":
|
114 |
+
print(
|
115 |
+
"You should install ffmpeg using your platform's appropriate package manager, 'apt install ffmpeg',"
|
116 |
+
"'dnf install ffmpeg' or 'pacman', etc.")
|
117 |
+
else:
|
118 |
+
logging.debug("running an unsupported OS")
|
119 |
+
print("You're running an unspported/Un-tested OS")
|
120 |
+
exit_script = input("Let's exit the script, unless you're feeling lucky? (y/n)")
|
121 |
+
if exit_script == "y" or "yes" or "1":
|
122 |
+
exit()
|
123 |
+
|
124 |
+
|
125 |
+
# Download ffmpeg
|
126 |
+
def download_ffmpeg():
|
127 |
+
user_choice = input("Do you want to download ffmpeg? (y)Yes/(n)No: ")
|
128 |
+
if user_choice.lower() in ['yes', 'y', '1']:
|
129 |
+
print("Downloading ffmpeg")
|
130 |
+
url = "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip"
|
131 |
+
response = requests.get(url)
|
132 |
+
|
133 |
+
if response.status_code == 200:
|
134 |
+
print("Saving ffmpeg zip file")
|
135 |
+
logging.debug("Saving ffmpeg zip file")
|
136 |
+
zip_path = "ffmpeg-release-essentials.zip"
|
137 |
+
with open(zip_path, 'wb') as file:
|
138 |
+
file.write(response.content)
|
139 |
+
|
140 |
+
logging.debug("Extracting the 'ffmpeg.exe' file from the zip")
|
141 |
+
print("Extracting ffmpeg.exe from zip file to '/Bin' folder")
|
142 |
+
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
|
143 |
+
# Find the ffmpeg.exe file within the zip
|
144 |
+
ffmpeg_path = None
|
145 |
+
for file_info in zip_ref.infolist():
|
146 |
+
if file_info.filename.endswith("ffmpeg.exe"):
|
147 |
+
ffmpeg_path = file_info.filename
|
148 |
+
break
|
149 |
+
|
150 |
+
if ffmpeg_path is None:
|
151 |
+
logging.error("ffmpeg.exe not found in the zip file.")
|
152 |
+
print("ffmpeg.exe not found in the zip file.")
|
153 |
+
return
|
154 |
+
|
155 |
+
logging.debug("checking if the './Bin' folder exists, creating if not")
|
156 |
+
bin_folder = "Bin"
|
157 |
+
if not os.path.exists(bin_folder):
|
158 |
+
logging.debug("Creating a folder for './Bin', it didn't previously exist")
|
159 |
+
os.makedirs(bin_folder)
|
160 |
+
|
161 |
+
logging.debug("Extracting 'ffmpeg.exe' to the './Bin' folder")
|
162 |
+
zip_ref.extract(ffmpeg_path, path=bin_folder)
|
163 |
+
|
164 |
+
logging.debug("Moving 'ffmpeg.exe' to the './Bin' folder")
|
165 |
+
src_path = os.path.join(bin_folder, ffmpeg_path)
|
166 |
+
dst_path = os.path.join(bin_folder, "ffmpeg.exe")
|
167 |
+
shutil.move(src_path, dst_path)
|
168 |
+
|
169 |
+
logging.debug("Removing ffmpeg zip file")
|
170 |
+
print("Deleting zip file (we've already extracted ffmpeg.exe, no worries)")
|
171 |
+
os.remove(zip_path)
|
172 |
+
|
173 |
+
logging.debug("ffmpeg.exe has been downloaded and extracted to the './Bin' folder.")
|
174 |
+
print("ffmpeg.exe has been successfully downloaded and extracted to the './Bin' folder.")
|
175 |
+
else:
|
176 |
+
logging.error("Failed to download the zip file.")
|
177 |
+
print("Failed to download the zip file.")
|
178 |
+
else:
|
179 |
+
logging.debug("User chose to not download ffmpeg")
|
180 |
+
print("ffmpeg will not be downloaded.")
|
181 |
+
|
182 |
+
#
|
183 |
+
#
|
184 |
+
#######################################################################################################################
|