127 lines
3.8 KiB
Python
127 lines
3.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
SUPER SIMPLE ASSET ORGANIZER
|
|
Organizira vse slike v pravilne mape - BREZ podmap!
|
|
"""
|
|
|
|
import os
|
|
import shutil
|
|
from pathlib import Path
|
|
|
|
BASE = Path("/Users/davidkotnik/repos/novafarma/assets/slike")
|
|
|
|
# Asset classification rules (by filename patterns)
|
|
CLASSIFICATION = {
|
|
"kai": ["kai_", "kai"],
|
|
"ana": ["ana_", "ana"],
|
|
"gronk": ["gronk", "grok_", "grok"],
|
|
"npcs": ["npc_", "trader", "blacksmith", "healer", "farmer", "elder", "cook"],
|
|
"liki": ["character_", "survivor"],
|
|
|
|
"sovrazniki": ["zombie", "skeleton", "ghost", "mummy", "mutant", "boss", "enemy", "monster"],
|
|
|
|
"zgradbe": ["building_", "house_", "barn_", "tower_", "wall_", "fence_", "gate_"],
|
|
|
|
"rastline": ["plant_", "bush_", "flower_", "grass_", "crop_", "wheat_", "corn_", "tomato_", "carrot_"],
|
|
"drevesa": ["tree_", "oak", "pine", "dead_tree"],
|
|
"semena": ["seed_", "seeds_"],
|
|
|
|
"orozje": ["weapon_"],
|
|
"hladno": ["sword", "axe", "mec_", "sekira_", "melee_"],
|
|
"strelno": ["bow", "arrow", "gun", "lok_", "pistol", "rifle"],
|
|
|
|
"orodja": ["tool_", "hoe", "pickaxe", "watering", "shovel", "motika"],
|
|
|
|
"hrana": ["food_", "bread_", "meat_", "fish_", "cheese_", "apple_"],
|
|
"predmeti": ["item_", "potion_", "coin_", "gem_", "key_"],
|
|
|
|
"ui": ["ui_", "button_", "icon_", "cursor_", "menu_", "bar_", "heart_", "star_"],
|
|
|
|
"voda": ["water_", "ocean_", "river_", "lake_"],
|
|
|
|
"efekti": ["effect_", "smoke_", "fire_", "magic_", "explosion_", "sparkle_"],
|
|
"dim": ["smoke_"],
|
|
|
|
"cutscene": ["cutscene_"],
|
|
"cutscenes": ["scene_"],
|
|
|
|
# Catch-all
|
|
"ostalo": [], # Everything else goes here
|
|
}
|
|
|
|
print("🎯 ORGANIZING ASSETS...")
|
|
print("=" * 70)
|
|
|
|
# Get all PNG files
|
|
all_pngs = list(BASE.rglob("*.png"))
|
|
print(f"📊 Found {len(all_pngs)} PNG files")
|
|
|
|
# Stats
|
|
moved = 0
|
|
skipped = 0
|
|
errors = 0
|
|
|
|
for png_file in all_pngs:
|
|
# Skip if already in correct top-level folder
|
|
parent_name = png_file.parent.name
|
|
if parent_name in CLASSIFICATION.keys():
|
|
# Check if filename matches parent
|
|
filename_lower = png_file.name.lower()
|
|
patterns = CLASSIFICATION.get(parent_name, [])
|
|
|
|
# If parent is "ostalo", skip (catch-all)
|
|
if parent_name == "ostalo":
|
|
skipped += 1
|
|
continue
|
|
|
|
# Check if file matches this category
|
|
matches = any(pattern in filename_lower for pattern in patterns)
|
|
if matches or not patterns: # If no patterns (UI, etc) or matches
|
|
skipped += 1
|
|
continue
|
|
|
|
# Classify file
|
|
filename_lower = png_file.name.lower()
|
|
target_folder = "ostalo" # Default
|
|
|
|
for folder, patterns in CLASSIFICATION.items():
|
|
if folder == "ostalo":
|
|
continue
|
|
for pattern in patterns:
|
|
if pattern in filename_lower:
|
|
target_folder = folder
|
|
break
|
|
if target_folder != "ostalo":
|
|
break
|
|
|
|
# Create target folder if needed
|
|
target_path = BASE / target_folder
|
|
target_path.mkdir(exist_ok=True)
|
|
|
|
# Move file
|
|
dest = target_path / png_file.name
|
|
|
|
# Handle duplicates
|
|
if dest.exists():
|
|
counter = 1
|
|
stem = dest.stem
|
|
suffix = dest.suffix
|
|
while dest.exists():
|
|
dest = target_path / f"{stem}_{counter}{suffix}"
|
|
counter += 1
|
|
|
|
try:
|
|
shutil.move(str(png_file), str(dest))
|
|
moved += 1
|
|
print(f"✅ Moved: {png_file.name} → {target_folder}/")
|
|
except Exception as e:
|
|
errors += 1
|
|
print(f"❌ Error moving {png_file.name}: {e}")
|
|
|
|
print("\n" + "=" * 70)
|
|
print(f"✅ DONE!")
|
|
print(f"📦 Moved: {moved} files")
|
|
print(f"⏭️ Skipped: {skipped} files (already in correct location)")
|
|
print(f"❌ Errors: {errors} files")
|
|
print("\nVse slike so zdaj organizirane v pravilne mape!")
|