2023-09-24 21:36:57 +08:00
|
|
|
import os
|
2025-04-29 22:05:54 +08:00
|
|
|
import json
|
|
|
|
import logging
|
|
|
|
from typing import List, Dict, Any, Optional
|
2023-09-24 21:36:57 +08:00
|
|
|
|
2025-04-29 22:05:54 +08:00
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
# Core paths
|
2023-09-24 21:36:57 +08:00
|
|
|
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
2024-10-09 22:20:20 +08:00
|
|
|
WORKFLOW_DIR = os.path.join(ROOT_DIR, "workflow")
|
2025-04-29 22:05:54 +08:00
|
|
|
CONFIG_PATH = os.path.join(ROOT_DIR, "config.json")
|
|
|
|
|
|
|
|
# Default configuration settings
|
|
|
|
DEFAULT_SETTINGS = {
|
|
|
|
'max_cluster_k': 10,
|
|
|
|
'kmeans_init': 'k-means++',
|
|
|
|
'nsfw_threshold': 0.85,
|
|
|
|
'mask_feather_ratio': 8,
|
|
|
|
'mask_down_size': 0.50,
|
|
|
|
'mask_size': 1
|
|
|
|
}
|
2023-09-24 21:36:57 +08:00
|
|
|
|
2025-04-29 22:05:54 +08:00
|
|
|
# File type definitions
|
2023-09-24 21:36:57 +08:00
|
|
|
file_types = [
|
2024-10-09 22:20:20 +08:00
|
|
|
("Image", ("*.png", "*.jpg", "*.jpeg", "*.gif", "*.bmp")),
|
|
|
|
("Video", ("*.mp4", "*.mkv")),
|
2023-09-24 21:36:57 +08:00
|
|
|
]
|
|
|
|
|
2025-04-29 22:05:54 +08:00
|
|
|
# Runtime variables
|
2025-02-03 19:33:44 +08:00
|
|
|
source_target_map = []
|
2024-09-10 16:58:33 +08:00
|
|
|
simple_map = {}
|
2024-09-10 07:07:58 +08:00
|
|
|
|
2025-04-29 22:05:54 +08:00
|
|
|
# Paths and processing options
|
2023-09-24 21:36:57 +08:00
|
|
|
source_path = None
|
|
|
|
target_path = None
|
|
|
|
output_path = None
|
|
|
|
frame_processors: List[str] = []
|
2024-10-09 22:20:20 +08:00
|
|
|
keep_fps = True
|
|
|
|
keep_audio = True
|
|
|
|
keep_frames = False
|
|
|
|
many_faces = False
|
|
|
|
map_faces = False
|
2025-04-29 22:05:54 +08:00
|
|
|
color_correction = False
|
2024-10-09 22:20:20 +08:00
|
|
|
nsfw_filter = False
|
2023-09-24 21:36:57 +08:00
|
|
|
video_encoder = None
|
|
|
|
video_quality = None
|
2024-10-09 22:20:20 +08:00
|
|
|
live_mirror = False
|
2024-12-13 22:19:11 +08:00
|
|
|
live_resizable = True
|
2023-09-24 21:36:57 +08:00
|
|
|
max_memory = None
|
|
|
|
execution_providers: List[str] = []
|
|
|
|
execution_threads = None
|
|
|
|
headless = None
|
2024-10-09 22:20:20 +08:00
|
|
|
log_level = "error"
|
|
|
|
fp_ui: Dict[str, bool] = {"face_enhancer": False}
|
2023-12-14 14:59:22 +08:00
|
|
|
camera_input_combobox = None
|
2024-10-06 23:06:57 +08:00
|
|
|
webcam_preview_running = False
|
|
|
|
show_fps = False
|
2024-10-25 23:29:30 +08:00
|
|
|
mouth_mask = False
|
|
|
|
show_mouth_mask_box = False
|
2025-04-29 22:05:54 +08:00
|
|
|
|
|
|
|
# Masking parameters - moved from hardcoded to configurable
|
|
|
|
mask_feather_ratio = DEFAULT_SETTINGS['mask_feather_ratio']
|
|
|
|
mask_down_size = DEFAULT_SETTINGS['mask_down_size']
|
|
|
|
mask_size = DEFAULT_SETTINGS['mask_size']
|
|
|
|
|
|
|
|
# Advanced parameters
|
|
|
|
max_cluster_k = DEFAULT_SETTINGS['max_cluster_k']
|
|
|
|
kmeans_init = DEFAULT_SETTINGS['kmeans_init']
|
|
|
|
nsfw_threshold = DEFAULT_SETTINGS['nsfw_threshold']
|
|
|
|
|
|
|
|
def load_settings() -> None:
|
|
|
|
"""
|
|
|
|
Load user settings from config file
|
|
|
|
"""
|
|
|
|
global mask_feather_ratio, mask_down_size, mask_size
|
|
|
|
global max_cluster_k, kmeans_init, nsfw_threshold
|
|
|
|
|
|
|
|
try:
|
|
|
|
if os.path.exists(CONFIG_PATH):
|
|
|
|
with open(CONFIG_PATH, 'r') as f:
|
|
|
|
config = json.load(f)
|
|
|
|
|
|
|
|
# Apply settings from config, falling back to defaults
|
|
|
|
mask_feather_ratio = config.get('mask_feather_ratio', DEFAULT_SETTINGS['mask_feather_ratio'])
|
|
|
|
mask_down_size = config.get('mask_down_size', DEFAULT_SETTINGS['mask_down_size'])
|
|
|
|
mask_size = config.get('mask_size', DEFAULT_SETTINGS['mask_size'])
|
|
|
|
max_cluster_k = config.get('max_cluster_k', DEFAULT_SETTINGS['max_cluster_k'])
|
|
|
|
kmeans_init = config.get('kmeans_init', DEFAULT_SETTINGS['kmeans_init'])
|
|
|
|
nsfw_threshold = config.get('nsfw_threshold', DEFAULT_SETTINGS['nsfw_threshold'])
|
|
|
|
|
|
|
|
logger.info("Settings loaded from config file")
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(f"Error loading settings: {str(e)}")
|
|
|
|
# Use defaults if loading fails
|
|
|
|
|
|
|
|
def save_settings() -> None:
|
|
|
|
"""
|
|
|
|
Save current settings to config file
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
config = {
|
|
|
|
'mask_feather_ratio': mask_feather_ratio,
|
|
|
|
'mask_down_size': mask_down_size,
|
|
|
|
'mask_size': mask_size,
|
|
|
|
'max_cluster_k': max_cluster_k,
|
|
|
|
'kmeans_init': kmeans_init,
|
|
|
|
'nsfw_threshold': nsfw_threshold
|
|
|
|
}
|
|
|
|
|
|
|
|
with open(CONFIG_PATH, 'w') as f:
|
|
|
|
json.dump(config, f, indent=2)
|
|
|
|
|
|
|
|
logger.info("Settings saved to config file")
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(f"Error saving settings: {str(e)}")
|
|
|
|
|
|
|
|
# Load settings at module import time
|
|
|
|
load_settings()
|