#!/usr/bin/env python3 import os import sys import json import hashlib import argparse CHUNK_SIZE = 1024 * 1024 # 1 MB def compute_sha1(path): """Spočítá SHA1 hash souboru.""" h = hashlib.sha1() with open(path, "rb") as f: while True: chunk = f.read(CHUNK_SIZE) if not chunk: break h.update(chunk) return h.hexdigest() def generate_manifest(root_dir, base_url, version, output_path): root_dir = os.path.abspath(root_dir) files = [] for dirpath, dirnames, filenames in os.walk(root_dir): # ignoruj klasické bordely dirnames[:] = [ d for d in dirnames if d not in (".git", ".svn", "__pycache__", ".idea", ".vs") ] for filename in filenames: full_path = os.path.join(dirpath, filename) rel_path = os.path.relpath(full_path, root_dir) # relativní cesty v manifestu vždy s '/' rel_path = rel_path.replace(os.sep, "/") # manifest.json sám sebe přeskoč if rel_path == "manifest.json": continue size = os.path.getsize(full_path) sha1 = compute_sha1(full_path) files.append({ "path": rel_path, "size": size, "sha1": sha1, }) manifest = { "version": version, "base_url": base_url.rstrip("/") + "/", # vždy zakončit '/' "files": files, } with open(output_path, "w", encoding="utf-8") as f: json.dump(manifest, f, indent=2, ensure_ascii=False) print(f"Manifest hotový: {output_path}") print(f"Počet souborů: {len(files)}") def main(): parser = argparse.ArgumentParser( description="Vygeneruje manifest.json pro WoW klienta." ) parser.add_argument( "root_dir", help="Kořenový adresář hry (tam kde je Data/, Wow.exe, atd.)" ) parser.add_argument( "--base-url", required=True, help="Base URL, odkud to bude klient stahovat, např. https://ftp.chochrun.eu/wow/" ) parser.add_argument( "--version", default="0.1", help="Verze manifestu (string, jen info). Default: 0.1" ) parser.add_argument( "-o", "--output", help="Kam zapsat manifest.json (default: root_dir/manifest.json)" ) args = parser.parse_args() root_dir = args.root_dir output_path = args.output or os.path.join(root_dir, "manifest.json") if not os.path.isdir(root_dir): print(f"Chyba: '{root_dir}' není adresář.", file=sys.stderr) sys.exit(1) generate_manifest(root_dir, args.base_url, args.version, output_path) if __name__ == "__main__": main()