Source code for moviepy.config

"""Third party programs configuration for MoviePy."""

import os
import subprocess as sp
from pathlib import Path

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"


[docs] 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" )
[docs] def check(): """Check if moviepy has found the binaries for FFmpeg.""" if try_cmd([FFMPEG_BINARY])[0]: print(f"MoviePy: ffmpeg successfully found in '{FFMPEG_BINARY}'.") else: # pragma: no cover print(f"MoviePy: can't find or access ffmpeg in '{FFMPEG_BINARY}'.") if try_cmd([FFPLAY_BINARY])[0]: print(f"MoviePy: ffmpeg successfully found in '{FFPLAY_BINARY}'.") else: # pragma: no cover print(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()