From d7d409ebe61f699325a203d3fd707c367f107293 Mon Sep 17 00:00:00 2001 From: yulinling <2712495353@qq.com> Date: Mon, 4 Aug 2025 22:13:58 +0800 Subject: [PATCH] init commint --- ncmTranslator.py | 162 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 ncmTranslator.py diff --git a/ncmTranslator.py b/ncmTranslator.py new file mode 100644 index 0000000..6d14847 --- /dev/null +++ b/ncmTranslator.py @@ -0,0 +1,162 @@ +import base64 +import binascii +import json +import logging +import os +import struct +import sys +import time +import urllib +import urllib +import requests +from os import fspath +from pathlib import Path + +from Crypto.Cipher import AES + +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 type(s[-1]) == int else ord(s[-1]))] + f = open(file_path, 'rb') + header = f.read(8) + assert binascii.b2a_hex(header) == b'4354454e4644414d' + f.seek(2, 1) + key_length = f.read(4) + key_length = struct.unpack('= key_length: key_offset = 0 + key_box[i] = key_box[c] + key_box[c] = swap + last_byte = c + meta_length = f.read(4) + meta_length = struct.unpack('>>>>>>>>>>>>>> 非ncm文件, 跳过') + return + if file_exist(file_name, file_list, root_dir): + print(full_file + '>>>>>>>>>>>>>>> 同名文件跳过') + return + try: + print(full_file + '>>>>>>>>>>>>>>> 开始转码文件') + dump(full_file, file_no_extension(file_name)) + print(full_file + '>>>>>>>>>>>>>>> 转码文件成功' ) + except Exception as err: + print('转码文件失败: ' + full_file + ' error: ' + err) + elif os.path.isdir(full_file): + print('>>>>>>>>>>>>>>> 处理当前文件夹内容: ' + full_file) + list = os.listdir(full_file) + for i in range(0, len(list)): + recursion(list[i], full_file, list) + + +if __name__ == '__main__': + + if len(sys.argv) > 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())) + + # 获取rootdir的所有文件名称 + file_list = os.listdir(rootdir) + for i in range(0, len(file_list)): + try: + recursion(file_list[i], rootdir, file_list) + except Exception as e: + print('递归处理出现错误') + logging.exception(e) + + end_time = time.time() + print('全部文件处理完成 ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + print('处理时间:', end_time - start_time)