#!/usr/bin/env python3 """Check if all scripts and their dependencies are properly configured.""" import os import shutil import subprocess import configparser from pathlib import Path from typing import Dict, List, Tuple # Unicode emoji CHECK = "✅" CROSS = "❌" def check_command(cmd: str) -> Tuple[bool, str]: """Check if a command is available in PATH.""" return (shutil.which(cmd) is not None, f"Command '{cmd}' not found") def check_env_var(var: str) -> Tuple[bool, str]: """Check if an environment variable is set.""" return (var in os.environ, f"Environment variable '{var}' not set") def check_stats_commands() -> List[Tuple[bool, str]]: """Check if all stat commands in config can run.""" results = [] config_home = os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")) config_path = Path(config_home) / "stats/config.ini" if not config_path.exists(): return [(False, f"Stats config not found at {config_path}")] config = configparser.ConfigParser(interpolation=None) config.read(config_path) for section in config.sections(): if section.startswith('stat.'): cmd = config[section]['command'] try: subprocess.run(cmd, shell=True, capture_output=True, check=True) results.append((True, f"Command '{cmd}' runs successfully")) except subprocess.CalledProcessError: results.append((False, f"Command '{cmd}' failed to run")) return results def check_stats_collector_config() -> List[Tuple[bool, str]]: """Check if stats collector config exists.""" results = [] config_home = os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")) config_path = Path(config_home) / "stats-collector/config.ini" if config_path.exists(): results.append((True, "Stats collector config found")) else: results.append((False, f"Stats collector config not found at {config_path}")) return results def check_scripts() -> Dict[str, List[Tuple[bool, str]]]: """Run all checks for each script.""" checks = { "av1": [ check_command("ffmpeg"), ], "e-ink": [ check_command("python3"), ], "indeel": [ check_command("file"), check_command("magick"), check_command("dctfilename"), check_command("webpmux"), check_command("gifski"), ], "mover": [], # No specific dependencies "pushover": [ check_env_var("PUSHOVER_APP_TOKEN"), check_env_var("PUSHOVER_USER_TOKEN"), check_command("curl"), ], "stats": [ *check_stats_commands(), ], "stats-collector": [ check_command("python3"), *check_stats_collector_config(), ], "syncwall": [ check_command("wget"), check_command("wal"), ], "vc": [ check_command("ffmpeg"), check_command("yt-dlp"), ], "vcmp": [ check_command("ffmpeg"), check_command("ffprobe"), ], } return checks def main(): results = check_scripts() print("Script Status Check") print("==================") for script, checks in results.items(): all_passed = all(result[0] for result in checks) if checks else True status = CHECK if all_passed else CROSS print(f"\n{status} {script}") if not checks: print(" No specific requirements") else: for passed, message in checks: status = CHECK if passed else CROSS if not passed: print(f" {status} {message}") if __name__ == "__main__": main()