import os import shutil from PIL import Image # Configuration SOURCE_ROOT = "." DEST_LIB = "src/assets/library" EXCLUDE_DIRS = {".git", "node_modules", "src", ".agent", ".vscode"} # Don't scan inside src (destination is in src), but we want to scan other folders # We specifically want to target 'godot', 'backups', 'generated', etc. # We will SKIP 'assets' to prevent breaking the currently running game logic until confirmed. SKIP_GAME_ASSETS = True GAME_ASSETS_DIR = "assets" def manage_assets(): if not os.path.exists(DEST_LIB): os.makedirs(DEST_LIB) total_images = 0 size_256 = 0 size_1024 = 0 moved_count = 0 locations = {} print(f"šŸš€ Starting Asset Audit & Consolidation...") print(f"šŸ“‚ Target Library: {DEST_LIB}") for root, dirs, files in os.walk(SOURCE_ROOT): # Exclude directories dirs[:] = [d for d in dirs if d not in EXCLUDE_DIRS and not d.startswith('.')] # Avoid recursion into destination if os.path.abspath(root).startswith(os.path.abspath(DEST_LIB)): continue # Check if we are in the 'assets' folder (Game root) in_game_assets = root.startswith("./assets") or root == "./assets" or root.startswith("assets") for file in files: if file.lower().endswith(('.png', '.jpg', '.jpeg')): src_path = os.path.join(root, file) try: with Image.open(src_path) as img: width, height = img.size total_images += 1 if width == 256 and height == 256: size_256 += 1 elif width == 1024 and height == 1024: size_1024 += 1 # Record location stats folder = os.path.dirname(src_path) if folder not in locations: locations[folder] = 0 locations[folder] += 1 # MOVE LOGIC # If it's NOT in the official assets folder (and we are skipping it), move it. should_move = True if SKIP_GAME_ASSETS and in_game_assets: should_move = False # Also don't move if it's already in src (but we excluded src in walk, so handled) # Wait, we excluded 'src' in dirs, so we won't find anything there. # What if there are images in src/scenes/img? # User said "premakni ... v src/assets/library". if should_move: # Calculate relative path to maintain structure # e.g. godot/ostalo/img.png -> src/assets/library/godot/ostalo/img.png rel_path = os.path.relpath(src_path, SOURCE_ROOT) dest_path = os.path.join(DEST_LIB, rel_path) dest_dir = os.path.dirname(dest_path) if not os.path.exists(dest_dir): os.makedirs(dest_dir) shutil.move(src_path, dest_path) moved_count += 1 # print(f"Moved: {rel_path}") except Exception as e: print(f"āš ļø Error reading {src_path}: {e}") print("\n" + "="*40) print(f"šŸ“Š AUDIT REPORT") print("="*40) print(f"Total Images Found: {total_images}") print(f"Moved to Library: {moved_count}") print(f"Kept in Game Assets: {total_images - moved_count}") print("-" * 20) print(f"šŸ“ SIZE STATUS:") print(f" - 256x256 (Optimized): {size_256}") print(f" - 1024x1024 (High-Res): {size_1024}") print(f" - Other Dimensions: {total_images - size_256 - size_1024}") print("="*40) print("\nšŸ“‚ MAIN LOCATIONS (Before Move):") sorted_locs = sorted(locations.items(), key=lambda item: item[1], reverse=True)[:10] for loc, count in sorted_locs: print(f" - {loc}: {count} images") if __name__ == "__main__": manage_assets()