From c4d000a896273cac369c3a7e8aa2d4dd3dfd7e7c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= <sybren@stuvel.eu>
Date: Thu, 31 Jan 2019 11:33:21 +0100
Subject: [PATCH] Separated BlenderRenderCommand into an abstract superclass

This superclass AbstractBlenderCommand takes less parameters so that it'll
be easier to add Blender commands that don't use certain parameters (such
as frame range, render format, etc.)
---
 flamenco_worker/commands.py | 66 ++++++++++++++++++++++---------------
 1 file changed, 39 insertions(+), 27 deletions(-)

diff --git a/flamenco_worker/commands.py b/flamenco_worker/commands.py
index 6bf96242..f777ff5e 100644
--- a/flamenco_worker/commands.py
+++ b/flamenco_worker/commands.py
@@ -666,8 +666,7 @@ class ExecCommand(AbstractSubprocessCommand):
         await self.subprocess(shlex.split(settings['cmd']))
 
 
-@command_executor('blender_render')
-class BlenderRenderCommand(AbstractSubprocessCommand):
+class AbstractBlenderCommand(AbstractSubprocessCommand):
     re_global_progress = attr.ib(init=False)
     re_time = attr.ib(init=False)
     re_remaining = attr.ib(init=False)
@@ -709,23 +708,6 @@ class BlenderRenderCommand(AbstractSubprocessCommand):
             return 'blender_cmd %r does not exist' % cmd[0]
         settings['blender_cmd'] = cmd
 
-        render_output, err = self._setting(settings, 'render_output', False)
-        if err:
-            return err
-        if render_output:
-            outpath = Path(render_output).parent
-            try:
-                outpath.mkdir(parents=True, exist_ok=True)
-            except Exception as ex:
-                return '"render_output": dir %s cannot be created: %s' % (outpath, ex)
-
-        _, err = self._setting(settings, 'frames', False)
-        if err:
-            return err
-        _, err = self._setting(settings, 'render_format', False)
-        if err:
-            return err
-
         filepath, err = self._setting(settings, 'filepath', True)
         if err:
             return err
@@ -779,14 +761,6 @@ class BlenderRenderCommand(AbstractSubprocessCommand):
                     '--python', override_filepath.as_posix(),
                 ])
 
-        if settings.get('python_expr'):
-            cmd.extend(['--python-expr', settings['python_expr']])
-        if settings.get('render_output'):
-            cmd.extend(['--render-output', settings['render_output']])
-        if settings.get('format'):
-            cmd.extend(['--render-format', settings['format']])
-        if settings.get('frames'):
-            cmd.extend(['--render-frame', settings['frames']])
         return cmd
 
     def parse_render_line(self, line: str) -> typing.Optional[dict]:
@@ -865,6 +839,43 @@ class BlenderRenderCommand(AbstractSubprocessCommand):
         return 'pid=%d > %s' % (self.proc.pid, line)
 
 
+@command_executor('blender_render')
+class BlenderRenderCommand(AbstractBlenderCommand):
+
+    def validate(self, settings: Settings):
+        render_output, err = self._setting(settings, 'render_output', False)
+        if err:
+            return err
+        if render_output:
+            outpath = Path(render_output).parent
+            try:
+                outpath.mkdir(parents=True, exist_ok=True)
+            except Exception as ex:
+                return '"render_output": dir %s cannot be created: %s' % (outpath, ex)
+
+        _, err = self._setting(settings, 'frames', False)
+        if err:
+            return err
+        _, err = self._setting(settings, 'render_format', False)
+        if err:
+            return err
+
+        return super().validate(settings)
+
+    async def _build_blender_cmd(self, settings) -> typing.List[str]:
+        cmd = await super()._build_blender_cmd(settings)
+
+        if settings.get('python_expr'):
+            cmd.extend(['--python-expr', settings['python_expr']])
+        if settings.get('render_output'):
+            cmd.extend(['--render-output', settings['render_output']])
+        if settings.get('format'):
+            cmd.extend(['--render-format', settings['format']])
+        if settings.get('frames'):
+            cmd.extend(['--render-frame', settings['frames']])
+        return cmd
+
+
 @command_executor('blender_render_progressive')
 class BlenderRenderProgressiveCommand(BlenderRenderCommand):
     def validate(self, settings: Settings):
@@ -995,6 +1006,7 @@ class MergeProgressiveRendersCommand(AbstractSubprocessCommand):
         shutil.move(str(src), str(dst))
 
 
+# TODO(Sybren): maybe subclass AbstractBlenderCommand instead?
 @command_executor('blender_render_audio')
 class BlenderRenderAudioCommand(BlenderRenderCommand):
     def validate(self, settings: Settings):
-- 
GitLab