diff --git a/ncmTranslatorScript_python/README.md b/ncmTranslatorScript_python/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ncmTranslatorScript_python/README.md @@ -0,0 +1 @@ + diff --git a/ncmTranslatorScript_python/ncmTranslator.py b/ncmTranslatorScript_python/ncmTranslator.py new file mode 100644 index 0000000..cd92a8c --- /dev/null +++ b/ncmTranslatorScript_python/ncmTranslator.py @@ -0,0 +1,149 @@ +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) + + start_time = time.time() + print('开始处理 ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + + 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() + # ✅ 在进度条上方显示文件名称 + tqdm.write(f"转码完成: {result_path}") + except Exception as e: + logging.exception("转码任务出错", exc_info=e) + finally: + pbar.update(1) + + end_time = time.time() + print('全部文件处理完成 ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + print('处理时间:', end_time - start_time) diff --git a/ncmTranslatorScript_python/requirements.txt b/ncmTranslatorScript_python/requirements.txt new file mode 100644 index 0000000..1934a9c --- /dev/null +++ b/ncmTranslatorScript_python/requirements.txt @@ -0,0 +1,2 @@ +pycryptodome>=3.20.0 +tqdm>=4.66.0