import base64 import binascii import json import logging import os import struct import sys import time import urllib.request from os import fspath from pathlib import Path from concurrent.futures import ThreadPoolExecutor, as_completed from Crypto.Cipher import AES from tqdm import tqdm music_suffix_list = ['mp3', 'wav', 'ape', 'flac', 'MP3', 'WAV', 'APE', 'FLAC'] # 进行ncm解码 def dump(file_path, file_name_no_suffix): core_key = binascii.a2b_hex("687A4852416D736F356B496E62617857") meta_key = binascii.a2b_hex("2331346C6A6B5F215C5D2630553C2728") unpad = lambda s: s[0:-(s[-1] if isinstance(s[-1], int) else ord(s[-1]))] with open(file_path, 'rb') as f: header = f.read(8) assert binascii.b2a_hex(header) == b'4354454e4644414d' f.seek(2, 1) key_length = struct.unpack(' 1: rootdir = sys.argv[1] else: rootdir = fspath(Path(__file__).parent.resolve()) print('当前需要处理的文件夹路径: ' + rootdir) file_list = os.listdir(rootdir) tasks = [] for file in file_list: recursion(file, rootdir, file_list, tasks) total = len(tasks) print(f"共找到 {total} 个待转码文件") with ThreadPoolExecutor(max_workers=os.cpu_count() or 4) as executor: futures = {executor.submit(dump, file_path, no_suffix): file_path for file_path, no_suffix in tasks} with tqdm(total=total, desc="正在转码", unit="file") as pbar: for future in as_completed(futures): try: result_path = future.result() except Exception as e: logging.exception("转码任务出错", exc_info=e) finally: pbar.update(1)