# app.py - HuggingFace Space Version # UltraProTagger - Tam Uygulama import os import sys import gradio as gr # Modül importları from modules.shared_state import set_web_image, check_and_reset_tab_switch, shared_state from modules.config_manager import load_config from modules.ui.common import CSS_STYLES from modules.ui.tab_settings import create_settings_tab from modules.ui.tab_single import create_single_tab from modules.ui.tab_batch import create_batch_tab from modules.ui.tab_dual import create_dual_tab from modules.ui.tab_tools import create_tools_tab from modules.managers.rule_manager import ( read_replacement_file_content, read_synonym_file_content, read_addition_file_content ) from modules.managers.localization_manager import get_str # --- Global Kontroller --- try: from modules.tagger import run_joint_classifier, cl_tagger_instance except Exception as e: print(f"⚠️ Tagger yüklenirken hata: {e}") run_joint_classifier = None cl_tagger_instance = None # Klasör Sabitleri KATEGORILER_KLASORU = "data/rules/kategoriler" ALT_KATEGORILER_KLASORU = "data/rules/alt_kategoriler" REPLACEMENT_RULES_KLASORU = "data/rules/replacement_rules" SYNONYM_RULES_KLASORU = "data/rules/synonym_rules" ADDITION_RULES_KLASORU = "data/rules/addition_rules" CONFIGLIST_KLASORU = "data/rules/configlist" OS_ENV_HF_TOKEN = os.environ.get("HF_TOKEN") def create_ui(): # Ayarları yükle app_config = load_config() # Tema Ayarını Uygula current_theme_name = app_config.get("general_settings", {}).get("theme", "Default") theme_object = None if current_theme_name == "Soft": theme_object = gr.themes.Soft() elif current_theme_name == "Glass": theme_object = gr.themes.Glass() elif current_theme_name == "Monochrome": theme_object = gr.themes.Monochrome() with gr.Blocks(title=get_str("app_title"), css=CSS_STYLES, theme=theme_object) as demo: # Uyarı mesajları if OS_ENV_HF_TOKEN is None or run_joint_classifier is None: gr.Markdown("""
⚠️ **UYARI:** Joint Tagger modeli başlatılamadı veya 'HF_TOKEN' ortam değişkeni ayarlanmamış.
""") if cl_tagger_instance is None or (hasattr(cl_tagger_instance, 'session') and cl_tagger_instance.session is None): gr.Markdown("""
❌ **HATA:** CL Tagger modeli başlatılamadı.
""") # ANA TABS with gr.Tabs() as tabs_ana_panel: # 1. AYARLAR settings_components = create_settings_tab(app_config) # 2. TEKİL ETİKETLEME single_components = create_single_tab(settings_components) # 3. DUAL ETİKETLEME dual_components = create_dual_tab(settings_components) # 4. TOPLU ETİKETLEME batch_components = create_batch_tab(settings_components) # 5. ARAÇLAR tools_components = create_tools_tab(app_config) # --- ANA SEKME KONTROL DÖNGÜSÜ --- def control_tab_switch(): if check_and_reset_tab_switch(): return gr.Tabs(selected="tab_single") return gr.update() main_loop_btn = gr.Button("Main Loop", visible=False, elem_id="main_loop_btn") main_loop_btn.click( fn=control_tab_switch, inputs=[], outputs=[tabs_ana_panel], show_progress="hidden" ) # --- BUTON BAĞLANTILARI --- def transfer_ve_gecis(text): return text, gr.Tabs(selected="tab_kategori_araclari") if "btn_send_tekil" in single_components and "toplu_filtered_output" in single_components: single_components["btn_send_tekil"].click( fn=transfer_ve_gecis, inputs=[single_components["toplu_filtered_output"]], outputs=[tools_components["etiket_input_common"], tabs_ana_panel] ) if "btn_send_toplu" in batch_components and "toplu_batch_combined_original_tags" in batch_components: batch_components["btn_send_toplu"].click( fn=transfer_ve_gecis, inputs=[batch_components["toplu_batch_combined_original_tags"]], outputs=[tools_components["etiket_input_common"], tabs_ana_panel] ) if "btn_send_dual" in dual_components and "dual_combined_all_tags" in dual_components: dual_components["btn_send_dual"].click( fn=transfer_ve_gecis, inputs=[dual_components["dual_combined_all_tags"]], outputs=[tools_components["etiket_input_common"], tabs_ana_panel] ) gr.Markdown( f"

🚀 {get_str('app_title')}

" f"
{get_str('app_subtitle')}
" ) # Default dosya yüklemeleri default_replacement_path = os.path.join(REPLACEMENT_RULES_KLASORU, "varsayilan_degisiklikler.txt") default_synonym_path = os.path.join(SYNONYM_RULES_KLASORU, "varsayilan_birlesimler.txt") default_addition_path = os.path.join(ADDITION_RULES_KLASORU, "varsayilan_eklemeler.txt") demo.load(fn=lambda: read_replacement_file_content(default_replacement_path) if os.path.exists(default_replacement_path) else "", outputs=tools_components["replacement_file_content"]) demo.load(fn=lambda: read_synonym_file_content(default_synonym_path) if os.path.exists(default_synonym_path) else "", outputs=tools_components["synonym_file_content"]) demo.load(fn=lambda: read_addition_file_content(default_addition_path) if os.path.exists(default_addition_path) else "", outputs=tools_components["addition_file_content"]) demo.queue() return demo # ==================== BAŞLANGIÇ ==================== # Klasörleri oluştur folders_to_create = [ KATEGORILER_KLASORU, ALT_KATEGORILER_KLASORU, REPLACEMENT_RULES_KLASORU, SYNONYM_RULES_KLASORU, ADDITION_RULES_KLASORU, CONFIGLIST_KLASORU, "data/configs" ] for folder in folders_to_create: os.makedirs(folder, exist_ok=True) # Varsayılan dosyaları oluştur default_replacement_file_path = os.path.join(REPLACEMENT_RULES_KLASORU, "varsayilan_degisiklikler.txt") if not os.path.exists(default_replacement_file_path): with open(default_replacement_file_path, "w", encoding="utf-8") as f: f.write("# Her satıra bir kural: eski_etiket_regex -> yeni_etiket\n") f.write("# Örnek: blue_hair -> cyan hair\n") default_synonym_file_path = os.path.join(SYNONYM_RULES_KLASORU, "varsayilan_birlesimler.txt") if not os.path.exists(default_synonym_file_path): with open(default_synonym_file_path, "w", encoding="utf-8") as f: f.write("# Her satıra bir kural: ana_etiket: silinecek_es_anlamli_etiket1, silinecek_es_anlamli_etiket2\n") f.write("# Örnek: panties: underwear\n") default_addition_file_path = os.path.join(ADDITION_RULES_KLASORU, "varsayilan_eklemeler.txt") if not os.path.exists(default_addition_file_path): with open(default_addition_file_path, "w", encoding="utf-8") as f: f.write("best quality, masterpiece\n") default_configlist_file_path = os.path.join(CONFIGLIST_KLASORU, "varsayilan_isimler.txt") if not os.path.exists(default_configlist_file_path): with open(default_configlist_file_path, "w", encoding="utf-8") as f: f.write("Güzel_Çiçek\nHarika_Manzara\nGizemli_Sanat\n") # Demo oluştur demo = create_ui() # Başlat if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)