Make renderer_info threaded again

This commit is contained in:
Brett Williams
2024-08-10 21:20:47 -05:00
parent e757506787
commit 19b01446ea

View File

@@ -377,43 +377,45 @@ def status():
@server.get('/api/renderer_info') @server.get('/api/renderer_info')
def renderer_info(): def renderer_info():
response_type = request.args.get('response_type', 'standard') 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): def process_engine(engine):
try: try:
# Get all installed versions of the engine # Get all installed versions of the engine
installed_versions = EngineManager.all_versions_for_engine(engine.name()) installed_versions = EngineManager.all_versions_for_engine(engine.name())
if installed_versions: if not installed_versions:
# Use system-installed versions to avoid permission issues return None
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']
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 en = engine(install_path)
return { engine_name = en.name()
en.name(): { result = {
'is_available': RenderQueue.is_available_for_job(en.name()), engine_name: {
'versions': installed_versions, 'is_available': RenderQueue.is_available_for_job(engine_name),
'supported_extensions': engine.supported_extensions(), 'versions': installed_versions
'supported_export_formats': en.get_output_formats(), }
'system_info': en.system_info() }
}
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 { for key, future in future_results.items():
en.name(): { result[engine_name][key] = future.result()
'is_available': RenderQueue.is_available_for_job(en.name()),
'versions': installed_versions, return result
}
}
else:
raise AttributeError(f"Invalid response_type: {response_type}")
except Exception as e: except Exception as e:
logger.error(f'Error fetching details for {engine.name()} renderer: {e}') logger.error(f'Error fetching details for {engine.name()} renderer: {e}')
return {} raise e
renderer_data = {} renderer_data = {}
with concurrent.futures.ThreadPoolExecutor() as executor: with concurrent.futures.ThreadPoolExecutor() as executor: