ultrapro-tagger / modules /tools_renaming.py
Hydragee's picture
Upload folder using huggingface_hub
772b344 verified
import os
import shutil
import random
import gradio as gr
from modules.utils.file_utils import _get_all_image_paths
def apply_renaming_from_configlist(progress=gr.Progress(), folder_paths_str="", configlist_file="", renaming_type="Rastgele"):
"""Liste dosyasından rastgele isim seçip dosyaları adlandırır."""
folder_paths = [p.strip() for p in folder_paths_str.split('\n') if p.strip()]
if not folder_paths: return "⚠️ Klasör yolu girin.", gr.update(value="⚠️ İptal.", visible=True)
if not configlist_file or not os.path.exists(configlist_file): return "❌ Liste dosyası seçilmedi.", gr.update(value="❌ Hata.", visible=True)
try:
with open(configlist_file, 'r', encoding='utf-8') as f: name_list = [line.strip() for line in f if line.strip()]
except Exception as e: return f"❌ Dosya okuma hatası: {e}", gr.update(value="❌ Hata.", visible=True)
if not name_list: return "⚠️ Liste boş.", gr.update(value="⚠️ İptal.", visible=True)
output_messages = ["ℹ️ Liste bazlı adlandırma başladı."]
renamed_count = 0
all_image_paths = _get_all_image_paths(folder_paths)
total = len(all_image_paths)
if total == 0: return "⚠️ Resim bulunamadı.", gr.update(value="⚠️ Resim Yok.", visible=True)
# İsim listesini karıştır (Rastgele mod ise)
if renaming_type == "Rastgele": random.shuffle(name_list)
# Yeterli isim var mı?
if len(name_list) < total: output_messages.append("⚠️ Uyarı: İsim listesi dosya sayısından az, bazıları tekrar edebilir veya işlenmeyebilir.")
for i, file_path in enumerate(all_image_paths):
if i >= len(name_list): break # İsim bitti
filename = os.path.basename(file_path)
progress((i / total), desc=f"Adlandırılıyor: {filename}")
ext = os.path.splitext(filename)[1]
new_base = name_list[i].replace(' ', '_').replace(',', '_')
new_name = f"{new_base}{ext}"
new_path = os.path.join(os.path.dirname(file_path), new_name)
if file_path != new_path:
try:
shutil.move(file_path, new_path)
renamed_count += 1
except Exception as e: output_messages.append(f"❌ Hata ({filename}): {e}")
return "\n".join(output_messages), gr.update(value=f"✅ {renamed_count} dosya adlandırıldı.", visible=True)
def apply_custom_renaming(progress=gr.Progress(), folder_paths_str: str="", pattern: str="", start_number: int=1, digit_count: int=3):
"""
Dosyaları şablon + numara mantığıyla adlandırır.
Pattern içinde {Number} olmalıdır. Örn: "Adoptable {Number}"
"""
folder_paths = [p.strip() for p in folder_paths_str.split('\n') if p.strip()]
if not folder_paths: return "⚠️ Klasör yolu girin.", gr.update(value="⚠️ İptal.", visible=True)
if not pattern or "{Number}" not in pattern: return "❌ Şablon '{Number}' içermelidir!", gr.update(value="❌ Hatalı Şablon.", visible=True)
renamed_count = 0
curr_num = int(start_number)
output_messages = [f"ℹ️ Şablonlu adlandırma: '{pattern}', Başlangıç: {curr_num}"]
# Her klasör için ayrı işlem (Sıralamayı korumak için)
for folder in folder_paths:
if not os.path.isdir(folder): continue
images = [f for f in os.listdir(folder) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp'))]
images.sort() # İsme göre sırala
if not images: continue
for i, img_name in enumerate(images):
progress(0, desc=f"Adlandırılıyor: {img_name}") # Basit progress
ext = os.path.splitext(img_name)[1]
num_str = str(curr_num).zfill(int(digit_count))
new_base = pattern.replace("{Number}", num_str).strip()
new_name = f"{new_base}{ext}"
old_path = os.path.join(folder, img_name)
new_path = os.path.join(folder, new_name)
if old_path != new_path:
try:
if os.path.exists(new_path) and old_path.lower() != new_path.lower():
output_messages.append(f"⚠️ Çakışma: '{new_name}' zaten var. Atlandı.")
else:
shutil.move(old_path, new_path)
renamed_count += 1
except Exception as e: output_messages.append(f"❌ Hata ({img_name}): {e}")
curr_num += 1
return "\n".join(output_messages), gr.update(value=f"✅ {renamed_count} dosya adlandırıldı. Son No: {curr_num-1}", visible=True)