import os import sys import json import random import logging import zipfile import requests from termcolor import colored # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def clean_dir(path: str) -> None: """ Removes every file in a directory. Args: path (str): Path to directory. Returns: None """ try: if not os.path.exists(path): os.mkdir(path) logger.info(f"Created directory: {path}") for file in os.listdir(path): file_path = os.path.join(path, file) os.remove(file_path) logger.info(f"Removed file: {file_path}") logger.info(colored(f"Cleaned {path} directory", "green")) except Exception as e: logger.error(f"Error occurred while cleaning directory {path}: {str(e)}") def fetch_songs(zip_url: str) -> None: """ Downloads songs into songs/ directory to use with geneated videos. Args: zip_url (str): The URL to the zip file containing the songs. Returns: None """ try: logger.info(colored(f" => Fetching songs...", "magenta")) files_dir = "../Songs" if not os.path.exists(files_dir): os.mkdir(files_dir) logger.info(colored(f"Created directory: {files_dir}", "green")) else: # Skip if songs are already downloaded return # Download songs response = requests.get(zip_url) # Save the zip file with open("../Songs/songs.zip", "wb") as file: file.write(response.content) # Unzip the file with zipfile.ZipFile("../Songs/songs.zip", "r") as file: file.extractall("../Songs") # Remove the zip file os.remove("../Songs/songs.zip") logger.info(colored(" => Downloaded Songs to ../Songs.", "green")) except Exception as e: logger.error(colored(f"Error occurred while fetching songs: {str(e)}", "red")) def choose_random_song() -> str: """ Chooses a random song from the songs/ directory. Returns: str: The path to the chosen song. """ try: songs = os.listdir("../Songs") song = random.choice(songs) logger.info(colored(f"Chose song: {song}", "green")) return f"../Songs/{song}" except Exception as e: logger.error(colored(f"Error occurred while choosing random song: {str(e)}", "red")) def check_env_vars() -> None: """ Checks if the necessary environment variables are set. Returns: None Raises: SystemExit: If any required environment variables are missing. """ try: required_vars = ["PEXELS_API_KEY", "TIKTOK_SESSION_ID", "IMAGEMAGICK_BINARY"] missing_vars = [var + os.getenv(var) for var in required_vars if os.getenv(var) is None or (len(os.getenv(var)) == 0)] if missing_vars: missing_vars_str = ", ".join(missing_vars) logger.error(colored(f"The following environment variables are missing: {missing_vars_str}", "red")) logger.error(colored("Please consult 'EnvironmentVariables.md' for instructions on how to set them.", "yellow")) sys.exit(1) # Aborts the program except Exception as e: logger.error(f"Error occurred while checking environment variables: {str(e)}") sys.exit(1) # Aborts the program if an unexpected error occurs