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