diff --git a/pype/plugins/harmony/publish/extract_render.py b/pype/plugins/harmony/publish/extract_render.py index de6e8b9008..f02ed66e5f 100644 --- a/pype/plugins/harmony/publish/extract_render.py +++ b/pype/plugins/harmony/publish/extract_render.py @@ -1,9 +1,9 @@ import os import tempfile +import subprocess import pyblish.api from avalon import harmony -import pype.lib import clique @@ -37,7 +37,6 @@ class ExtractRender(pyblish.api.InstancePlugin): {"function": func, "args": [instance[0]]} )["result"] application_path = result[0] - project_path = result[1] scene_path = os.path.join(result[1], result[2] + ".xstage") frame_rate = result[3] frame_start = result[4] @@ -59,9 +58,16 @@ class ExtractRender(pyblish.api.InstancePlugin): ) harmony.save_scene() - # Execute rendering. - output = pype.lib._subprocess([application_path, "-batch", scene_path]) - self.log.info(output) + # Execute rendering. Ignoring error cause Harmony returns error code + # always. + proc = subprocess.Popen( + [application_path, "-batch", scene_path], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE + ) + output, error = proc.communicate() + self.log.info(output.decode("utf-8")) # Collect rendered files. files = os.listdir(path) @@ -77,6 +83,30 @@ class ExtractRender(pyblish.api.InstancePlugin): ) ) + # Generate thumbnail. + thumbnail_path = os.path.join(path, "thumbnail.png") + args = [ + "ffmpeg", "-y", + "-i", os.path.join(path, list(collections[0])[0]), + "-vf", "scale=300:-1", + "-vframes", "1", + thumbnail_path + ] + process = subprocess.Popen( + args, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE + ) + + output = process.communicate()[0] + + if process.returncode != 0: + raise ValueError(output.decode("utf-8")) + + self.log.debug(output.decode("utf-8")) + + # Generate representations. extension = os.path.splitext(list(collections[0])[0])[-1][1:] representation = { "name": extension, @@ -89,12 +119,18 @@ class ExtractRender(pyblish.api.InstancePlugin): "preview": True, "tags": ["review"] } - instance.data["representations"] = [representation] - self.log.info(frame_rate) + thumbnail = { + "name": "thumbnail", + "ext": "png", + "files": os.path.basename(thumbnail_path), + "stagingDir": path, + "tags": ["thumbnail"] + } + instance.data["representations"] = [representation, thumbnail] # Required for extract_review plugin (L222 onwards). instance.data["frameStart"] = frame_start instance.data["frameEnd"] = frame_end instance.data["fps"] = frame_rate - self.log.info("Extracted {instance} to {path}".format(**locals())) + self.log.info(f"Extracted {instance} to {path}")