import json
import os
import subprocess
import shutil
CDN_PREFIX = "https://dik52o19344s2.cloudfront.net/king/prod/66b9705e-297a-4c5f-8dbf-fdd19e0f17db/"
VALID_SUFFIXES = ('.basis', '.json', '.atlas.txt')
JSON_PATH = r"C:\Users\username\Downloads\config.json"
DOWNLOAD_DIR = "resdownload/zzmw"
TEMP_DIR = os.path.join(DOWNLOAD_DIR, "temp")
BASISU_EXE = "basisu.exe"
os.makedirs(DOWNLOAD_DIR, exist_ok=True)
file_map = {}
def basis_to_png(basis_path):
basename = os.path.splitext(os.path.basename(basis_path))[0]
if os.path.exists(TEMP_DIR):
shutil.rmtree(TEMP_DIR)
os.makedirs(TEMP_DIR, exist_ok=True)
temp_basis_path = os.path.join(TEMP_DIR, os.path.basename(basis_path))
shutil.copy(basis_path, temp_basis_path)
result = subprocess.run([os.path.abspath(BASISU_EXE), "-file", os.path.basename(temp_basis_path)], cwd=TEMP_DIR)
if result.returncode != 0:
print(f"[!] basisu解码失败: {basis_path}")
return False
candidates = [
f"{basename}_unpacked_rgba_RGBA32_0_0000.png",
f"{basename}_unpacked_rgb_RGBA32_0_0000.png",
f"{basename}_unpacked_rgba_BC7_RGBA_0000.png",
f"{basename}_unpacked_rgb_BC7_RGBA_0000.png",
]
for png_file in candidates:
temp_png_path = os.path.join(TEMP_DIR, png_file)
if os.path.exists(temp_png_path):
final_png_path = os.path.join(DOWNLOAD_DIR, f"{basename}.png")
shutil.move(temp_png_path, final_png_path)
print(f"[+] 转换成功: {basis_path} → {final_png_path}")
shutil.rmtree(TEMP_DIR)
return True
print(f"[!] 没找到有效PNG: {basis_path}")
shutil.rmtree(TEMP_DIR)
return False
def getpngmain():
for f in os.listdir(DOWNLOAD_DIR):
if f.endswith(".basis"):
full_path = os.path.join(DOWNLOAD_DIR, f)
if basis_to_png(full_path):
try:
os.remove(full_path)
print(f"[+] 删除原文件: {full_path}")
except Exception as e:
print(f"删除原文件失败: {full_path} - {e}")
def organize_files_by_prefix(spine_prefixes):
for prefix in spine_prefixes:
folder_path = os.path.join(DOWNLOAD_DIR, prefix)
os.makedirs(folder_path, exist_ok=True)
for f in os.listdir(DOWNLOAD_DIR):
if f == prefix:
continue
if f.startswith(prefix) and os.path.isfile(os.path.join(DOWNLOAD_DIR, f)):
src = os.path.join(DOWNLOAD_DIR, f)
dst = os.path.join(folder_path, f)
shutil.move(src, dst)
print(f"[+] 移动: {f} → {folder_path}")
def rename_atlas_txt():
for f in os.listdir(DOWNLOAD_DIR):
if f.endswith(".atlas.txt"):
old_path = os.path.join(DOWNLOAD_DIR, f)
new_name = f[:-4]
new_path = os.path.join(DOWNLOAD_DIR, new_name)
os.rename(old_path, new_path)
print(f"[+] 重命名: {f} → {new_name}")
with open(JSON_PATH, "r", encoding="utf-8") as f:
data = json.load(f)
assets = data.get("assets", {})
for asset_id, asset_info in assets.items():
file_info = asset_info.get("file")
if not file_info:
continue
url = None
filename = None
basis_variant = file_info.get("variants", {}).get("basis")
if basis_variant:
filename = basis_variant.get("filename")
url = basis_variant.get("url")
if not url or not filename:
filename = file_info.get("filename")
url = file_info.get("url")
if not filename or not url:
continue
if not filename.endswith(VALID_SUFFIXES):
continue
full_url = CDN_PREFIX + url
file_map[filename] = full_url
with open("zzmw.txt", "w", encoding="utf-8") as out_file:
for fname, url in file_map.items():
if fname.endswith(".json"):
out_file.write(f"{url}\n out={fname}\n\n")
os.system(f"aria2c -i zzmw.txt -j 16 -s 16 -x 16 --check-certificate=false --dir={DOWNLOAD_DIR}")
spine_prefixes = set()
for fname in os.listdir(DOWNLOAD_DIR):
if fname.endswith(".json"):
fpath = os.path.join(DOWNLOAD_DIR, fname)
try:
with open(fpath, "r", encoding="utf-8") as f:
j = json.load(f)
if "skeleton" in j and isinstance(j["skeleton"], dict) and "spine" in j["skeleton"]:
name_prefix = os.path.splitext(fname)[0]
spine_prefixes.add(name_prefix)
else:
os.remove(fpath)
except Exception:
os.remove(fpath)
with open("zzmw.txt", "w", encoding="utf-8") as out_file:
for fname, url in file_map.items():
if fname.endswith(".json"):
continue
for prefix in spine_prefixes:
if fname.startswith(prefix):
out_file.write(f"{url}\n out={fname}\n\n")
break
os.system(f"aria2c -i zzmw.txt -j 32 -s 16 -x 16 --check-certificate=false --dir={DOWNLOAD_DIR}")
getpngmain()
rename_atlas_txt()
organize_files_by_prefix(spine_prefixes)
目前的几个问题
1.png解码速度太慢
2.png背景非透明导致spine还原画面影响严重