# -*- coding: utf-8 -*- """ Created on Sun Jul 15 01:05:58 2018 @author: Nzix """ import binascii import struct import base64 import json import os import re from Crypto.Cipher import AES from mutagen import mp3, flac, id3 # 文件名有效化函数,用于移除曲名中特殊字符从而成功创建文件 def validate_title(title): special_char = r"[\/\\\:\*\?\"\<\>\|]" # '/ \ : * ? " < > |' new_title = re.sub(special_char, "_", title) # 替换为下划线 return new_title # 网易云音乐获取的文件若存在重名情况,一般在文件名后加"(X)",X为数字 # def validate_collision(filename): start_num = 1 ori_filename_no_ext = os.path.splitext(filename)[0] ori_file_ext = os.path.splitext(filename)[-1] while os.path.exists(filename): filename = ori_filename_no_ext + '(' + str(start_num) + ')' + ori_file_ext start_num = start_num + 1 return filename def dump(file_path): 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') # magic header header = f.read(8) assert binascii.b2a_hex(header) == b'4354454e4644414d' # key data f.seek(2, 1) key_length = f.read(4) key_length = struct.unpack(' 1: files = sys.argv[1:] else: files = [file_name for file_name in os.listdir('.') if os.path.splitext(file_name)[-1] == '.ncm'] # 逆序一下防止python将XXX(1)放在XXX之前,导致dump出文件不对应 files.reverse() if not files: print('please input file path!') for file_name in files: try: dump(file_name) print(os.path.split(file_name)[-1]) except Exception as e: print(e) pass