#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Pack Tool - Game Folder Packer (Rich Deluxe Edition ✨)
=========================Furkan Güçlü=============================
PackMaker.exe ile klasörleri pck formatına dönüştürür.
- Renkli ve kullanıcı dostu arayüz
- Log dosyası (pack.log)
- Progress bar + tablo
"""
import argparse
import os
import subprocess
import datetime
from concurrent.futures import ThreadPoolExecutor
from rich.console import Console
from rich.progress import Progress, SpinnerColumn, BarColumn, TimeElapsedColumn
from rich.table import Table
# Rich console
console = Console()
OUTPUT_FOLDER = "../pack"
def log(message: str):
"""Log dosyasına yaz."""
timestamp = datetime.datetime.now().strftime("[%Y-%m-%d %H:%M:%S]")
msg = f"{timestamp} {message}"
with open("pack.log", "a", encoding="utf-8") as f:
f.write(msg + "\n")
def run_pack(folder_name: str, output_folder: str):
"""PackMaker.exe ile paketleme yap."""
try:
subprocess.run(
["PackMaker.exe", "--input", folder_name, "--output", output_folder],
check=True,
stdout=subprocess.DEVNULL,
stderr=subprocess.STDOUT
)
console.print(f"✅ [bold green]Packed[/]: {folder_name}")
log(f"Packed: {folder_name}")
except subprocess.CalledProcessError as e:
console.print(f"❌ [bold red]Error[/]: {folder_name} -> {e}")
log(f"Error packing {folder_name}: {e}")
def pack_folder(folder_path: str, output_folder: str):
"""Tek klasör paketle."""
folder_name = os.path.basename(folder_path)
if not os.path.exists(folder_path):
console.print(f"⚠️ [yellow]Folder not found[/]: {folder_name}")
log(f"Folder not found: {folder_name}")
return
console.print(f"📦 [cyan]Packing[/]: {folder_name}")
run_pack(folder_name, output_folder)
def print_help():
"""Rich tablo ile özel yardım mesajı göster."""
table = Table(title="📦 Pack Tool Yardım", show_header=True, header_style="bold cyan")
table.add_column("Parametre", style="bold")
table.add_column("Açıklama")
table.add_row("folder_name", "Paketlenecek klasör adı")
table.add_row("--all", "Tüm klasörleri paketle")
table.add_row("--ignore [klasörler]", "Yok sayılacak klasörleri belirt")
table.add_row("--output [klasör]", "Çıkış klasörü yolu")
table.add_row("-h, --help", "Yardım mesajını göster")
console.print(table)
def pack_all_folders(ignore_list, output_folder: str):
"""Tüm klasörleri paketle (progress bar ile)."""
all_folders = [
f for f in os.listdir()
if os.path.isdir(f) and f not in ignore_list
]
if not all_folders:
console.print("[red]Hiç klasör bulunamadı![/]")
return
table = Table(title="📂 Klasör Listesi", show_header=True, header_style="bold magenta")
table.add_column("No", justify="center")
table.add_column("Klasör Adı", justify="left")
for i, f in enumerate(all_folders, 1):
table.add_row(str(i), f)
console.print(table)
with Progress(
SpinnerColumn(),
"[progress.description]{task.description}",
BarColumn(),
TimeElapsedColumn(),
console=console,
) as progress:
task = progress.add_task("Packing folders...", total=len(all_folders))
with ThreadPoolExecutor() as executor:
for f in all_folders:
executor.submit(pack_folder, f, output_folder)
progress.advance(task)
def main():
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("folder_name", nargs="?", help="Paketlenecek klasör adı")
parser.add_argument("--all", action="store_true", help="Tüm klasörleri paketle")
parser.add_argument("--ignore", nargs="+", default=[], help="Yok sayılacak klasörler")
parser.add_argument("--output", default=OUTPUT_FOLDER, help="Çıkış klasörü yolu")
parser.add_argument("-h", "--help", action="store_true", help="Yardım mesajını göster")
args = parser.parse_args()
if args.help:
print_help()
return
if not os.path.exists(args.output):
os.makedirs(args.output)
console.print("\n[bold magenta]🚀 Pack Tool Başlıyor![/]\n")
if args.all:
pack_all_folders(set(args.ignore), args.output)
elif args.folder_name:
folder_path = os.path.abspath(args.folder_name)
pack_folder(folder_path, args.output)
else:
print_help()
console.print("\n[bold green]🎉 İşlem tamamlandı![/]\n")
if __name__ == "__main__":
main()