From e24b142962b90d25f1bf371292c2966cdf953f36 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Sep 2021 12:53:23 +0200 Subject: [PATCH 1/5] added startup validations of ffmpeg and oiio tool --- start.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/start.py b/start.py index 00f9a50cbb..a02c06661f 100644 --- a/start.py +++ b/start.py @@ -96,6 +96,7 @@ Attributes: import os import re import sys +import platform import traceback import subprocess import site @@ -339,6 +340,60 @@ def set_modules_environments(): os.environ.update(env) +def is_tool(name): + try: + import os.errno as errno + except ImportError: + import errno + + try: + devnull = open(os.devnull, "w") + subprocess.Popen( + [name], stdout=devnull, stderr=devnull + ).communicate() + except OSError as exc: + if exc.errno == errno.ENOENT: + return False + return True + + +def _startup_validations(): + """Validations before OpenPype starts.""" + _validate_thirdparty_binaries() + + +def _validate_thirdparty_binaries(): + """Check existence of thirdpart executables.""" + low_platform = platform.system().lower() + binary_vendors_dir = os.path.join( + os.environ["OPENPYPE_ROOT"], + "vendor", + "bin" + ) + + error_msg = ( + "Missing binary dependency {}. Please fetch thirdparty dependencies." + ) + # Validate existence of FFmpeg + ffmpeg_dir = os.path.join(binary_vendors_dir, "ffmpeg", low_platform) + if low_platform == "windows": + ffmpeg_dir = os.path.join(ffmpeg_dir, "bin") + ffmpeg_executable = os.path.join(ffmpeg_dir, "ffmpeg") + if not is_tool(ffmpeg_executable): + raise RuntimeError(error_msg.format("FFmpeg")) + + # Validate existence of OpenImageIO (not on MacOs) + if low_platform != "darwin": + oiio_tool_path = os.path.join( + binary_vendors_dir, + "oiio", + low_platform, + "oiio_tool" + ) + if not is_tool(oiio_tool_path): + raise RuntimeError(error_msg.format("OpenImageIO")) + + def _process_arguments() -> tuple: """Process command line arguments. @@ -767,6 +822,11 @@ def boot(): # ------------------------------------------------------------------------ os.environ["OPENPYPE_ROOT"] = OPENPYPE_ROOT + # ------------------------------------------------------------------------ + # Do necessary startup validations + # ------------------------------------------------------------------------ + _startup_validations() + # ------------------------------------------------------------------------ # Play animation # ------------------------------------------------------------------------ From cda626d76fce511be8524b5358db6b37a977684f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Sep 2021 12:55:01 +0200 Subject: [PATCH 2/5] removed validator of ffmpeg --- .../publish/validate_ffmpeg_installed.py | 34 ------------------- 1 file changed, 34 deletions(-) delete mode 100644 openpype/plugins/publish/validate_ffmpeg_installed.py diff --git a/openpype/plugins/publish/validate_ffmpeg_installed.py b/openpype/plugins/publish/validate_ffmpeg_installed.py deleted file mode 100644 index a5390a07b2..0000000000 --- a/openpype/plugins/publish/validate_ffmpeg_installed.py +++ /dev/null @@ -1,34 +0,0 @@ -import pyblish.api -import os -import subprocess -import openpype.lib -try: - import os.errno as errno -except ImportError: - import errno - - -class ValidateFFmpegInstalled(pyblish.api.ContextPlugin): - """Validate availability of ffmpeg tool in PATH""" - - order = pyblish.api.ValidatorOrder - label = 'Validate ffmpeg installation' - optional = True - - def is_tool(self, name): - try: - devnull = open(os.devnull, "w") - subprocess.Popen( - [name], stdout=devnull, stderr=devnull - ).communicate() - except OSError as e: - if e.errno == errno.ENOENT: - return False - return True - - def process(self, context): - ffmpeg_path = openpype.lib.get_ffmpeg_tool_path("ffmpeg") - self.log.info("ffmpeg path: `{}`".format(ffmpeg_path)) - if self.is_tool("{}".format(ffmpeg_path)) is False: - self.log.error("ffmpeg not found in PATH") - raise RuntimeError('ffmpeg not installed.') From 7fe3fd1d11a66de9dbfbc479bd91cd0cb7d35013 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 21 Sep 2021 14:06:25 +0200 Subject: [PATCH 3/5] show tkinter message box if validation crashes --- start.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/start.py b/start.py index a02c06661f..8b4ee97b09 100644 --- a/start.py +++ b/start.py @@ -359,7 +359,23 @@ def is_tool(name): def _startup_validations(): """Validations before OpenPype starts.""" - _validate_thirdparty_binaries() + try: + _validate_thirdparty_binaries() + except Exception as exc: + if os.environ.get("OPENPYPE_HEADLESS_MODE"): + raise + + from tkinter import Tk + from tkinter.messagebox import showerror + + root = Tk() + root.withdraw() + showerror( + "Startup validations didn't pass", + str(exc) + ) + root.destroy() + sys.exit(1) def _validate_thirdparty_binaries(): From 0b4cd5885801487f92f622335f4c774738bcc8f7 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 22 Sep 2021 10:48:48 +0200 Subject: [PATCH 4/5] fix oiio executable name --- start.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start.py b/start.py index 8b4ee97b09..451db03a54 100644 --- a/start.py +++ b/start.py @@ -404,7 +404,7 @@ def _validate_thirdparty_binaries(): binary_vendors_dir, "oiio", low_platform, - "oiio_tool" + "oiiotool" ) if not is_tool(oiio_tool_path): raise RuntimeError(error_msg.format("OpenImageIO")) From 81f743bd21fcb16254c08f759fac209b5a3b8931 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 22 Sep 2021 11:28:32 +0200 Subject: [PATCH 5/5] tkinter message is visible in taskbar --- start.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/start.py b/start.py index 451db03a54..f3adabd942 100644 --- a/start.py +++ b/start.py @@ -365,16 +365,20 @@ def _startup_validations(): if os.environ.get("OPENPYPE_HEADLESS_MODE"): raise - from tkinter import Tk + import tkinter from tkinter.messagebox import showerror - root = Tk() - root.withdraw() + root = tkinter.Tk() + root.attributes("-alpha", 0.0) + root.wm_state("iconic") + if platform.system().lower() != "windows": + root.withdraw() + showerror( "Startup validations didn't pass", str(exc) ) - root.destroy() + root.withdraw() sys.exit(1)