# -*- coding: utf-8 -*- """ Author: Hmily GitHub: https://github.com/ihmily Copyright (c) 2024 by Hmily, All Rights Reserved. """ from __future__ import annotations import os import subprocess import sys import platform from src.logger import logger current_platform = platform.system() execute_dir = os.path.split(os.path.realpath(sys.argv[0]))[0] current_env_path = os.environ.get("PATH") or "" ffmpeg_path = os.path.join(execute_dir, "ffmpeg") def install_ffmpeg_linux(): is_RHS = True try: logger.warning("ffmpeg is not installed.") logger.debug("Trying to install the stable version of ffmpeg") result = subprocess.run(['yum', '-y', 'update'], capture_output=True) if result.returncode != 0: logger.error("Failed to update package lists using yum.") return False result = subprocess.run(['yum', 'install', '-y', 'ffmpeg'], capture_output=True) if result.returncode == 0: logger.debug("ffmpeg installation was successful using yum. Restart for changes to take effect.") return True logger.error(result.stderr.decode('utf-8').strip()) except FileNotFoundError: logger.debug("yum command not found, trying to install using apt...") is_RHS = False except Exception as e: logger.error(f"An error occurred while trying to install ffmpeg using yum: {e}") if not is_RHS: try: logger.debug("Trying to install the stable version of ffmpeg for Linux using apt...") result = subprocess.run(['apt', 'update'], capture_output=True) if result.returncode != 0: logger.error("Failed to update package lists using apt") return False result = subprocess.run(['apt', 'install', '-y', 'ffmpeg'], capture_output=True) if result.returncode == 0: logger.debug("ffmpeg installation was successful using apt. Restart for changes to take effect.") return True else: logger.error(result.stderr.decode('utf-8').strip()) except FileNotFoundError: logger.error("apt command not found, unable to install ffmpeg. Please manually install ffmpeg by yourself") except Exception as e: logger.error(f"An error occurred while trying to install ffmpeg using apt: {e}") logger.error("Manual installation of ffmpeg is required. Please manually install ffmpeg by yourself.") return False def install_ffmpeg() -> bool: if current_platform == "Linux": return install_ffmpeg_linux() logger.debug("ffmpeg 自动安装仅支持 Linux,请使用系统包管理器安装 ffmpeg。") return False def ensure_ffmpeg_installed(func): def wrapper(*args, **kwargs): try: result = subprocess.run(['ffmpeg', '-version'], capture_output=True) version = result.stdout.strip() if result.returncode == 0 and version: return func(*args, **kwargs) except FileNotFoundError: pass return False def wrapped_func(*args, **kwargs): if sys.version_info >= (3, 7): res = wrapper(*args, **kwargs) else: res = wrapper(*args, **kwargs) if not res: install_ffmpeg() res = wrapper(*args, **kwargs) if not res: raise RuntimeError("ffmpeg is not installed.") return func(*args, **kwargs) return wrapped_func def check_ffmpeg_installed() -> bool: try: result = subprocess.run(['ffmpeg', '-version'], capture_output=True) version = result.stdout.strip() if result.returncode == 0 and version: return True except FileNotFoundError: pass except OSError as e: print(f"OSError occurred: {e}. ffmpeg may not be installed correctly or is not available in the system PATH.") print("Please delete the ffmpeg and try to download and install again.") except Exception as e: print(f"An unexpected error occurred: {e}") return False def check_ffmpeg() -> bool: if not check_ffmpeg_installed(): return install_ffmpeg() return True