Pyinstaller support (#93)

* Add main.spec

* Fix issue where fetching supported extensions would crash with no default installation
This commit is contained in:
2024-08-10 14:58:41 -05:00
committed by GitHub
parent 51a5a63944
commit 3b33649f2d
10 changed files with 89 additions and 41 deletions

View File

@@ -22,12 +22,12 @@ class Blender(BaseRenderEngine):
from src.engines.blender.blender_worker import BlenderRenderWorker
return BlenderRenderWorker
def ui_options(self):
from src.engines.blender.blender_ui import BlenderUI
return BlenderUI.get_options(self)
@staticmethod
def supported_extensions():
def ui_options(system_info):
from src.engines.blender.blender_ui import BlenderUI
return BlenderUI.get_options(system_info)
def supported_extensions(self):
return ['blend']
def version(self):

View File

@@ -1,9 +1,9 @@
class BlenderUI:
@staticmethod
def get_options(instance):
def get_options(system_info):
options = [
{'name': 'engine', 'options': instance.supported_render_engines()},
{'name': 'engine', 'options': system_info.get('engines', [])},
{'name': 'render_device', 'options': ['Any', 'GPU', 'CPU']},
]
return options

View File

@@ -9,12 +9,11 @@ SUBPROCESS_TIMEOUT = 5
class BaseRenderEngine(object):
install_paths = []
supported_extensions = []
def __init__(self, custom_path=None):
self.custom_renderer_path = custom_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")
raise FileNotFoundError(f"Cannot find path to renderer for {self.name()} instance: {self.renderer_path()}")
if not os.access(self.renderer_path(), os.X_OK):
logger.warning(f"Path is not executable. Setting permissions to 755 for {self.renderer_path()}")
@@ -43,6 +42,9 @@ class BaseRenderEngine(object):
def version(self):
raise NotImplementedError("version not implemented")
def supported_extensions(self):
return []
@staticmethod
def downloader(): # override when subclassing if using a downloader class
return None
@@ -51,7 +53,8 @@ class BaseRenderEngine(object):
def worker_class(): # override when subclassing to link worker class
raise NotImplementedError("Worker class not implemented")
def ui_options(self): # override to return options for ui
@staticmethod
def ui_options(system_info): # override to return options for ui
return {}
def get_help(self): # override if renderer uses different help flag

View File

@@ -266,9 +266,9 @@ class EngineManager:
_, extension = os.path.splitext(path)
extension = extension.lower().strip('.')
for engine in cls.supported_engines():
if extension in engine.supported_extensions():
if extension in engine().supported_extensions():
return engine
undefined_renderer_support = [x for x in cls.supported_engines() if not x.supported_extensions()]
undefined_renderer_support = [x for x in cls.supported_engines() if not x().supported_extensions()]
return undefined_renderer_support[0]

View File

@@ -21,9 +21,8 @@ class FFMPEG(BaseRenderEngine):
from src.engines.ffmpeg.ffmpeg_ui import FFMPEGUI
return FFMPEGUI.get_options(self)
@classmethod
def supported_extensions(cls):
help_text = (subprocess.check_output([cls().renderer_path(), '-h', 'full'], stderr=subprocess.STDOUT)
def supported_extensions(self):
help_text = (subprocess.check_output([self.renderer_path(), '-h', 'full'], stderr=subprocess.STDOUT)
.decode('utf-8'))
found = re.findall(r'extensions that .* is allowed to access \(default "(.*)"', help_text)
found_extensions = set()

View File

@@ -1,5 +1,5 @@
class FFMPEGUI:
@staticmethod
def get_options(instance):
def get_options(system_info):
options = []
return options

View File

@@ -68,11 +68,12 @@ class NewRenderJobForm(QWidget):
# Setup
self.setWindowTitle("New Job")
self.setup_ui()
self.update_renderer_info()
self.setup_project()
# get renderer info in bg thread
t = threading.Thread(target=self.update_renderer_info)
t.start()
# t = threading.Thread(target=self.update_renderer_info)
# t.start()
self.show()
@@ -348,7 +349,8 @@ class NewRenderJobForm(QWidget):
# Dynamic Engine Options
clear_layout(self.renderer_options_layout) # clear old options
# dynamically populate option list
self.current_engine_options = engine().ui_options()
system_info = self.renderer_info.get(engine.name(), {}).get('system_info', {})
self.current_engine_options = engine.ui_options(system_info=system_info)
for option in self.current_engine_options:
h_layout = QHBoxLayout()
label = QLabel(option['name'].replace('_', ' ').capitalize() + ':')