122 lines
4.1 KiB
Python
122 lines
4.1 KiB
Python
# -*- 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
|