diff --git a/src/engines/core/base_worker.py b/src/engines/core/base_worker.py index 0f16530..ab60001 100644 --- a/src/engines/core/base_worker.py +++ b/src/engines/core/base_worker.py @@ -238,8 +238,13 @@ class BaseRenderWorker(Base): DistributedJobManager.wait_for_subjobs(parent_job=self) @staticmethod - def log_and_print(message, log_file): - logger.info(message) + def log_and_print(message, log_file, level='info'): + if level == 'debug': + logger.debug(message) + elif level == 'error': + logger.error(message) + else: + logger.info(message) log_file.write(f"{message}\n") def __run(self): @@ -259,26 +264,35 @@ class BaseRenderWorker(Base): else: self.__run__wait_for_subjobs(log_file) + # Validate Output - End if missing frames + if self.status == RenderStatus.RUNNING: + file_list_length = len(self.file_list()) + expected_list_length = (self.end_frame - self.start_frame + 1) if self.end_frame else 1 + + msg = f"Frames: Expected ({expected_list_length}) vs actual ({file_list_length}) for {self}" + self.log_and_print(msg, log_file, 'debug') + + if file_list_length not in (expected_list_length, 1): + msg = f"Missing frames: Expected ({expected_list_length}) vs actual ({file_list_length})" + self.log_and_print(msg, log_file, 'error') + self.errors.append(msg) + self.status = RenderStatus.ERROR + # todo: create new subjob to generate missing frames + + # cleanup and close if cancelled / error if self.status in [RenderStatus.CANCELLED, RenderStatus.ERROR]: self.end_time = datetime.now() - message = f"{self.engine.name()} render ended with status '{self.status}' " \ + message = f"{self.engine.name()} render ended with status '{self.status.value}' " \ f"after {self.time_elapsed()}" self.log_and_print(message, log_file) return - # Validate Output - file_list_length = len(self.file_list()) - expected_list_length = (self.end_frame - self.start_frame + 1) if self.end_frame else 1 - - if file_list_length not in (expected_list_length, 1): - logger.error(f"Expected length: {expected_list_length} | actual length: {len(self.file_list())}") - # todo: create new subjob - # Post Render Work if not self.parent: logger.debug(f"Starting post-processing work for {self}") + self.log_and_print(f"Starting post-processing work for {self}", log_file, 'debug') self.post_processing() - logger.debug(f"Completed post-processing work for {self}") + self.log_and_print(f"Completed post-processing work for {self}", log_file, 'debug') self.status = RenderStatus.COMPLETED self.end_time = datetime.now() @@ -389,7 +403,11 @@ class BaseRenderWorker(Base): def file_list(self): try: job_dir = os.path.dirname(self.output_path) - file_list = [os.path.join(job_dir, file) for file in os.listdir(job_dir)] + file_list = [ + os.path.join(job_dir, file) + for file in os.listdir(job_dir) + if not file.startswith('.') # Ignore hidden files + ] file_list.sort() return file_list except FileNotFoundError: