#!/usr/bin/env python3 """ SMART MASS RENAME SYSTEM - Vse 18,154 slik Inteligentno preimenovanje na osnovi vsebine in konteksta """ import os import re import json from pathlib import Path from collections import defaultdict PROJECT_ROOT = Path("/Users/davidkotnik/repos/novafarma") # Slovar angleških ključnih besed → slovenske TRANSLATIONS = { # Rastline 'apple': 'jablana', 'cherry': 'visnja', 'orange': 'pomaranča', 'pear': 'hruška', 'peach': 'breskev', 'plum': 'sliva', 'berry': 'jagoda', 'grape': 'grozdje', 'tree': 'drevo', 'sapling': 'sadika', 'young': 'mlado', 'mature': 'zrelo', 'old': 'staro', # Sezone 'spring': 'pomlad', 'summer': 'poletje', 'autumn': 'jesen', 'fall': 'jesen', 'winter': 'zima', # Zelenjava 'carrot': 'korenje', 'potato': 'krompir', 'tomato': 'paradiznik', 'lettuce': 'solata', 'corn': 'koruza', 'pumpkin': 'buca', 'onion': 'cebula', 'pepper': 'paprika', 'strawberry': 'jagoda', 'cannabis': 'konoplja', 'indica': 'indica', # Živali 'cow': 'krava', 'pig': 'prasic', 'sheep': 'ovca', 'chicken': 'kura', 'horse': 'konj', 'dog': 'pes', 'cat': 'macka', 'rabbit': 'zajec', 'duck': 'raca', 'goat': 'koza', # Sovražniki/NPCji 'zombie': 'zombi', 'ghost': 'duh', 'skeleton': 'okostnjak', 'monster': 'pošast', 'enemy': 'sovraznik', 'boss': 'boss', 'npc': 'lik', 'character': 'lik', # Akcije/Smeri 'idle': 'mirovanje', 'walk': 'hoja', 'run': 'tek', 'action': 'akcija', 'attack': 'napad', 'north': 'sever', 'south': 'jug', 'east': 'vzhod', 'west': 'zahod', 'portrait': 'portret', # UI 'button': 'gumb', 'icon': 'ikona', 'frame': 'okvir', 'health': 'zdravje', 'menu': 'meni', 'panel': 'panel', # Stavbe 'building': 'stavba', 'house': 'hisa', 'barn': 'hlev', 'church': 'cerkev', 'school': 'sola', 'museum': 'muzej', 'cemetery': 'pokopališce', # Orodja 'tool': 'orodje', 'axe': 'sekira', 'pickaxe': 'kramp', 'hoe': 'motika', 'sword': 'meč', 'weapon': 'orožje', 'bucket': 'vedro', # Materiali 'wood': 'les', 'stone': 'kamen', 'iron': 'železo', 'gold': 'zlato', 'diamond': 'diamant', 'steel': 'jeklo', # Ostalo 'seed': 'seme', 'crop': 'pridelek', 'blueprint': 'nacrt', 'item': 'predmet', 'prop': 'rekvizit', 'ground': 'tla', 'grass': 'trava', 'dirt': 'zemlja', 'water': 'voda', 'campfire': 'tabor', 'tent': 'šotor', 'grave': 'grob', 'cross': 'križ', } def intelligent_translate(filename): """Pametno prevede angleško ime v slovensko""" # Odstrani številke in podčrtaje name = filename.lower() name = re.sub(r'_\d+$', '', name) # Odstrani trailing numbers name = re.sub(r'\d{10,}', '', name) # Odstrani timestamps # Razdeli na besede words = re.split(r'[_\-\s]+', name) # Prevedi vsako besedo translated = [] for word in words: if word in TRANSLATIONS: translated.append(TRANSLATIONS[word]) elif word and not word.isdigit(): # Obdrži besedo če ni v slovarju in ni številka translated.append(word) # Sestavi novo ime if translated: return '_'.join(translated) else: return filename def generate_rename_map(): """Generira rename map za vse slike""" print("🔍 ZBIRAM SLIKE...") # Naloži inventory with open(PROJECT_ROOT / "image_inventory.json", 'r', encoding='utf-8') as f: inventory = json.load(f) rename_map = {} statistics = { 'total': 0, 'renamed': 0, 'skipped': 0, 'by_folder': {} } print("\n🔄 GENERIRAM NOVA IMENA...\n") for folder, data in inventory['folders'].items(): folder_stats = {'renamed': 0, 'skipped': 0} for img_name in data['images']: statistics['total'] += 1 # Originalna pot old_path = str(Path(folder) / img_name) # Novi ime (samo filename, ne pot) ext = Path(img_name).suffix name_without_ext = Path(img_name).stem # Inteligentni prevod new_name = intelligent_translate(name_without_ext) # Preveri če je ime drugačno if new_name != name_without_ext: # Dodaj extension new_filename = new_name + ext # Full path new_path = str(Path(folder) / new_filename) rename_map[old_path] = new_path folder_stats['renamed'] += 1 statistics['renamed'] += 1 else: folder_stats['skipped'] += 1 statistics['skipped'] += 1 statistics['by_folder'][folder] = folder_stats if folder_stats['renamed'] > 0: print(f"✅ {folder}: {folder_stats['renamed']} preimenovanj") # Shrani rename map map_file = PROJECT_ROOT / "rename_map.json" with open(map_file, 'w', encoding='utf-8') as f: json.dump(rename_map, f, indent=2, ensure_ascii=False) # Shrani statistiko stats_file = PROJECT_ROOT / "rename_statistics.json" with open(stats_file, 'w', encoding='utf-8') as f: json.dump(statistics, f, indent=2, ensure_ascii=False) print("\n" + "=" * 80) print("📊 STATISTIKA:") print("=" * 80) print(f"Skupaj slik: {statistics['total']}") print(f"Preimenovanih: {statistics['renamed']}") print(f"Preskočenih (že OK): {statistics['skipped']}") print("=" * 80) print(f"\n✅ Rename map shranjen: rename_map.json") print(f"✅ Statistika shranjena: rename_statistics.json") return rename_map, statistics def execute_rename(dry_run=True): """Izvede preimenovanje""" # Naloži rename map with open(PROJECT_ROOT / "rename_map.json", 'r', encoding='utf-8') as f: rename_map = json.load(f) if dry_run: print("\n🔍 DRY RUN - Samo preverjam, brez dejanskega preimenovanja") else: print("\n⚠️ IZVAJAM PREIMENOVANJE...") success = 0 errors = [] for old_rel, new_rel in rename_map.items(): old_path = PROJECT_ROOT / old_rel new_path = PROJECT_ROOT / new_rel if not old_path.exists(): errors.append(f"❌ Ne najdem: {old_rel}") continue if new_path.exists() and new_path != old_path: errors.append(f"⚠️ Že obstaja: {new_rel}") continue if not dry_run: try: old_path.rename(new_path) success += 1 except Exception as e: errors.append(f"❌ Napaka pri {old_rel}: {e}") else: success += 1 print(f"\n✅ Uspešno: {success}/{len(rename_map)}") if errors: print(f"\n⚠️ Napak/Opozoril: {len(errors)}") if len(errors) <= 20: for err in errors: print(f" {err}") return success, errors if __name__ == "__main__": print("=" * 80) print(" SMART MASS RENAME SYSTEM") print("=" * 80) # Generiraj rename map rename_map, stats = generate_rename_map() print("\n📝 PRIPRAVLJENO ZA PREIMENOVANJE!") print(f" Preimenovalo se bo {stats['renamed']} slik") print("\n💡 NASLEDNJI KORAK:") print(" 1. Preveri rename_map.json (ali so imena OK)") print(" 2. Zaženi: python3 smart_mass_rename.py --execute") print(" (to bo dejansko preimenovalo datoteke)")