diff --git a/src/api/serverproxy_manager.py b/src/api/serverproxy_manager.py index da67268..5cb48b4 100644 --- a/src/api/serverproxy_manager.py +++ b/src/api/serverproxy_manager.py @@ -26,7 +26,7 @@ class ServerProxyManager: @classmethod def get_proxy_for_hostname(cls, hostname): found_proxy = cls.server_proxys.get(hostname) - if not found_proxy: + if hostname and not found_proxy: new_proxy = RenderServerProxy(hostname) new_proxy.start_background_update() cls.server_proxys[hostname] = new_proxy diff --git a/src/engines/core/base_engine.py b/src/engines/core/base_engine.py index 0cf4d27..92da42e 100644 --- a/src/engines/core/base_engine.py +++ b/src/engines/core/base_engine.py @@ -13,7 +13,7 @@ class BaseRenderEngine(object): def __init__(self, custom_path=None): self.custom_renderer_path = custom_path - if not self.renderer_path(): + if not self.renderer_path() or not os.path.exists(self.renderer_path()): raise FileNotFoundError(f"Cannot find path to renderer for {self.name()} instance") def renderer_path(self): diff --git a/src/engines/core/base_worker.py b/src/engines/core/base_worker.py index bfdce4c..c3fa603 100644 --- a/src/engines/core/base_worker.py +++ b/src/engines/core/base_worker.py @@ -72,6 +72,7 @@ class BaseRenderWorker(Base): self.parent = parent self.children = {} self.name = name or os.path.basename(input_path) + self.maximum_attempts = 3 # Frame Ranges self.project_length = -1 @@ -193,8 +194,15 @@ class BaseRenderWorker(Base): while True: # Log attempt # if attempt_number: - f.write(f'\n{"=" * 80} Attempt #{attempt_number} {"=" * 30}\n\n') - logger.warning(f"Restarting render - Attempt #{attempt_number}") + if attempt_number >= self.maximum_attempts: + err_msg = f"Maximum attempts exceeded ({attempt_number})" + logger.error(err_msg) + self.status = RenderStatus.ERROR + self.errors.append(err_msg) + return + else: + f.write(f'\n{"=" * 80} Attempt #{attempt_number} {"=" * 30}\n\n') + logger.warning(f"Restarting render - Attempt #{attempt_number}") attempt_number += 1 # Start process and get updates diff --git a/src/engines/engine_manager.py b/src/engines/engine_manager.py index 944057a..9edf4b6 100644 --- a/src/engines/engine_manager.py +++ b/src/engines/engine_manager.py @@ -211,8 +211,8 @@ class EngineManager: raise FileNotFoundError(f"Cannot find any installed {renderer} engines") # Find the path to the requested engine version or use default - engine_path = None if engine_version else all_versions[0]['path'] - if engine_version: + engine_path = None + if engine_version and engine_version != 'latest': for ver in all_versions: if ver['version'] == engine_version: engine_path = ver['path'] @@ -225,6 +225,9 @@ class EngineManager: raise FileNotFoundError(f"Cannot download requested version: {renderer} {engine_version}") engine_path = download_result['path'] logger.info("Engine downloaded. Creating worker.") + else: + logger.debug(f"Using latest engine version ({all_versions[0]['version']})") + engine_path = all_versions[0]['path'] if not engine_path: raise FileNotFoundError(f"Cannot find requested engine version {engine_version}") diff --git a/src/engines/ffmpeg/ffmpeg_worker.py b/src/engines/ffmpeg/ffmpeg_worker.py index b7780fd..49fc80c 100644 --- a/src/engines/ffmpeg/ffmpeg_worker.py +++ b/src/engines/ffmpeg/ffmpeg_worker.py @@ -17,7 +17,7 @@ class FFMPEGRenderWorker(BaseRenderWorker): def generate_worker_subprocess(self): - cmd = [self.engine.default_renderer_path(), '-y', '-stats', '-i', self.input_path] + cmd = [self.renderer_path, '-y', '-stats', '-i', self.input_path] # Resize frame if self.args.get('x_resolution', None) and self.args.get('y_resolution', None): @@ -29,7 +29,7 @@ class FFMPEGRenderWorker(BaseRenderWorker): cmd.extend(raw_args.split(' ')) # Close with output path - cmd.append(self.output_path) + cmd.extend(['-max_muxing_queue_size', '1024', self.output_path]) return cmd def percent_complete(self): diff --git a/src/ui/add_job.py b/src/ui/add_job.py index cd53446..bbae15b 100644 --- a/src/ui/add_job.py +++ b/src/ui/add_job.py @@ -186,6 +186,7 @@ class NewRenderJobForm(QWidget): # Version renderer_layout.addWidget(QLabel("Version:")) self.renderer_version_combo = QComboBox() + self.renderer_version_combo.addItem('latest') renderer_layout.addWidget(self.renderer_version_combo) renderer_group_layout.addLayout(renderer_layout) # dynamic options @@ -248,6 +249,7 @@ class NewRenderJobForm(QWidget): # load the version numbers current_renderer = self.renderer_type.currentText().lower() or self.renderer_type.itemText(0) self.renderer_version_combo.clear() + self.renderer_version_combo.addItem('latest') self.file_format_combo.clear() if current_renderer: renderer_vers = [version_info['version'] for version_info in self.renderer_info[current_renderer]['versions']] @@ -442,7 +444,7 @@ class SubmitWorker(QThread): hostname = self.window.server_input.currentText() job_json = {'owner': psutil.Process().username() + '@' + socket.gethostname(), 'renderer': self.window.renderer_type.currentText().lower(), - 'renderer_version': self.window.renderer_version_combo.currentText(), + 'engine_version': self.window.renderer_version_combo.currentText(), 'args': {'raw': self.window.raw_args.text()}, 'output_path': self.window.output_path_input.text(), 'start_frame': self.window.start_frame_input.value(),