diff --git a/ncmdump.py b/ncmdump.py index 866c83f..2527ae9 100644 --- a/ncmdump.py +++ b/ncmdump.py @@ -14,29 +14,26 @@ 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 validate_name(file_name): + # pattern = r"[\/\\\:\*\?\"\<\>\|]" + # file_name = re.sub(pattern, "_", file_name) + # return file_name + pattern = {u'\\': u'\', u'/': u'/', u':': u':', u'*': u'*', u'?': u'?', u'"': u'"', u'<': u'<', u'>': u'>', u'|': u'|'} + for character in pattern: + file_name = file_name.replace(character, pattern[character]) + return file_name + +# def validate_collision(file_name): +# index = 1 +# while os.path.exists(file_name): +# file_name = '({})'.format(index).join(os.path.splitext(file_name)) +# index += 1 +# return file_name def dump(file_path): - core_key = binascii.a2b_hex("687A4852416D736F356B496E62617857") - meta_key = binascii.a2b_hex("2331346C6A6B5F215C5D2630553C2728") + 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') @@ -89,10 +86,8 @@ def dump(file_path): image_data = f.read(image_size) # media data - # Need to remove special characters in meta_data['musicName'] to make a valid filename - file_name = validate_title(meta_data['artist'][0][0] + ' - ' + meta_data['musicName'] + '.' + meta_data['format']) - # Try if there already a file with same name, if so, modify current filename - file_name = validate_collision(file_name) + file_name = validate_name(','.join([artist[0] for artist in meta_data['artist']]) + ' - ' + meta_data['musicName'] + '.' + meta_data['format']) + # file_name = validate_collision(file_name) music_path = os.path.join(os.path.split(file_path)[0],file_name) m = open(music_path,'wb') @@ -144,8 +139,6 @@ if __name__ == '__main__': 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!')