# modules/config_manager.py import os import json import gradio as gr # --- Yapılandırma ve Dosya Yolları --- CONFIG_FILE = "data/configs/config.json" TEMPLATES_FILE = "data/configs/renaming_templates.json" # Yeni Şablon Dosyası # --- ŞABLON YÖNETİMİ FONKSİYONLARI (YENİ) --- def load_renaming_templates(): default_templates = ["Adoptable {Number} (Female)", "{Number}", "Character_{Number}", "Design #{Number}"] if os.path.exists(TEMPLATES_FILE): try: with open(TEMPLATES_FILE, "r", encoding="utf-8") as f: loaded = json.load(f) if isinstance(loaded, list) and loaded: return loaded except: pass return default_templates def save_renaming_templates_to_file(templates): try: os.makedirs(os.path.dirname(TEMPLATES_FILE), exist_ok=True) with open(TEMPLATES_FILE, "w", encoding="utf-8") as f: json.dump(templates, f, indent=4, ensure_ascii=False) except Exception as e: print(f"Şablon kaydetme hatası: {e}") def add_renaming_template(new_template, current_list): if not new_template: return gr.update(), current_list if "{Number}" not in new_template: return gr.update(value="❌ Şablon '{Number}' içermelidir!"), current_list if new_template not in current_list: current_list.append(new_template) save_renaming_templates_to_file(current_list) # Dropdown'ı güncelle ve yeni ekleneni seçili yap return gr.update(choices=current_list, value=new_template), current_list return gr.update(value=new_template), current_list def delete_renaming_template(selected_template, current_list): if selected_template in current_list: current_list.remove(selected_template) save_renaming_templates_to_file(current_list) new_val = current_list[0] if current_list else "" return gr.update(choices=current_list, value=new_val), current_list return gr.update(), current_list # --- Yapılandırma Yönetimi Fonksiyonları --- def save_config(config_data): """ Klasör yollarını ve tüm uygulama ayarlarını bir JSON dosyasına kaydeder. """ try: os.makedirs(os.path.dirname(CONFIG_FILE), exist_ok=True) with open(CONFIG_FILE, "w", encoding="utf-8") as f: json.dump(config_data, f, indent=4) except IOError as e: print(f"Yapılandırma dosyası yazma hatası: {e}") def load_config(): """ Tüm uygulama ayarlarını bir JSON dosyasından yükler veya varsayılan değerleri döndürür. """ default_config = { "folder_paths": [], "general_settings": { "device": "Auto", "language": "tr", "theme": "Default" }, "global_tagger_settings": { "use_joint": True, "joint_thresh": 0.25, "use_cl_tagger": True, "cl_gen_thresh": 0.55, "cl_char_thresh": 0.60, "use_pixai_tagger": False, "pixai_general_thresh": 0.30, "pixai_char_thresh": 0.85, "use_animetagger": False, "animetagger_model": "MobileNet V4 (Hızlı)", "animetagger_thresh": 0.35, # Gemini Ayarları "use_gemini": False, "gemini_api_key": "", "gemini_mode": "Vision", "gemini_model": "gemini-2.5-flash", "gemini_prompt_vision": "Describe this image in a detailed, natural language caption for an AI image generator dataset. Focus on the main subject, clothing, pose, and background. Do not use bullet points.", "gemini_prompt_tags": "Create a fluent, natural language caption based on the provided tags. Focus on describing the scene vividly.", "gemini_prompt_hybrid": "Describe this image using the visual details and refine the description with the provided tags for accuracy. Focus on a cohesive narrative.", "gemini_system_instruction": "You are a helpful assistant that generates detailed and accurate image captions for AI image generation datasets.", # Kural Dosyaları "replacement_file": "", "synonym_file": "", "addition_file": "", "sort_order": "Alfabetik", "context_weight": 0.0, # Ayrı kategorizasyon ayarları "tekil_enable_categorization": False, "tekil_selected_categories": [], "toplu_enable_categorization": False, "toplu_selected_categories": [], "dual1_enable_categorization": False, "dual1_selected_categories": [], "dual2_enable_categorization": False, "dual2_selected_categories": [] }, "image_tools_settings": { "folder_paths": [], "scale_factor": 1.0, "selected_renaming_file": "", "renaming_type": "Rastgele", "watermark_text": "Örnek Filigran", "watermark_opacity": 0.35, "watermark_font_ratio": 0.05, "watermark_angle": -45, "renaming_templates": [], "brightness_level": 0, "contrast_level": 0, "denoise_level": 0, "sharpen_amount": 0.0, "sequential_pattern": "Adoptable #Number", "sequential_start_number": 1, "sequential_digit_count": 4 }, "art_tools_settings": { "grid_cols": 3, "grid_bg_color": "#000000", "grid_title_text": "ADOPTABLE SALE!", "grid_banner_color": "#000000", "grid_title_color": "#FFD700", "grid_add_labels": True, "grid_label_type": "Numara (#1, #2...)", "grid_start_num": 1 } } try: if os.path.exists(CONFIG_FILE): with open(CONFIG_FILE, "r", encoding="utf-8") as f: loaded_config = json.load(f) def update_dict(d, u): for k, v in u.items(): if isinstance(v, dict): # Eğer u[k] dict değilse (eski config uyumsuzluğu), d[k]'yı koru veya override et? # Basitçe d[k] var ve dict ise recursive, değilse direk al. d[k] = update_dict(d.get(k, {}), v) else: d[k] = v return d return update_dict(default_config.copy(), loaded_config) except (IOError, json.JSONDecodeError) as e: print(f"Yapılandırma dosyası okuma hatası veya dosya yok: {e}. Varsayılanlar yükleniyor.") return default_config # --- Ayarları Kaydetme Fonksiyonları --- def save_global_tagger_settings( device, language, theme, use_joint, joint_thresh, use_cl_tagger, cl_gen_thresh, cl_char_thresh, use_pixai_tagger, pixai_general_thresh, pixai_char_thresh, use_animetagger, animetagger_model, animetagger_thresh, # Gemini Parametreleri use_gemini, gemini_api_key, gemini_mode, gemini_model, gemini_prompt_vision, gemini_prompt_tags, gemini_prompt_hybrid, gemini_system_instruction, # Kural Dosyaları replacement_file, synonym_file, addition_file, sort_order, context_weight, # Kategorizasyon tekil_enable, tekil_cats, toplu_enable, toplu_cats, dual1_enable, dual1_cats, dual2_enable, dual2_cats ): config_data = load_config() config_data["general_settings"] = {"device": device, "language": language, "theme": theme} config_data["global_tagger_settings"] = { "use_joint": use_joint, "joint_thresh": joint_thresh, "use_cl_tagger": use_cl_tagger, "cl_gen_thresh": cl_gen_thresh, "cl_char_thresh": cl_char_thresh, "use_pixai_tagger": use_pixai_tagger, "pixai_general_thresh": pixai_general_thresh, "pixai_char_thresh": pixai_char_thresh, "use_animetagger": use_animetagger, "animetagger_model": animetagger_model, "animetagger_thresh": animetagger_thresh, # Gemini "use_gemini": use_gemini, "gemini_api_key": gemini_api_key, "gemini_mode": gemini_mode, "gemini_model": gemini_model, "gemini_prompt_vision": gemini_prompt_vision, "gemini_prompt_tags": gemini_prompt_tags, "gemini_prompt_hybrid": gemini_prompt_hybrid, "gemini_system_instruction": gemini_system_instruction, # Dosyalar "replacement_file": replacement_file, "synonym_file": synonym_file, "addition_file": addition_file, "sort_order": sort_order, "context_weight": context_weight, "tekil_enable_categorization": tekil_enable, "tekil_selected_categories": tekil_cats, "toplu_enable_categorization": toplu_enable, "toplu_selected_categories": toplu_cats, "dual1_enable_categorization": dual1_enable, "dual1_selected_categories": dual1_cats, "dual2_enable_categorization": dual2_enable, "dual2_selected_categories": dual2_cats } save_config(config_data) return gr.update(value="✅ Tüm genel ve özelleştirilmiş kategorizasyon ayarları kaydedildi.", visible=True) def save_image_tools_settings(folder_paths_str, scale_factor, watermark_text, watermark_opacity, watermark_font_ratio, watermark_angle, brightness_level, contrast_level, denoise_level, sharpen_amount): config_data = load_config() config_data["image_tools_settings"]["folder_paths"] = [path.strip() for path in folder_paths_str.split('\n') if path.strip()] config_data["image_tools_settings"]["scale_factor"] = scale_factor config_data["image_tools_settings"]["watermark_text"] = watermark_text config_data["image_tools_settings"]["watermark_opacity"] = watermark_opacity config_data["image_tools_settings"]["watermark_font_ratio"] = watermark_font_ratio config_data["image_tools_settings"]["watermark_angle"] = watermark_angle config_data["image_tools_settings"]["brightness_level"] = brightness_level config_data["image_tools_settings"]["contrast_level"] = contrast_level config_data["image_tools_settings"]["denoise_level"] = denoise_level config_data["image_tools_settings"]["sharpen_amount"] = sharpen_amount save_config(config_data) return gr.update(value="✅ Resim araçları ayarları kaydedildi.", visible=True) def save_art_tools_settings(grid_cols, grid_bg_color, grid_title_text, grid_banner_color, grid_title_color, grid_add_labels, grid_label_type, grid_start_num): config_data = load_config() # Eğer art_tools_settings keyi yoksa oluştur (eski configler için) if "art_tools_settings" not in config_data: config_data["art_tools_settings"] = {} config_data["art_tools_settings"]["grid_cols"] = grid_cols config_data["art_tools_settings"]["grid_bg_color"] = grid_bg_color config_data["art_tools_settings"]["grid_title_text"] = grid_title_text config_data["art_tools_settings"]["grid_banner_color"] = grid_banner_color config_data["art_tools_settings"]["grid_title_color"] = grid_title_color config_data["art_tools_settings"]["grid_add_labels"] = grid_add_labels config_data["art_tools_settings"]["grid_label_type"] = grid_label_type config_data["art_tools_settings"]["grid_start_num"] = grid_start_num save_config(config_data) return gr.update(value="✅ Art Studio ayarları kaydedildi.", visible=True)