Files
novafarma/scripts/utils/smart_mass_rename.py
2026-01-25 12:20:50 +01:00

297 lines
7.8 KiB
Python

#!/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)")