Browse Source

optimize & drop auto-rename

pull/4/head
Nzix 6 years ago
parent
commit
ad61885347
  1. 45
      ncmdump.py

45
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!')

Loading…
Cancel
Save