Ero-Lab 预告游戏 转职魔王X 相关问题

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还原画面影响严重