From 9e8eb77328de407354b7db57492d6f2c6de84c2f Mon Sep 17 00:00:00 2001 From: Brett Williams Date: Thu, 16 Nov 2023 13:55:49 -0600 Subject: [PATCH] Cleanup extension matching --- src/engines/blender/blender_engine.py | 5 ++++- src/engines/engine_manager.py | 5 +++-- src/engines/ffmpeg/ffmpeg_engine.py | 23 +++++++++++++++-------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/engines/blender/blender_engine.py b/src/engines/blender/blender_engine.py index 274259b..03c74b2 100644 --- a/src/engines/blender/blender_engine.py +++ b/src/engines/blender/blender_engine.py @@ -10,7 +10,6 @@ logger = logging.getLogger() class Blender(BaseRenderEngine): install_paths = ['/Applications/Blender.app/Contents/MacOS/Blender'] - supported_extensions = ['.blend'] binary_names = {'linux': 'blender', 'windows': 'blender.exe', 'macos': 'Blender'} @staticmethod @@ -23,6 +22,10 @@ class Blender(BaseRenderEngine): from src.engines.blender.blender_worker import BlenderRenderWorker return BlenderRenderWorker + @staticmethod + def supported_extensions(): + return ['blend'] + def version(self): version = None try: diff --git a/src/engines/engine_manager.py b/src/engines/engine_manager.py index 1f91072..2af7201 100644 --- a/src/engines/engine_manager.py +++ b/src/engines/engine_manager.py @@ -244,10 +244,11 @@ class EngineManager: @classmethod def engine_for_project_path(cls, path): name, extension = os.path.splitext(path) + extension = extension.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 65d911e..3725be4 100644 --- a/src/engines/ffmpeg/ffmpeg_engine.py +++ b/src/engines/ffmpeg/ffmpeg_engine.py @@ -18,6 +18,16 @@ class FFMPEG(BaseRenderEngine): from src.engines.ffmpeg.ffmpeg_worker import FFMPEGRenderWorker return FFMPEGRenderWorker + @classmethod + def supported_extensions(cls): + help_text = (subprocess.check_output([cls().renderer_path(), '-h', 'full'], stderr=subprocess.STDOUT) + .decode('utf-8')) + found = re.findall('extensions that .* is allowed to access \(default "(.*)"', help_text) + found_extensions = set() + for match in found: + found_extensions.update(match.split(',')) + return list(found_extensions) + def version(self): version = None try: @@ -31,15 +41,11 @@ class FFMPEG(BaseRenderEngine): return version def get_project_info(self, project_path, timeout=10): - return self.get_video_info_ffprobe(project_path) - - @staticmethod - def get_video_info_ffprobe(video_path): try: # Run ffprobe and parse the output as JSON cmd = [ 'ffprobe', '-v', 'quiet', '-print_format', 'json', - '-show_streams', '-select_streams', 'v', video_path + '-show_streams', '-select_streams', 'v', project_path ] result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) video_info = json.loads(result.stdout) @@ -85,7 +91,7 @@ class FFMPEG(BaseRenderEngine): try: formats_raw = subprocess.check_output([self.renderer_path(), '-formats'], stderr=subprocess.DEVNULL, timeout=SUBPROCESS_TIMEOUT).decode('utf-8') - pattern = '(?P[DE]{1,2})\s+(?P\S{2,})\s+(?P.*)\r' + pattern = '(?P[DE]{1,2})\s+(?P\S{2,})\s+(?P.*)' all_formats = [m.groupdict() for m in re.finditer(pattern, formats_raw)] return all_formats except Exception as e: @@ -105,7 +111,7 @@ class FFMPEG(BaseRenderEngine): return found_extensions def get_output_formats(self): - return [x for x in self.get_all_formats() if 'E' in x['type'].upper()] + return [x['id'] for x in self.get_all_formats() if 'E' in x['type'].upper()] def get_frame_count(self, path_to_file): raw_stdout = subprocess.check_output([self.renderer_path(), '-i', path_to_file, '-map', '0:v:0', '-c', 'copy', @@ -117,7 +123,8 @@ class FFMPEG(BaseRenderEngine): return frame_number def get_arguments(self): - help_text = subprocess.check_output([self.renderer_path(), '-h', 'long'], stderr=subprocess.STDOUT).decode('utf-8') + help_text = (subprocess.check_output([self.renderer_path(), '-h', 'long'], stderr=subprocess.STDOUT) + .decode('utf-8')) lines = help_text.splitlines() options = {}