From 64f39193f58069c6967815400f1c61b445169259 Mon Sep 17 00:00:00 2001 From: antirotor Date: Tue, 5 Feb 2019 17:01:15 +0100 Subject: [PATCH] add ffmpeg validator, error handling --- .../publish/validate_ffmpeg_installed.py | 28 +++++++++++++++++ .../plugins/maya/publish/extract_quicktime.py | 30 ++++++++++--------- 2 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 pype/plugins/global/publish/validate_ffmpeg_installed.py diff --git a/pype/plugins/global/publish/validate_ffmpeg_installed.py b/pype/plugins/global/publish/validate_ffmpeg_installed.py new file mode 100644 index 0000000000..250da0afd9 --- /dev/null +++ b/pype/plugins/global/publish/validate_ffmpeg_installed.py @@ -0,0 +1,28 @@ +import pyblish.api +import os +import subprocess + + +class ValidateFfmpegInstallef(pyblish.api.Validator): + """Validate availability of ffmpeg tool in PATH""" + + order = pyblish.api.ValidatorOrder + label = 'Validate ffmpeg installation' + families = ['review'] + 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 == os.errno.ENOENT: + return False + return True + + def process(self, instance): + if self.is_tool('ffmpeg') is False: + self.log.error("ffmpeg not found in PATH") + raise RuntimeError('ffmpeg not installed.') diff --git a/pype/plugins/maya/publish/extract_quicktime.py b/pype/plugins/maya/publish/extract_quicktime.py index ca0ae30671..91bfc9284b 100644 --- a/pype/plugins/maya/publish/extract_quicktime.py +++ b/pype/plugins/maya/publish/extract_quicktime.py @@ -1,4 +1,5 @@ import os +import subprocess import contextlib import capture_gui @@ -6,6 +7,7 @@ import clique import pype.maya.lib as lib import pype.api +import avalon.maya from maya import cmds, mel import pymel.core as pm @@ -106,20 +108,20 @@ class ExtractQuicktime(pype.api.Extractor): movieFile = filename + ".mov" full_movie_path = os.path.join(stagingdir, movieFile) self.log.info("output {}".format(full_movie_path)) - - try: - ( - ffmpeg - .input(input_path, framerate=fps, start_number=int(start)) - .output(full_movie_path) - .run(overwrite_output=True, - capture_stdout=True, - capture_stderr=True) - ) - except ffmpeg.Error as e: - ffmpeg_error = 'ffmpeg error: {}'.format(e.stderr.decode()) - self.log.error(ffmpeg_error) - raise Exception(ffmpeg_error) + with avalon.maya.suspended_refresh(): + try: + ( + ffmpeg + .input(input_path, framerate=fps, start_number=int(start)) + .output(full_movie_path) + .run(overwrite_output=True, + capture_stdout=True, + capture_stderr=True) + ) + except ffmpeg.Error as e: + ffmpeg_error = 'ffmpeg error: {}'.format(e.stderr) + self.log.error(ffmpeg_error) + raise RuntimeError(ffmpeg_error) if "files" not in instance.data: instance.data["files"] = list()