From c3f24d28abf64fc4f634deb8b8c0df7864261870 Mon Sep 17 00:00:00 2001 From: henryruhs Date: Wed, 30 Oct 2024 20:44:08 +0100 Subject: [PATCH] Partial adjust program codebase --- facefusion/args.py | 1 + facefusion/core.py | 1 + facefusion/program.py | 55 ++++++++++++++++++++++++++++-------- facefusion/program_helper.py | 8 ------ facefusion/typing.py | 2 ++ facefusion/uis/core.py | 11 +++++--- facefusion/wording.py | 1 + tests/test_program_helper.py | 22 +-------------- 8 files changed, 57 insertions(+), 44 deletions(-) diff --git a/facefusion/args.py b/facefusion/args.py index 84a09bf4..00a13859 100644 --- a/facefusion/args.py +++ b/facefusion/args.py @@ -35,6 +35,7 @@ def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: # general apply_state_item('command', args.get('command')) # paths + apply_state_item('temp_path', args.get('temp_path')) apply_state_item('jobs_path', args.get('jobs_path')) apply_state_item('source_paths', args.get('source_paths')) apply_state_item('target_path', args.get('target_path')) diff --git a/facefusion/core.py b/facefusion/core.py index 688959ca..72417681 100755 --- a/facefusion/core.py +++ b/facefusion/core.py @@ -67,6 +67,7 @@ def route(args : Args) -> None: for ui_layout in ui.get_ui_layouts_modules(state_manager.get_item('ui_layouts')): if not ui_layout.pre_check(): return conditional_exit(2) + ui.init() ui.launch() if state_manager.get_item('command') == 'headless-run': if not job_manager.init_jobs(state_manager.get_item('jobs_path')): diff --git a/facefusion/program.py b/facefusion/program.py index 314cb794..3272fe01 100755 --- a/facefusion/program.py +++ b/facefusion/program.py @@ -1,3 +1,4 @@ +import tempfile from argparse import ArgumentParser, HelpFormatter import facefusion.choices @@ -7,7 +8,7 @@ from facefusion.execution import get_execution_provider_choices from facefusion.filesystem import list_directory from facefusion.jobs import job_store from facefusion.processors.core import get_processors_modules -from facefusion.program_helper import remove_args, suggest_face_detector_choices +from facefusion.program_helper import suggest_face_detector_choices def create_help_formatter_small(prog : str) -> HelpFormatter: @@ -18,15 +19,33 @@ def create_help_formatter_large(prog : str) -> HelpFormatter: return HelpFormatter(prog, max_help_position = 300) -def create_config_program() -> ArgumentParser: +def create_paths_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') - group_paths.add_argument('-c', '--config-path', help = wording.get('help.config_path'), default = 'facefusion.ini') + group_paths.add_argument('-s', '--source-paths', help = wording.get('help.source_paths'), action = 'append', default = config.get_str_list('paths.source_paths')) + group_paths.add_argument('-t', '--target-path', help = wording.get('help.target_path'), default = config.get_str_value('paths.target_path')) + group_paths.add_argument('-o', '--output-path', help = wording.get('help.output_path'), default = config.get_str_value('paths.output_path')) + job_store.register_step_keys([ 'source_paths', 'target_path', 'output_path' ]) + return program + + +def create_config_path_program() -> ArgumentParser: + program = ArgumentParser(add_help = False) + group_paths = program.add_argument_group('paths') + group_paths.add_argument('--config-path', help = wording.get('help.config_path'), default = 'facefusion.ini') job_store.register_job_keys([ 'config-path' ]) apply_config_path(program) return program +def create_temp_path_program() -> ArgumentParser: + program = ArgumentParser(add_help = False) + group_paths = program.add_argument_group('paths') + group_paths.add_argument('--temp-path', help = wording.get('help.temp_path'), default = tempfile.gettempdir()) + job_store.register_job_keys([ 'temp_path' ]) + return program + + def create_jobs_path_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') @@ -35,13 +54,27 @@ def create_jobs_path_program() -> ArgumentParser: return program -def create_paths_program() -> ArgumentParser: +def create_source_paths_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') group_paths.add_argument('-s', '--source-paths', help = wording.get('help.source_paths'), action = 'append', default = config.get_str_list('paths.source_paths')) + job_store.register_job_keys([ 'source_paths' ]) + return program + + +def create_target_path_program() -> ArgumentParser: + program = ArgumentParser(add_help = False) + group_paths = program.add_argument_group('paths') group_paths.add_argument('-t', '--target-path', help = wording.get('help.target_path'), default = config.get_str_value('paths.target_path')) + job_store.register_job_keys([ 'target_path' ]) + return program + + +def create_output_path_program() -> ArgumentParser: + program = ArgumentParser(add_help = False) + group_paths = program.add_argument_group('paths') group_paths.add_argument('-o', '--output-path', help = wording.get('help.output_path'), default = config.get_str_value('paths.output_path')) - job_store.register_step_keys([ 'source_paths', 'target_path', 'output_path' ]) + job_store.register_step_keys([ 'output_path' ]) return program @@ -197,7 +230,7 @@ def create_step_index_program() -> ArgumentParser: def collect_step_program() -> ArgumentParser: - return ArgumentParser(parents= [ create_config_program(), create_jobs_path_program(), create_paths_program(), create_face_detector_program(), create_face_landmarker_program(), create_face_selector_program(), create_face_masker_program(), create_frame_extraction_program(), create_output_creation_program(), create_processors_program() ], add_help = False) + return ArgumentParser(parents= [ create_config_path_program(), create_jobs_path_program(), create_paths_program(), create_face_detector_program(), create_face_landmarker_program(), create_face_selector_program(), create_face_masker_program(), create_frame_extraction_program(), create_output_creation_program(), create_processors_program() ], add_help = False) def collect_job_program() -> ArgumentParser: @@ -221,14 +254,14 @@ def create_program() -> ArgumentParser: sub_program.add_parser('job-delete', help = wording.get('help.job_delete'), parents = [ create_job_id_program(), create_jobs_path_program(), create_log_level_program() ], formatter_class = create_help_formatter_large) sub_program.add_parser('job-delete-all', help = wording.get('help.job_delete_all'), parents = [ create_jobs_path_program(), create_log_level_program() ], formatter_class = create_help_formatter_large) sub_program.add_parser('job-add-step', help = wording.get('help.job_add_step'), parents = [ create_job_id_program(), collect_step_program(), create_log_level_program() ], formatter_class = create_help_formatter_large) - sub_program.add_parser('job-remix-step', help = wording.get('help.job_remix_step'), parents = [ create_job_id_program(), create_step_index_program(), remove_args(collect_step_program(), [ 'target_path' ]), create_log_level_program() ], formatter_class = create_help_formatter_large) + sub_program.add_parser('job-remix-step', help = wording.get('help.job_remix_step'), parents = [ create_job_id_program(), create_step_index_program(), collect_step_program(), create_log_level_program() ], formatter_class = create_help_formatter_large) sub_program.add_parser('job-insert-step', help = wording.get('help.job_insert_step'), parents = [ create_job_id_program(), create_step_index_program(), collect_step_program(), create_log_level_program() ], formatter_class = create_help_formatter_large) sub_program.add_parser('job-remove-step', help = wording.get('help.job_remove_step'), parents = [ create_job_id_program(), create_step_index_program(), create_jobs_path_program(), create_log_level_program() ], formatter_class = create_help_formatter_large) # job runner - sub_program.add_parser('job-run', help = wording.get('help.job_run'), parents = [ create_job_id_program(), create_config_program(), create_jobs_path_program(), collect_job_program() ], formatter_class = create_help_formatter_large) - sub_program.add_parser('job-run-all', help = wording.get('help.job_run_all'), parents = [ create_config_program(), create_jobs_path_program(), collect_job_program() ], formatter_class = create_help_formatter_large) - sub_program.add_parser('job-retry', help = wording.get('help.job_retry'), parents = [ create_job_id_program(), create_config_program(), create_jobs_path_program(), collect_job_program() ], formatter_class = create_help_formatter_large) - sub_program.add_parser('job-retry-all', help = wording.get('help.job_retry_all'), parents = [ create_config_program(), create_jobs_path_program(), collect_job_program() ], formatter_class = create_help_formatter_large) + sub_program.add_parser('job-run', help = wording.get('help.job_run'), parents = [ create_job_id_program(), create_config_path_program(), create_jobs_path_program(), collect_job_program() ], formatter_class = create_help_formatter_large) + sub_program.add_parser('job-run-all', help = wording.get('help.job_run_all'), parents = [ create_config_path_program(), create_jobs_path_program(), collect_job_program() ], formatter_class = create_help_formatter_large) + sub_program.add_parser('job-retry', help = wording.get('help.job_retry'), parents = [ create_job_id_program(), create_config_path_program(), create_jobs_path_program(), collect_job_program() ], formatter_class = create_help_formatter_large) + sub_program.add_parser('job-retry-all', help = wording.get('help.job_retry_all'), parents = [ create_config_path_program(), create_jobs_path_program(), collect_job_program() ], formatter_class = create_help_formatter_large) return ArgumentParser(parents = [ program ], formatter_class = create_help_formatter_small, add_help = True) diff --git a/facefusion/program_helper.py b/facefusion/program_helper.py index fb7738de..aea0a3a4 100644 --- a/facefusion/program_helper.py +++ b/facefusion/program_helper.py @@ -34,14 +34,6 @@ def validate_actions(program : ArgumentParser) -> bool: return True -def remove_args(program : ArgumentParser, remove_names : List[str]) -> ArgumentParser: - actions = [ action for action in program._actions if action.dest in remove_names ] - - for action in actions: - program._actions.remove(action) - return program - - def suggest_face_detector_choices(program : ArgumentParser) -> List[str]: known_args, _ = program.parse_known_args() return facefusion.choices.face_detector_set.get(known_args.face_detector_model) #type:ignore[call-overload] diff --git a/facefusion/typing.py b/facefusion/typing.py index 37042fde..29f0f232 100755 --- a/facefusion/typing.py +++ b/facefusion/typing.py @@ -192,6 +192,7 @@ StateKey = Literal\ [ 'command', 'config_path', + 'temp_path', 'jobs_path', 'source_paths', 'target_path', @@ -248,6 +249,7 @@ State = TypedDict('State', { 'command' : str, 'config_path' : str, + 'temp_path': str, 'jobs_path' : str, 'source_paths' : List[str], 'target_path' : str, diff --git a/facefusion/uis/core.py b/facefusion/uis/core.py index e7f870b8..2cff0015 100644 --- a/facefusion/uis/core.py +++ b/facefusion/uis/core.py @@ -12,10 +12,6 @@ from facefusion.exit_helper import hard_exit from facefusion.filesystem import resolve_relative_path from facefusion.uis.typing import Component, ComponentName -os.environ['GRADIO_ANALYTICS_ENABLED'] = '0' - -warnings.filterwarnings('ignore', category = UserWarning, module = 'gradio') - UI_COMPONENTS: Dict[ComponentName, Component] = {} UI_LAYOUT_MODULES : List[ModuleType] = [] UI_LAYOUT_METHODS =\ @@ -73,6 +69,13 @@ def register_ui_component(component_name : ComponentName, component: Component) UI_COMPONENTS[component_name] = component +def init() -> None: + os.environ['GRADIO_ANALYTICS_ENABLED'] = '0' + os.environ['GRADIO_TEMP_DIR'] = os.path.join(state_manager.get_item('temp_path'), 'gradio') + + warnings.filterwarnings('ignore', category = UserWarning, module = 'gradio') + + def launch() -> None: ui_layouts_total = len(state_manager.get_item('ui_layouts')) with gradio.Blocks(theme = get_theme(), css = get_css(), title = metadata.get('name') + ' ' + metadata.get('version'), fill_width = True) as ui: diff --git a/facefusion/wording.py b/facefusion/wording.py index 962f049f..23f19f5d 100755 --- a/facefusion/wording.py +++ b/facefusion/wording.py @@ -96,6 +96,7 @@ WORDING : Dict[str, Any] =\ 'skip_conda': 'skip the conda environment check', # paths 'config_path': 'choose the config file to override defaults', + 'temp_path': 'specify the directory for the temporary resources', 'jobs_path': 'specify the directory to store jobs', 'source_paths': 'choose single or multiple source images or audios', 'target_path': 'choose single target image or video', diff --git a/tests/test_program_helper.py b/tests/test_program_helper.py index f547fbc6..92b64fb2 100644 --- a/tests/test_program_helper.py +++ b/tests/test_program_helper.py @@ -2,7 +2,7 @@ from argparse import ArgumentParser import pytest -from facefusion.program_helper import find_argument_group, remove_args, validate_actions +from facefusion.program_helper import find_argument_group, validate_actions def test_find_argument_group() -> None: @@ -38,23 +38,3 @@ def test_validate_actions() -> None: action.default = args[action.dest] assert validate_actions(program) is False - - -def test_remove_args() -> None: - program = ArgumentParser() - program.add_argument('--test-1') - program.add_argument('--test-2') - program.add_argument('--test-3') - - actions = [ action.dest for action in program._actions ] - - assert 'test_1' in actions - assert 'test_2' in actions - assert 'test_3' in actions - - program = remove_args(program, [ 'test_1', 'test_2' ]) - actions = [ action.dest for action in program._actions ] - - assert 'test_1' not in actions - assert 'test_2' not in actions - assert 'test_3' in actions