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)