generated from thinkode/modelRepository
92 lines
2.6 KiB
Python
92 lines
2.6 KiB
Python
|
|
"""Third party programs configuration for MoviePy."""
|
||
|
|
|
||
|
|
import os
|
||
|
|
import subprocess as sp
|
||
|
|
from pathlib import Path
|
||
|
|
from log import log_step
|
||
|
|
|
||
|
|
from moviepy.tools import cross_platform_popen_params
|
||
|
|
|
||
|
|
|
||
|
|
try:
|
||
|
|
from dotenv import find_dotenv, load_dotenv
|
||
|
|
|
||
|
|
DOTENV = find_dotenv()
|
||
|
|
load_dotenv(DOTENV)
|
||
|
|
except ImportError:
|
||
|
|
DOTENV = None
|
||
|
|
|
||
|
|
FFMPEG_BINARY = os.getenv("FFMPEG_BINARY", "ffmpeg-imageio")
|
||
|
|
FFPLAY_BINARY = os.getenv("FFPLAY_BINARY", "auto-detect")
|
||
|
|
|
||
|
|
IS_POSIX_OS = os.name == "posix"
|
||
|
|
|
||
|
|
|
||
|
|
def try_cmd(cmd):
|
||
|
|
"""Verify if the OS support command invocation as expected by moviepy"""
|
||
|
|
try:
|
||
|
|
popen_params = cross_platform_popen_params(
|
||
|
|
{"stdout": sp.PIPE, "stderr": sp.PIPE, "stdin": sp.DEVNULL}
|
||
|
|
)
|
||
|
|
proc = sp.Popen(cmd, **popen_params)
|
||
|
|
proc.communicate()
|
||
|
|
except Exception as err:
|
||
|
|
return False, err
|
||
|
|
else:
|
||
|
|
return True, None
|
||
|
|
|
||
|
|
|
||
|
|
if FFMPEG_BINARY == "ffmpeg-imageio":
|
||
|
|
from imageio.plugins.ffmpeg import get_exe
|
||
|
|
|
||
|
|
FFMPEG_BINARY = get_exe()
|
||
|
|
|
||
|
|
elif FFMPEG_BINARY == "auto-detect":
|
||
|
|
if try_cmd(["ffmpeg"])[0]:
|
||
|
|
FFMPEG_BINARY = "ffmpeg"
|
||
|
|
elif not IS_POSIX_OS and try_cmd(["ffmpeg.exe"])[0]:
|
||
|
|
FFMPEG_BINARY = "ffmpeg.exe"
|
||
|
|
else: # pragma: no cover
|
||
|
|
FFMPEG_BINARY = "unset"
|
||
|
|
else:
|
||
|
|
success, err = try_cmd([FFMPEG_BINARY])
|
||
|
|
if not success:
|
||
|
|
raise IOError(
|
||
|
|
f"{err} - The path specified for the ffmpeg binary might be wrong"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
if FFPLAY_BINARY == "auto-detect":
|
||
|
|
if try_cmd(["ffplay"])[0]:
|
||
|
|
FFPLAY_BINARY = "ffplay"
|
||
|
|
elif not IS_POSIX_OS and try_cmd(["ffplay.exe"])[0]:
|
||
|
|
FFPLAY_BINARY = "ffplay.exe"
|
||
|
|
else: # pragma: no cover
|
||
|
|
FFPLAY_BINARY = "unset"
|
||
|
|
else:
|
||
|
|
success, err = try_cmd([FFPLAY_BINARY])
|
||
|
|
if not success:
|
||
|
|
raise IOError(
|
||
|
|
f"{err} - The path specified for the ffmpeg binary might be wrong"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def check():
|
||
|
|
"""Check if moviepy has found the binaries for FFmpeg."""
|
||
|
|
if try_cmd([FFMPEG_BINARY])[0]:
|
||
|
|
log_step("info", 100, f"MoviePy: ffmpeg successfully found in '{FFMPEG_BINARY}'.")
|
||
|
|
else: # pragma: no cover
|
||
|
|
raise Exception(f"MoviePy: can't find or access ffmpeg in '{FFMPEG_BINARY}'.")
|
||
|
|
if try_cmd([FFPLAY_BINARY])[0]:
|
||
|
|
log_step("info", 100, f"MoviePy: ffmpeg successfully found in '{FFPLAY_BINARY}'.")
|
||
|
|
else: # pragma: no cover
|
||
|
|
raise Exception(f"MoviePy: can't find or access ffmpeg in '{FFPLAY_BINARY}'.")
|
||
|
|
|
||
|
|
# if DOTENV:
|
||
|
|
# print(f"\n.env file content at {DOTENV}:\n")
|
||
|
|
# print(Path(DOTENV).read_text())
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__": # pragma: no cover
|
||
|
|
check()
|