ultrapro-tagger / app.py
Hydragee's picture
Upload app.py with huggingface_hub
ba5408b verified
# 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("""<div style='background-color:#fff3cd; color:#856404; padding:10px; border-radius:8px; border:1px solid #ffeeba; margin-bottom: 20px;'>⚠️ **UYARI:** Joint Tagger modeli başlatılamadı veya 'HF_TOKEN' ortam değişkeni ayarlanmamış.</div>""")
if cl_tagger_instance is None or (hasattr(cl_tagger_instance, 'session') and cl_tagger_instance.session is None):
gr.Markdown("""<div style='background-color:#f8d7da; color:#721c24; padding:10px; border-radius:8px; border:1px solid #f5c6cb; margin-bottom: 20px;'>❌ **HATA:** CL Tagger modeli başlatılamadı.</div>""")
# 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"<h1 style='text-align: center; color: #4a00e0; margin-bottom: 5px; font-size: 1.5em; font-weight: 700; text-shadow: 1px 1px 2px rgba(0,0,0,0.1);'>🚀 {get_str('app_title')}</h1>"
f"<div style='text-align: center; color: #555; font-size: 0.9em;'>{get_str('app_subtitle')}</div>"
)
# 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)