Compare commits

..

No commits in common. "5f217f299591d384582042c68285344d7dedcf6d" and "802fbdebd1333dfcfe6586f35ddd4ddc4e08bdb9" have entirely different histories.

2 changed files with 123 additions and 151 deletions

View File

@ -1,106 +1,88 @@
"""Module to check for and download CDM files."""
import os import os
import sys
import yaml import yaml
import requests import requests
CONFIG_PATH = os.path.join(os.getcwd(), "configs", "config.yaml")
def check_for_wvd_cdm():
def load_config(): with open(f"{os.getcwd()}/configs/config.yaml", "r") as file:
"""Load the config file.""" config = yaml.safe_load(file)
with open(CONFIG_PATH, "r", encoding="utf-8") as file: if config["default_wv_cdm"] == "":
return yaml.safe_load(file)
def save_config(config):
"""Save the config file."""
with open(CONFIG_PATH, "w", encoding="utf-8") as file:
yaml.dump(config, file)
def prompt_yes_no(message):
"""Prompt the user for a yes or no answer."""
answer = " " answer = " "
while answer[0].upper() not in ["Y", "N"]: while answer[0].upper() != "Y" and answer[0].upper() != "N":
answer = input(message) answer = input(
return answer[0].upper() == "Y" "No default Widevine CDM specified, would you like to download one from The CDM Project? (Y)es/(N)o: "
)
if answer[0].upper() == "Y":
def check_for_cdm(config_key, file_ext, download_url, cdm_dir, cdm_name): response = requests.get(
"""Check for a CDM file.""" url="https://cdm-project.com/CDRM-Team/CDMs/raw/branch/main/Widevine/L3/public.wvd"
config = load_config() )
cdm_value = config.get(config_key, "")
cdm_dir_path = os.path.join(os.getcwd(), "configs", "CDMs", cdm_dir)
os.makedirs(cdm_dir_path, exist_ok=True)
if not cdm_value:
if prompt_yes_no(
f"No default {cdm_name} CDM specified, would you like to download one "
"from The CDM Project? (Y)es / (N)o: "
):
response = requests.get(download_url, timeout=10)
if response.status_code == 200: if response.status_code == 200:
file_path = os.path.join(cdm_dir_path, f"public.{file_ext}") with open(f"{os.getcwd()}/configs/CDMs/WV/public.wvd", "wb") as file:
with open(file_path, "wb") as file:
file.write(response.content) file.write(response.content)
config[config_key] = "public" config["default_wv_cdm"] = "public"
save_config(config) with open(f"{os.getcwd()}/configs/config.yaml", "w") as file:
print(f"Successfully downloaded {cdm_name} CDM") yaml.dump(config, file)
print("Successfully downloaded Widevine CDM")
else: else:
sys.exit( exit(
f"Download failed, please try again, or place a .{file_ext} file " f"Download failed, please try again or place a .wvd file in {os.getcwd()}/configs/CDMs/WV and specify the name in {os.getcwd()}/configs/config.yaml"
f"in {cdm_dir_path} and specify the name in {CONFIG_PATH}" )
if answer[0].upper() == "N":
exit(
f"Place a .wvd file in {os.getcwd()}/configs/CDMs/WV and specify the name in {os.getcwd()}/configs/config.yaml"
) )
else: else:
sys.exit( base_name = config["default_wv_cdm"]
f"Place a .{file_ext} file in {cdm_dir_path} and specify the name in {CONFIG_PATH}" if not base_name.endswith(".wvd"):
) base_name += ".wvd"
else: if os.path.exists(f"{os.getcwd()}/configs/CDMs/WV/{base_name}"):
base_name = (
cdm_value
if cdm_value.endswith(f".{file_ext}")
else f"{cdm_value}.{file_ext}"
)
file_path = os.path.join(cdm_dir_path, base_name)
if os.path.exists(file_path):
return return
# Prompt to download if file is missing, even if config has a value
if prompt_yes_no(
f"{cdm_name} CDM {base_name} does not exist in {cdm_dir_path}. Would you like to download it from The CDM Project? (Y)es/(N)o: "
):
response = requests.get(download_url, timeout=10)
if response.status_code == 200:
with open(file_path, "wb") as file:
file.write(response.content)
config[config_key] = base_name.replace(f".{file_ext}", "")
save_config(config)
print(f"Successfully downloaded {cdm_name} CDM")
else: else:
sys.exit( exit(
f"Download failed, please try again, or place a .{file_ext} file " f"Widevine CDM {base_name} does not exist in {os.getcwd()}/configs/CDMs/WV"
f"in {cdm_dir_path} and specify the name in {CONFIG_PATH}" )
def check_for_prd_cdm():
with open(f"{os.getcwd()}/configs/config.yaml", "r") as file:
config = yaml.safe_load(file)
if config["default_pr_cdm"] == "":
answer = " "
while answer[0].upper() != "Y" and answer[0].upper() != "N":
answer = input(
"No default PlayReady CDM specified, would you like to download one from The CDM Project? (Y)es/(N)o: "
)
if answer[0].upper() == "Y":
response = requests.get(
url="https://cdm-project.com/CDRM-Team/CDMs/raw/branch/main/Playready/SL2000/public.prd"
)
if response.status_code == 200:
with open(f"{os.getcwd()}/configs/CDMs/PR/public.prd", "wb") as file:
file.write(response.content)
config["default_pr_cdm"] = "public"
with open(f"{os.getcwd()}/configs/config.yaml", "w") as file:
yaml.dump(config, file)
print("Successfully downloaded PlayReady CDM")
else:
exit(
f"Download failed, please try again or place a .prd file in {os.getcwd()}/configs/CDMs/PR and specify the name in {os.getcwd()}/configs/config.yaml"
)
if answer[0].upper() == "N":
exit(
f"Place a .prd file in {os.getcwd()}/configs/CDMs/PR and specify the name in {os.getcwd()}/configs/config.yaml"
) )
else: else:
sys.exit( base_name = config["default_pr_cdm"]
f"Place a .{file_ext} file in {cdm_dir_path} and specify the name in {CONFIG_PATH}" if not base_name.endswith(".prd"):
base_name += ".prd"
if os.path.exists(f"{os.getcwd()}/configs/CDMs/PR/{base_name}"):
return
else:
exit(
f"PlayReady CDM {base_name} does not exist in {os.getcwd()}/configs/CDMs/WV"
) )
def check_for_cdms(): def check_for_cdms():
"""Check for CDM files.""" check_for_wvd_cdm()
check_for_cdm( check_for_prd_cdm()
config_key="default_wv_cdm",
file_ext="wvd",
download_url="https://cdm-project.com/CDRM-Team/CDMs/raw/branch/main/Widevine/L3/public.wvd",
cdm_dir="WV",
cdm_name="Widevine",
)
check_for_cdm(
config_key="default_pr_cdm",
file_ext="prd",
download_url="https://cdm-project.com/CDRM-Team/CDMs/raw/branch/main/Playready/SL2000/public.prd",
cdm_dir="PR",
cdm_name="PlayReady",
)

View File

@ -1,26 +1,33 @@
"""Module to check for the Python version and environment."""
import sys import sys
import os import os
import subprocess import subprocess
import venv import venv
import importlib.util
def version_check(): def version_check():
"""Check for the Python version.""" major_version = sys.version_info.major
if sys.version_info < (3, 12): minor_version = sys.version_info.minor
sys.exit("Python version 3.12 or higher is required")
if major_version >= 3:
if minor_version >= 12:
return
else:
exit("Python version 3.12 or higher is required")
else:
exit("Python 2 detected, Python version 3.12 or higher is required")
def pip_check(): def pip_check():
"""Check for the pip installation.""" try:
if importlib.util.find_spec("pip") is None: import pip
sys.exit("Pip is not installed")
return
except ImportError:
exit("Pip is not installed")
def venv_check(): def venv_check():
"""Check for the virtual environment.""" # Check if we're already inside a virtual environment
if hasattr(sys, "real_prefix") or ( if hasattr(sys, "real_prefix") or (
hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix
): ):
@ -33,20 +40,20 @@ def venv_check():
else os.path.join(venv_path, "Scripts", "python.exe") else os.path.join(venv_path, "Scripts", "python.exe")
) )
# If venv already exists, restart script using its Python
if os.path.exists(venv_path): if os.path.exists(venv_path):
subprocess.call([venv_python] + sys.argv) subprocess.call([venv_python] + sys.argv)
sys.exit() sys.exit()
answer = ( # Ask user for permission to create a virtual environment
input( answer = ""
"Program is not running from a virtual environment. To maintain " while not answer or answer[0].upper() not in {"Y", "N"}:
"compatibility, this program must be run from one.\n" answer = input(
"Would you like to create one? (Y/N): " "Program is not running from a venv. To maintain compatibility and dependencies, this program must be run from one.\n"
"Would you like me to create one for you? (Y/N): "
) )
.strip()
.upper() if answer[0].upper() == "Y":
)
if answer.startswith("Y"):
print("Creating virtual environment...") print("Creating virtual environment...")
venv.create(venv_path, with_pip=True) venv.create(venv_path, with_pip=True)
subprocess.call([venv_python] + sys.argv) subprocess.call([venv_python] + sys.argv)
@ -57,35 +64,19 @@ def venv_check():
def requirements_check(): def requirements_check():
"""Check for the requirements.""" try:
required_packages = [ import pywidevine
"pywidevine", import pyplayready
"pyplayready", import flask
"flask", import flask_cors
"flask_cors", import yaml
"yaml", import mysql.connector
"mysql.connector",
]
missing = []
for pkg in required_packages:
if "." in pkg:
parent, _ = pkg.split(".", 1)
if (
importlib.util.find_spec(parent) is None
or importlib.util.find_spec(pkg) is None
):
missing.append(pkg)
else:
if importlib.util.find_spec(pkg) is None:
missing.append(pkg)
if not missing:
return
return
except ImportError:
while True: while True:
user_input = ( user_input = (
input( input("Missing packages. Do you want to install them? (Y/N): ")
f"Missing packages: {', '.join(missing)}. Do you want to install them? (Y/N): "
)
.strip() .strip()
.upper() .upper()
) )
@ -96,7 +87,7 @@ def requirements_check():
) )
print("Installation complete.") print("Installation complete.")
break break
if user_input == "N": elif user_input == "N":
print("Dependencies required, please install them and run again.") print("Dependencies required, please install them and run again.")
sys.exit() sys.exit()
else: else:
@ -104,7 +95,6 @@ def requirements_check():
def run_python_checks(): def run_python_checks():
"""Run the Python checks."""
if getattr(sys, "frozen", False): # Check if running from PyInstaller if getattr(sys, "frozen", False): # Check if running from PyInstaller
return return
version_check() version_check()