Spaces:
Running
Running
from typing import Dict, Optional, Any, List | |
from types import ModuleType | |
import importlib | |
import sys | |
import gradio | |
import facefusion.globals | |
from facefusion import metadata, logger, wording | |
from facefusion.uis.typing import Component, ComponentName | |
from facefusion.filesystem import resolve_relative_path | |
UI_COMPONENTS: Dict[ComponentName, Component] = {} | |
UI_LAYOUT_MODULES : List[ModuleType] = [] | |
UI_LAYOUT_METHODS =\ | |
[ | |
'pre_check', | |
'pre_render', | |
'render', | |
'listen', | |
'run' | |
] | |
def load_ui_layout_module(ui_layout : str) -> Any: | |
try: | |
ui_layout_module = importlib.import_module('facefusion.uis.layouts.' + ui_layout) | |
for method_name in UI_LAYOUT_METHODS: | |
if not hasattr(ui_layout_module, method_name): | |
raise NotImplementedError | |
except ModuleNotFoundError as exception: | |
logger.debug(exception.msg, __name__.upper()) | |
sys.exit(wording.get('ui_layout_not_loaded').format(ui_layout = ui_layout)) | |
except NotImplementedError: | |
sys.exit(wording.get('ui_layout_not_implemented').format(ui_layout = ui_layout)) | |
return ui_layout_module | |
def get_ui_layouts_modules(ui_layouts : List[str]) -> List[ModuleType]: | |
global UI_LAYOUT_MODULES | |
if not UI_LAYOUT_MODULES: | |
for ui_layout in ui_layouts: | |
ui_layout_module = load_ui_layout_module(ui_layout) | |
UI_LAYOUT_MODULES.append(ui_layout_module) | |
return UI_LAYOUT_MODULES | |
def get_ui_component(name : ComponentName) -> Optional[Component]: | |
if name in UI_COMPONENTS: | |
return UI_COMPONENTS[name] | |
return None | |
def register_ui_component(name : ComponentName, component: Component) -> None: | |
UI_COMPONENTS[name] = component | |
def launch() -> None: | |
with gradio.Blocks(theme = get_theme(), css = get_css(), title = metadata.get('name') + ' ' + metadata.get('version')) as ui: | |
for ui_layout in facefusion.globals.ui_layouts: | |
ui_layout_module = load_ui_layout_module(ui_layout) | |
if ui_layout_module.pre_render(): | |
ui_layout_module.render() | |
ui_layout_module.listen() | |
for ui_layout in facefusion.globals.ui_layouts: | |
ui_layout_module = load_ui_layout_module(ui_layout) | |
ui_layout_module.run(ui) | |
def get_theme() -> gradio.Theme: | |
return gradio.themes.Base( | |
primary_hue = gradio.themes.colors.red, | |
secondary_hue = gradio.themes.colors.neutral, | |
font = gradio.themes.GoogleFont('Open Sans') | |
).set( | |
background_fill_primary = '*neutral_100', | |
block_background_fill = 'white', | |
block_border_width = '0', | |
block_label_background_fill = '*primary_100', | |
block_label_background_fill_dark = '*primary_600', | |
block_label_border_width = 'none', | |
block_label_margin = '0.5rem', | |
block_label_radius = '*radius_md', | |
block_label_text_color = '*primary_500', | |
block_label_text_color_dark = 'white', | |
block_label_text_weight = '600', | |
block_title_background_fill = '*primary_100', | |
block_title_background_fill_dark = '*primary_600', | |
block_title_padding = '*block_label_padding', | |
block_title_radius = '*block_label_radius', | |
block_title_text_color = '*primary_500', | |
block_title_text_size = '*text_sm', | |
block_title_text_weight = '600', | |
block_padding = '0.5rem', | |
border_color_primary = 'transparent', | |
border_color_primary_dark = 'transparent', | |
button_large_padding = '2rem 0.5rem', | |
button_large_text_weight = 'normal', | |
button_primary_background_fill = '*primary_500', | |
button_primary_text_color = 'white', | |
button_secondary_background_fill = 'white', | |
button_secondary_border_color = 'transparent', | |
button_secondary_border_color_dark = 'transparent', | |
button_secondary_border_color_hover = 'transparent', | |
button_secondary_border_color_hover_dark = 'transparent', | |
button_secondary_text_color = '*neutral_800', | |
button_small_padding = '0.75rem', | |
checkbox_background_color = '*neutral_200', | |
checkbox_background_color_selected = '*primary_600', | |
checkbox_background_color_selected_dark = '*primary_700', | |
checkbox_border_color_focus = '*primary_500', | |
checkbox_border_color_focus_dark = '*primary_600', | |
checkbox_border_color_selected = '*primary_600', | |
checkbox_border_color_selected_dark = '*primary_700', | |
checkbox_label_background_fill = '*neutral_50', | |
checkbox_label_background_fill_hover = '*neutral_50', | |
checkbox_label_background_fill_selected = '*primary_500', | |
checkbox_label_background_fill_selected_dark = '*primary_600', | |
checkbox_label_text_color_selected = 'white', | |
input_background_fill = '*neutral_50', | |
shadow_drop = 'none', | |
slider_color = '*primary_500', | |
slider_color_dark = '*primary_600' | |
) | |
def get_css() -> str: | |
fixes_css_path = resolve_relative_path('uis/assets/fixes.css') | |
overrides_css_path = resolve_relative_path('uis/assets/overrides.css') | |
return open(fixes_css_path, 'r').read() + open(overrides_css_path, 'r').read() | |