Skip to content
Snippets Groups Projects
Commit f9ccc242 authored by Sybren A. Stüvel's avatar Sybren A. Stüvel
Browse files

Worker: started working on EXR merging command via Blender

parent 9be0800c
Branches
Tags
No related merge requests found
File added
...@@ -201,6 +201,25 @@ class AbstractCommand(metaclass=abc.ABCMeta): ...@@ -201,6 +201,25 @@ class AbstractCommand(metaclass=abc.ABCMeta):
return None return None
def _setting(self, settings: dict, key: str, is_required: bool, valtype=str) -> (
typing.Any, typing.Optional[str]):
"""Parses a setting, returns either (value, None) or (None, errormsg)"""
try:
value = settings[key]
except KeyError:
if is_required:
return None, 'Missing "%s"' % key
return None, None
if value is None and not is_required:
return None, None
if not isinstance(value, valtype):
return None, '"%s" must be a %s, not a %s' % (key, valtype, type(value))
return value, None
def command_executor(cmdname): def command_executor(cmdname):
"""Class decorator, registers a command executor.""" """Class decorator, registers a command executor."""
...@@ -414,25 +433,6 @@ class BlenderRenderCommand(AbstractSubprocessCommand): ...@@ -414,25 +433,6 @@ class BlenderRenderCommand(AbstractSubprocessCommand):
self.re_status = re.compile(r'\| (?P<status>[^\|]+)\s*$') self.re_status = re.compile(r'\| (?P<status>[^\|]+)\s*$')
self.re_path_not_found = re.compile(r"Warning: Path '.*' not found") self.re_path_not_found = re.compile(r"Warning: Path '.*' not found")
def _setting(self, settings: dict, key: str, is_required: bool) -> (
typing.Any, typing.Optional[str]):
"""Parses a setting, returns either (value, None) or (None, errormsg)"""
try:
value = settings[key]
except KeyError:
if is_required:
return None, 'Missing "%s"' % key
return None, None
if value is None and not is_required:
return None, None
if not isinstance(value, str):
return None, '"%s" must be a string, not a %s' % (key, type(value))
return value, None
def validate(self, settings: dict): def validate(self, settings: dict):
from pathlib import Path from pathlib import Path
import shlex import shlex
...@@ -545,3 +545,46 @@ class BlenderRenderCommand(AbstractSubprocessCommand): ...@@ -545,3 +545,46 @@ class BlenderRenderCommand(AbstractSubprocessCommand):
# Not a render progress line; just log it for now. # Not a render progress line; just log it for now.
return '> %s' % line return '> %s' % line
@command_executor('merge-exr')
class MergeExrCommand(AbstractSubprocessCommand):
def validate(self, settings: dict):
from pathlib import Path
import shlex
blender_cmd, err = self._setting(settings, 'blender_cmd', True)
if err:
return err
cmd = shlex.split(blender_cmd)
if not Path(cmd[0]).exists():
return 'blender_cmd %r does not exist' % cmd[0]
settings['blender_cmd'] = cmd
_, err = self._setting(settings, 'input1', True, str)
if err: return err
_, err = self._setting(settings, 'input2', True, str)
if err: return err
_, err = self._setting(settings, 'weight1', True, int)
if err: return err
_, err = self._setting(settings, 'weight2', True, int)
if err: return err
async def execute(self, settings: dict):
import shlex
await self.subprocess(shlex.split(settings['cmd']))
cmd = settings['blender_cmd'][:]
cmd += [
'--factory-startup',
'--enable-autoexec',
'-noaudio',
'--background',
]
# TODO: set up node properties and render settings.
await self.worker.register_task_update(activity='Starting Blender')
await self.subprocess(cmd)
# TODO: move output files into the correct spot.
...@@ -16,6 +16,7 @@ if __name__ == '__main__': ...@@ -16,6 +16,7 @@ if __name__ == '__main__':
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
], ],
package_data={'flamenco_worker': ['merge-exr.blend']},
install_requires=[ install_requires=[
'attrs >=16.3.0', 'attrs >=16.3.0',
'requests>=2.12.4', 'requests>=2.12.4',
...@@ -23,4 +24,5 @@ if __name__ == '__main__': ...@@ -23,4 +24,5 @@ if __name__ == '__main__':
entry_points={'console_scripts': [ entry_points={'console_scripts': [
'flamenco-worker = flamenco_worker.cli:main', 'flamenco-worker = flamenco_worker.cli:main',
]}, ]},
zip_safe=False, # due to the bundled merge-exr.blend file.
) )
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment