From 2da06ab16687a93fe2df73372ed17bfa2dc48a3b Mon Sep 17 00:00:00 2001 From: Brett Williams Date: Tue, 25 Oct 2022 15:28:51 -0700 Subject: [PATCH] RenderWorker cleanup and add camera methods to BlenderRenderWorker --- server.py | 3 +- utilities/aerender_worker.py | 26 ++++++------- utilities/blender_worker.py | 72 ++++++++++++++++++++++-------------- utilities/ffmpeg_worker.py | 25 +++++++------ utilities/render_worker.py | 43 +++++++++++---------- 5 files changed, 93 insertions(+), 76 deletions(-) diff --git a/server.py b/server.py index 04855de..2bad2b1 100755 --- a/server.py +++ b/server.py @@ -240,7 +240,8 @@ def renderer_info(): renderer_data = {} for r in RenderWorkerFactory.supported_renderers(): renderer_class = RenderWorkerFactory.class_for_name(r) - renderer_data[r] = {'version': renderer_class.version(), + renderer_data[r] = {'available': renderer_class.renderer_path() is not None, + 'version': renderer_class.version(), 'supported_extensions': renderer_class.supported_extensions, 'supported_export_formats': renderer_class.supported_export_formats} return renderer_data diff --git a/utilities/aerender_worker.py b/utilities/aerender_worker.py index 614c610..50a51ba 100644 --- a/utilities/aerender_worker.py +++ b/utilities/aerender_worker.py @@ -1,4 +1,4 @@ -#! /usr/bin/python +#!/usr/bin/env python3 import glob import json import re @@ -19,18 +19,6 @@ def aerender_path(): class AERenderWorker(BaseRenderWorker): - @classmethod - def version(cls): - version = None - try: - x = subprocess.Popen([aerender_path(), '-version'], stdout=subprocess.PIPE) - x.wait() - ver_out = str(x.stdout.read().strip()) - version = ver_out.split(" ")[-1].strip() - except Exception as e: - logging.error('failed getting version: {}'.format(e)) - return version - renderer = 'After Effects' render_engine = 'aerender' supported_extensions = ['.aep'] @@ -47,6 +35,18 @@ class AERenderWorker(BaseRenderWorker): self.progress_history = [] self.attributes = {} + @classmethod + def version(cls): + version = None + try: + render_path = cls.renderer_path() + if render_path: + ver_out = subprocess.check_output([render_path, '-version']) + version = ver_out.decode('utf-8').split(" ")[-1].strip() + except Exception as e: + logging.error(f'Failed to get {cls.renderer} version: {e}') + return version + def _generate_subprocess(self): if os.path.exists('nexrender-cli-macos'): diff --git a/utilities/blender_worker.py b/utilities/blender_worker.py index 2b4016d..54a8d19 100644 --- a/utilities/blender_worker.py +++ b/utilities/blender_worker.py @@ -1,24 +1,10 @@ -#! /usr/bin/python +#!/usr/bin/env python3 import re -import time - from utilities.render_worker import * -SUPPORTED_FORMATS = ['TGA', 'RAWTGA', 'JPEG', 'IRIS', 'IRIZ', 'AVIRAW', 'AVIJPEG', 'PNG', 'BMP', 'HDR', 'TIFF', - 'OPEN_EXR', 'OPEN_EXR_MULTILAYER', 'MPEG', 'CINEON', 'DPX', 'DDS', 'JP2'] - class BlenderRenderWorker(BaseRenderWorker): - def version(self): - version = None - try: - ver_out = subprocess.check_output([self.renderer_path(), '-v']).decode('utf-8') - version = ver_out.splitlines()[0].replace('Blender', '').strip() - except Exception as e: - logger.error("Failed to get Blender version: {}".format(e)) - return version - renderer = 'Blender' render_engine = 'blender' supported_extensions = ['.blend'] @@ -31,7 +17,8 @@ class BlenderRenderWorker(BaseRenderWorker): ignore_extensions=False, args=args) self.engine = self.args.get('engine', 'BLENDER_EEVEE').upper() - self.export_format = self.args.get('export_format', 'JPEG') + self.export_format = self.args.get('export_format', None) or 'JPEG' + self.camera = self.args.get('camera', None) self.frame = 0 self.render_all_frames = self.args.get('render_all_frames', False) @@ -43,24 +30,34 @@ class BlenderRenderWorker(BaseRenderWorker): self.time_remaining = None self.frame_percent_complete = 0.0 - def generate_preview(self, blend_file): - pass + @classmethod + def version(cls): + version = None + try: + render_path = cls.renderer_path() + if render_path: + ver_out = subprocess.check_output([render_path, '-v']) + version = ver_out.decode('utf-8').splitlines()[0].replace('Blender', '').strip() + except Exception as e: + logging.error(f'Failed to get {cls.renderer} version: {e}') + return version def _generate_subprocess(self): - if self.export_format not in self.supported_export_formats: - raise ValueError("Unsupported format for Blender: {}".format(self.export_format)) + cmd = [self.renderer_path(), '-b', self.input] + + if self.camera: + cmd.extend(['--python-expr', f"import bpy;bpy.context.scene.camera = bpy.data.objects['{self.camera}'];"]) + + cmd.extend(['-E', self.engine, '-o', self.output, '-F', self.export_format]) + + # all frames or single + cmd.extend(['-a'] if self.render_all_frames else ['-f', str(self.frame)]) - if self.render_all_frames: - cmd = [self.renderer_path(), '-b', self.input, '-E', self.engine, '-o', self.output, - '-F', self.export_format, '-a'] - else: - cmd = [self.renderer_path(), '-b', self.input, '-E', self.engine, '-o', self.output, - '-F', self.export_format, '-f', str(self.frame)] return cmd def _parse_stdout(self, line): - import re + pattern = re.compile( r'Fra:(?P\d*).*Mem:(?P\S+).*Time:(?P