diff --git a/src/api/api_server.py b/src/api/api_server.py index 77d3ba1..a3ef1cf 100755 --- a/src/api/api_server.py +++ b/src/api/api_server.py @@ -377,43 +377,45 @@ def status(): @server.get('/api/renderer_info') def renderer_info(): - response_type = request.args.get('response_type', 'standard') + if response_type not in ['full', 'standard']: + raise ValueError(f"Invalid response_type: {response_type}") def process_engine(engine): try: # Get all installed versions of the engine installed_versions = EngineManager.all_versions_for_engine(engine.name()) - if installed_versions: - # Use system-installed versions to avoid permission issues - system_installed_versions = [x for x in installed_versions if x['type'] == 'system'] - install_path = system_installed_versions[0]['path'] if system_installed_versions else \ - installed_versions[0]['path'] + if not installed_versions: + return None - en = engine(install_path) + system_installed_versions = [v for v in installed_versions if v['type'] == 'system'] + install_path = system_installed_versions[0]['path'] if system_installed_versions else installed_versions[0]['path'] - if response_type == 'full': # Full dataset - Can be slow - return { - en.name(): { - 'is_available': RenderQueue.is_available_for_job(en.name()), - 'versions': installed_versions, - 'supported_extensions': engine.supported_extensions(), - 'supported_export_formats': en.get_output_formats(), - 'system_info': en.system_info() - } + en = engine(install_path) + engine_name = en.name() + result = { + engine_name: { + 'is_available': RenderQueue.is_available_for_job(engine_name), + 'versions': installed_versions + } + } + + if response_type == 'full': + with concurrent.futures.ThreadPoolExecutor() as executor: + future_results = { + 'supported_extensions': executor.submit(en.supported_extensions), + 'supported_export_formats': executor.submit(en.get_output_formats), + 'system_info': executor.submit(en.system_info) } - elif response_type == 'standard': # Simpler dataset to reduce response times - return { - en.name(): { - 'is_available': RenderQueue.is_available_for_job(en.name()), - 'versions': installed_versions, - } - } - else: - raise AttributeError(f"Invalid response_type: {response_type}") + + for key, future in future_results.items(): + result[engine_name][key] = future.result() + + return result + except Exception as e: logger.error(f'Error fetching details for {engine.name()} renderer: {e}') - return {} + raise e renderer_data = {} with concurrent.futures.ThreadPoolExecutor() as executor: