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)