diff --git a/lib/render_job.py b/lib/render_job.py index 4ba22eb..3da21de 100644 --- a/lib/render_job.py +++ b/lib/render_job.py @@ -33,6 +33,7 @@ class RenderJob: self.worker = RenderWorkerFactory.create_worker(renderer, input_path, output_path, args) self.worker.log_path = os.path.join(os.path.dirname(input_path), self.name + '.log') + self.worker.validate() self.file_hash = None threading.Thread(target=self.__get_file_hash).start() # get file hash on bg thread diff --git a/lib/render_workers/aerender_worker.py b/lib/render_workers/aerender_worker.py index 79ae63a..57f446c 100644 --- a/lib/render_workers/aerender_worker.py +++ b/lib/render_workers/aerender_worker.py @@ -47,7 +47,7 @@ class AERenderWorker(BaseRenderWorker): logging.error(f'Failed to get {cls.renderer} version: {e}') return version - def _generate_subprocess(self): + def generate_worker_subprocess(self): if os.path.exists('nexrender-cli-macos'): logging.info('nexrender found') diff --git a/lib/render_workers/blender_worker.py b/lib/render_workers/blender_worker.py index 101349f..e78b8b1 100644 --- a/lib/render_workers/blender_worker.py +++ b/lib/render_workers/blender_worker.py @@ -21,7 +21,8 @@ class BlenderRenderWorker(BaseRenderWorker): self.engine = self.args.get('engine', 'BLENDER_EEVEE').upper() self.export_format = self.args.get('export_format', None) or 'JPEG' self.camera = self.args.get('camera', None) - self.render_all_frames = self.args.get('render_all_frames', False) + self.render_all_frames = self.args.get('render_all_frames', False) or \ + '-a' in (self.args.get('raw', None) or "").split(' ') self.frame_to_render = 0 # Stats @@ -45,7 +46,7 @@ class BlenderRenderWorker(BaseRenderWorker): logging.error(f'Failed to get {cls.renderer} version: {e}') return version - def _generate_subprocess(self): + def generate_worker_subprocess(self): cmd = [self.renderer_path()] if self.args.get('background', True): # optionally run render not in background diff --git a/lib/render_workers/ffmpeg_worker.py b/lib/render_workers/ffmpeg_worker.py index a3448d9..36aa102 100644 --- a/lib/render_workers/ffmpeg_worker.py +++ b/lib/render_workers/ffmpeg_worker.py @@ -35,7 +35,7 @@ class FFMPEGRenderWorker(BaseRenderWorker): logger.error("Failed to get FFMPEG version: {}".format(e)) return version - def _generate_subprocess(self): + def generate_worker_subprocess(self): cmd = [self.renderer_path(), '-y', '-stats', '-i', self.input_path] diff --git a/lib/render_workers/render_worker.py b/lib/render_workers/render_worker.py index 8ab8ccf..6c68ec7 100644 --- a/lib/render_workers/render_worker.py +++ b/lib/render_workers/render_worker.py @@ -92,8 +92,28 @@ class BaseRenderWorker(object): logging.exception(e) return path - def _generate_subprocess(self): - raise NotImplementedError("_generate_subprocess not implemented") + def validate(self): + if not os.path.exists(self.input_path): + raise FileNotFoundError(f"Cannot find input path: {self.input_path}") + self.generate_subprocess() + + def generate_subprocess(self): + # Convert raw args from string if available and catch conflicts + cmd = self.generate_worker_subprocess() + raw_args = self.args.get('raw', None) + if raw_args: + import shlex + args_split = shlex.split(raw_args) + flags = [x for x in args_split if x.startswith('-')] + conflict = any(element in flags for element in args_split) + if conflict: + raise ValueError("Custom args conflicts set parameters") + else: + cmd.extend(args_split) + return cmd + + def generate_worker_subprocess(self): + raise NotImplementedError("generate_worker_subprocess not implemented") def start(self): diff --git a/scheduler_gui.py b/scheduler_gui.py index d5f452f..87c585b 100755 --- a/scheduler_gui.py +++ b/scheduler_gui.py @@ -16,7 +16,7 @@ from lib.utilities.server_helper import post_job_to_server logger = logging.getLogger() prefs_name = 'config/.scheduler_prefs' -label_width = 7 +label_width = 9 header_padding = 6 server_setup_timeout = 5 @@ -137,6 +137,13 @@ class ScheduleJob(Frame): self.blender_multiple_cameras = BooleanVar(value=False) self.blender_cameras_list = None + # custom args frame + custom_args_frame = Frame(self) + custom_args_frame.pack(fill=X) + Label(custom_args_frame, text="Custom Args", width=label_width).pack(side=LEFT, padx=5, pady=5) + self.custom_args_entry = Entry(custom_args_frame) + self.custom_args_entry.pack(side=LEFT, padx=5, expand=True, fill=X) + # Submit Button self.submit_frame = None @@ -311,7 +318,7 @@ class ScheduleJob(Frame): 'renderer': renderer, 'client': client, 'output_path': os.path.join(os.path.dirname(self.chosen_file), self.output_entry.get()), - 'args': {}, + 'args': {'raw': self.custom_args_entry.get()}, 'name': None} job_list = []