297 lines
7.8 KiB
Python
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)")
|