diff --git a/main.spec b/main.spec new file mode 100644 index 0000000..54cef0a --- /dev/null +++ b/main.spec @@ -0,0 +1,64 @@ +# -*- mode: python ; coding: utf-8 -*- +from PyInstaller.utils.hooks import collect_all + +# - get version from version file +import os +import sys +sys.path.insert(0, os.path.abspath('.')) +from version import APP_NAME, APP_VERSION + +datas = [('resources', 'resources'), ('src/engines/blender/scripts/', 'src/engines/blender/scripts')] +binaries = [] +hiddenimports = ['zeroconf'] +tmp_ret = collect_all('zeroconf') +datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2] + + +a = Analysis( + ['main.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='main', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='main', +) +app = BUNDLE( + coll, + name=f'{APP_NAME}.app', + icon=None, + bundle_identifier=None, + version=APP_VERSION +) diff --git a/setup.py b/setup.py deleted file mode 100644 index 0e6007c..0000000 --- a/setup.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -This is a setup.py script generated by py2applet - -Usage: - python setup.py py2app -""" -import glob - -from setuptools import setup - -APP = ['main.py'] -DATA_FILES = [('config', glob.glob('config/*.*')), - ('resources', glob.glob('resources/*.*'))] -OPTIONS = {} - -setup( - app=APP, - data_files=DATA_FILES, - options={'py2app': OPTIONS}, - setup_requires=['py2app'], - name='Zordon' -) diff --git a/src/engines/blender/blender_engine.py b/src/engines/blender/blender_engine.py index b086c33..44822c9 100644 --- a/src/engines/blender/blender_engine.py +++ b/src/engines/blender/blender_engine.py @@ -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): diff --git a/src/engines/blender/blender_ui.py b/src/engines/blender/blender_ui.py index fd28b70..100df2a 100644 --- a/src/engines/blender/blender_ui.py +++ b/src/engines/blender/blender_ui.py @@ -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 diff --git a/src/engines/core/base_engine.py b/src/engines/core/base_engine.py index 469e87f..f1bdf30 100644 --- a/src/engines/core/base_engine.py +++ b/src/engines/core/base_engine.py @@ -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 diff --git a/src/engines/engine_manager.py b/src/engines/engine_manager.py index f86df49..0b3f174 100644 --- a/src/engines/engine_manager.py +++ b/src/engines/engine_manager.py @@ -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] diff --git a/src/engines/ffmpeg/ffmpeg_engine.py b/src/engines/ffmpeg/ffmpeg_engine.py index 5e780a6..4f2ab9f 100644 --- a/src/engines/ffmpeg/ffmpeg_engine.py +++ b/src/engines/ffmpeg/ffmpeg_engine.py @@ -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() diff --git a/src/engines/ffmpeg/ffmpeg_ui.py b/src/engines/ffmpeg/ffmpeg_ui.py index a04a56f..fdbe7fe 100644 --- a/src/engines/ffmpeg/ffmpeg_ui.py +++ b/src/engines/ffmpeg/ffmpeg_ui.py @@ -1,5 +1,5 @@ class FFMPEGUI: @staticmethod - def get_options(instance): + def get_options(system_info): options = [] return options diff --git a/src/ui/add_job.py b/src/ui/add_job.py index c671b16..732ed7c 100644 --- a/src/ui/add_job.py +++ b/src/ui/add_job.py @@ -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() + ':') diff --git a/version.py b/version.py new file mode 100644 index 0000000..370682e --- /dev/null +++ b/version.py @@ -0,0 +1,2 @@ +APP_NAME = "Zordon" +APP_VERSION = "0.0.1"