| 
							 | 
						import os | 
					
					
						
						| 
							 | 
						import json | 
					
					
						
						| 
							 | 
						from pathlib import Path | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						CONFIG_DIR = "/home/user/app/SESA-Config" | 
					
					
						
						| 
							 | 
						CONFIG_FILE = os.path.join(CONFIG_DIR, "config.json") | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def load_config(): | 
					
					
						
						| 
							 | 
						    """Load configuration from config.json.""" | 
					
					
						
						| 
							 | 
						    default_config = { | 
					
					
						
						| 
							 | 
						        "favorites": [], | 
					
					
						
						| 
							 | 
						        "settings": { | 
					
					
						
						| 
							 | 
						            "chunk_size": 352800, | 
					
					
						
						| 
							 | 
						            "overlap": 2, | 
					
					
						
						| 
							 | 
						            "export_format": "wav FLOAT", | 
					
					
						
						| 
							 | 
						            "auto_use_tta": False, | 
					
					
						
						| 
							 | 
						            "use_tta": False, | 
					
					
						
						| 
							 | 
						            "use_demud_phaseremix_inst": False, | 
					
					
						
						| 
							 | 
						            "auto_extract_instrumental": False, | 
					
					
						
						| 
							 | 
						            "extract_instrumental": False, | 
					
					
						
						| 
							 | 
						            "use_apollo": False, | 
					
					
						
						| 
							 | 
						            "auto_use_apollo": False, | 
					
					
						
						| 
							 | 
						            "auto_apollo_chunk_size": 19, | 
					
					
						
						| 
							 | 
						            "auto_apollo_overlap": 2, | 
					
					
						
						| 
							 | 
						            "auto_apollo_method": "normal_method", | 
					
					
						
						| 
							 | 
						            "auto_apollo_normal_model": "Apollo Universal Model", | 
					
					
						
						| 
							 | 
						            "auto_apollo_midside_model": "Apollo Universal Model", | 
					
					
						
						| 
							 | 
						            "apollo_chunk_size": 19, | 
					
					
						
						| 
							 | 
						            "apollo_overlap": 2, | 
					
					
						
						| 
							 | 
						            "apollo_method": "normal_method", | 
					
					
						
						| 
							 | 
						            "apollo_normal_model": "Apollo Universal Model", | 
					
					
						
						| 
							 | 
						            "apollo_midside_model": "Apollo Universal Model", | 
					
					
						
						| 
							 | 
						            "use_matchering": False, | 
					
					
						
						| 
							 | 
						            "auto_use_matchering": False, | 
					
					
						
						| 
							 | 
						            "matchering_passes": 1, | 
					
					
						
						| 
							 | 
						            "auto_matchering_passes": 1, | 
					
					
						
						| 
							 | 
						            "model_category": "Vocal Models", | 
					
					
						
						| 
							 | 
						            "selected_model": None, | 
					
					
						
						| 
							 | 
						            "auto_category": "Vocal Models", | 
					
					
						
						| 
							 | 
						            "selected_models": [], | 
					
					
						
						| 
							 | 
						            "auto_ensemble_type": "avg_wave", | 
					
					
						
						| 
							 | 
						            "manual_ensemble_type": "avg_wave", | 
					
					
						
						| 
							 | 
						            "auto_category_dropdown": "Vocal Models", | 
					
					
						
						| 
							 | 
						            "manual_weights": "" | 
					
					
						
						| 
							 | 
						        }, | 
					
					
						
						| 
							 | 
						        "presets": {} | 
					
					
						
						| 
							 | 
						    } | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    os.makedirs(CONFIG_DIR, exist_ok=True) | 
					
					
						
						| 
							 | 
						    if not os.path.exists(CONFIG_FILE): | 
					
					
						
						| 
							 | 
						        with open(CONFIG_FILE, "w", encoding="utf-8") as f: | 
					
					
						
						| 
							 | 
						            json.dump(default_config, f, indent=2) | 
					
					
						
						| 
							 | 
						        return default_config | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    try: | 
					
					
						
						| 
							 | 
						        with open(CONFIG_FILE, "r", encoding="utf-8") as f: | 
					
					
						
						| 
							 | 
						            config = json.load(f) | 
					
					
						
						| 
							 | 
						         | 
					
					
						
						| 
							 | 
						        for key, value in default_config.items(): | 
					
					
						
						| 
							 | 
						            if key not in config: | 
					
					
						
						| 
							 | 
						                config[key] = value | 
					
					
						
						| 
							 | 
						            elif isinstance(value, dict): | 
					
					
						
						| 
							 | 
						                for subkey, subvalue in value.items(): | 
					
					
						
						| 
							 | 
						                    if subkey not in config[key]: | 
					
					
						
						| 
							 | 
						                        config[key][subkey] = subvalue | 
					
					
						
						| 
							 | 
						        return config | 
					
					
						
						| 
							 | 
						    except json.JSONDecodeError: | 
					
					
						
						| 
							 | 
						        print("Warning: config.json is corrupted. Creating a new one.") | 
					
					
						
						| 
							 | 
						        with open(CONFIG_FILE, "w", encoding="utf-8") as f: | 
					
					
						
						| 
							 | 
						            json.dump(default_config, f, indent=2) | 
					
					
						
						| 
							 | 
						        return default_config | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def save_config(favorites, settings, presets): | 
					
					
						
						| 
							 | 
						    """Save configuration to config.json.""" | 
					
					
						
						| 
							 | 
						    config = { | 
					
					
						
						| 
							 | 
						        "favorites": favorites, | 
					
					
						
						| 
							 | 
						        "settings": settings, | 
					
					
						
						| 
							 | 
						        "presets": presets | 
					
					
						
						| 
							 | 
						    } | 
					
					
						
						| 
							 | 
						    os.makedirs(CONFIG_DIR, exist_ok=True) | 
					
					
						
						| 
							 | 
						    with open(CONFIG_FILE, "w", encoding="utf-8") as f: | 
					
					
						
						| 
							 | 
						        json.dump(config, f, indent=2) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def update_favorites(favorites, model, add=True): | 
					
					
						
						| 
							 | 
						    """Update favorites list.""" | 
					
					
						
						| 
							 | 
						    cleaned_model = model | 
					
					
						
						| 
							 | 
						    new_favorites = favorites.copy() | 
					
					
						
						| 
							 | 
						    if add and cleaned_model not in new_favorites: | 
					
					
						
						| 
							 | 
						        new_favorites.append(cleaned_model) | 
					
					
						
						| 
							 | 
						    elif not add and cleaned_model in new_favorites: | 
					
					
						
						| 
							 | 
						        new_favorites.remove(cleaned_model) | 
					
					
						
						| 
							 | 
						    return new_favorites | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def save_preset(presets, preset_name, models, ensemble_method, **kwargs): | 
					
					
						
						| 
							 | 
						    """Save a preset.""" | 
					
					
						
						| 
							 | 
						    new_presets = presets.copy() | 
					
					
						
						| 
							 | 
						    cleaned_models = [clean_model(model) for model in models] | 
					
					
						
						| 
							 | 
						    new_presets[preset_name] = { | 
					
					
						
						| 
							 | 
						        "models": cleaned_models, | 
					
					
						
						| 
							 | 
						        "ensemble_method": ensemble_method, | 
					
					
						
						| 
							 | 
						        "chunk_size": kwargs.get("chunk_size", load_config()["settings"]["chunk_size"]), | 
					
					
						
						| 
							 | 
						        "overlap": kwargs.get("overlap", load_config()["settings"]["overlap"]), | 
					
					
						
						| 
							 | 
						        "auto_use_tta": kwargs.get("auto_use_tta", load_config()["settings"]["auto_use_tta"]), | 
					
					
						
						| 
							 | 
						        "auto_extract_instrumental": kwargs.get("auto_extract_instrumental", load_config()["settings"]["auto_extract_instrumental"]), | 
					
					
						
						| 
							 | 
						        "use_apollo": kwargs.get("use_apollo", load_config()["settings"]["use_apollo"]), | 
					
					
						
						| 
							 | 
						        "auto_apollo_chunk_size": kwargs.get("auto_apollo_chunk_size", load_config()["settings"]["auto_apollo_chunk_size"]), | 
					
					
						
						| 
							 | 
						        "auto_category_dropdown": kwargs.get("auto_category_dropdown", load_config()["settings"]["auto_category_dropdown"]),   | 
					
					
						
						| 
							 | 
						        "auto_apollo_overlap": kwargs.get("auto_apollo_overlap", load_config()["settings"]["auto_apollo_overlap"]), | 
					
					
						
						| 
							 | 
						        "auto_apollo_method": kwargs.get("auto_apollo_method", load_config()["settings"]["auto_apollo_method"]), | 
					
					
						
						| 
							 | 
						        "auto_apollo_normal_model": kwargs.get("auto_apollo_normal_model", load_config()["settings"]["auto_apollo_normal_model"]), | 
					
					
						
						| 
							 | 
						        "auto_apollo_midside_model": kwargs.get("auto_apollo_midside_model", load_config()["settings"]["auto_apollo_midside_model"]), | 
					
					
						
						| 
							 | 
						        "auto_use_matchering": kwargs.get("use_matchering", load_config()["settings"]["use_matchering"]), | 
					
					
						
						| 
							 | 
						        "auto_matchering_passes": kwargs.get("matchering_passes", load_config()["settings"]["matchering_passes"]), | 
					
					
						
						| 
							 | 
						        "auto_category": kwargs.get("auto_category", load_config()["settings"]["auto_category"]) | 
					
					
						
						| 
							 | 
						    } | 
					
					
						
						| 
							 | 
						    return new_presets | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def delete_preset(presets, preset_name): | 
					
					
						
						| 
							 | 
						    """Delete a preset.""" | 
					
					
						
						| 
							 | 
						    new_presets = presets.copy() | 
					
					
						
						| 
							 | 
						    if preset_name in new_presets: | 
					
					
						
						| 
							 | 
						        del new_presets[preset_name] | 
					
					
						
						| 
							 | 
						    return new_presets | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def clean_model(model): | 
					
					
						
						| 
							 | 
						    """Remove ⭐ from model name if present.""" | 
					
					
						
						| 
							 | 
						    return model.replace(" ⭐", "") if isinstance(model, str) else model | 
					
					
						
						| 
							 | 
						
 |