diff --git a/lib/render_workers/aerender_worker.py b/lib/render_workers/aerender_worker.py index 1197ef2..4e586a2 100644 --- a/lib/render_workers/aerender_worker.py +++ b/lib/render_workers/aerender_worker.py @@ -113,8 +113,7 @@ class AERenderWorker(BaseRenderWorker): self.warnings.append(trimmed) logging.warning(trimmed) elif line.startswith('aerender ERROR') or 'ERROR:' in line: - self.errors.append(line) - logging.error(line) + self.log_error(line) def _update_progress(self, line): diff --git a/lib/render_workers/blender_worker.py b/lib/render_workers/blender_worker.py index eb99666..597db61 100644 --- a/lib/render_workers/blender_worker.py +++ b/lib/render_workers/blender_worker.py @@ -180,9 +180,8 @@ class BlenderRenderWorker(BaseRenderWorker): logger.debug( 'Frame:{0} | Mem:{1} | Time:{2} | Remaining:{3}'.format(self.current_frame, memory_use, time_elapsed, time_remaining)) - elif 'error' in line.lower(): - logger.error(line) - self.errors.append(line) + elif "file doesn't exist" in line.lower() or 'error' in line.lower(): + self.log_error(line) elif 'Saved' in line or 'Saving' in line or 'quit' in line: match = re.match(r'Time: (.*) \(Saving', line) if match: diff --git a/lib/render_workers/ffmpeg_worker.py b/lib/render_workers/ffmpeg_worker.py index 04920d6..2e17490 100644 --- a/lib/render_workers/ffmpeg_worker.py +++ b/lib/render_workers/ffmpeg_worker.py @@ -78,7 +78,7 @@ class FFMPEGRenderWorker(BaseRenderWorker): self.current_frame = stats['current_frame'] time_elapsed = stats['time_elapsed'] elif "not found" in line: - self.errors.append(line) + self.log_error(line) if __name__ == '__main__': diff --git a/lib/render_workers/render_worker.py b/lib/render_workers/render_worker.py index e6a0a77..057d499 100644 --- a/lib/render_workers/render_worker.py +++ b/lib/render_workers/render_worker.py @@ -64,6 +64,7 @@ class BaseRenderWorker(object): self.status = RenderStatus.NOT_STARTED self.warnings = [] self.errors = [] + self.halt_on_errors = True self.failed_attempts = 0 self.maximum_attempts = 1 @@ -162,7 +163,7 @@ class BaseRenderWorker(object): return_code = self.__process.wait() self.end_time = datetime.now() # Return early if job was cancelled - if self.status is RenderStatus.CANCELLED: + if self.status in [RenderStatus.CANCELLED, RenderStatus.ERROR]: self.is_finished = True return @@ -192,17 +193,29 @@ class BaseRenderWorker(object): return self.__thread.is_alive() return False - def stop(self): + def log_error(self, error_line): + logger.error(error_line) + self.errors.append(error_line) + if self.halt_on_errors: + self.stop(is_error=True) + + def stop(self, is_error=False): if self.__process: try: - self.status = RenderStatus.CANCELLED + if self.status in [RenderStatus.RUNNING, RenderStatus.NOT_STARTED, RenderStatus.SCHEDULED]: + if is_error: + err_message = self.errors[-1] if self.errors else 'Unknown error' + logger.error(f"Halting render due to error: {err_message}") + self.status = RenderStatus.ERROR + else: + self.status = RenderStatus.CANCELLED self.maximum_attempts = 0 process = psutil.Process(self.__process.pid) for proc in process.children(recursive=True): proc.kill() process.kill() except Exception as e: - logger.error(f"Exception stopping the process: {e}") + logger.debug(f"Error stopping the process: {e}") def percent_complete(self): return 0