@ -10,9 +10,29 @@ import struct
import base64
import base64
import json
import json
import os
import os
import re
from Crypto . Cipher import AES
from Crypto . Cipher import AES
from mutagen import mp3 , flac , id3
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 ) :
def dump ( file_path ) :
core_key = binascii . a2b_hex ( " 687A4852416D736F356B496E62617857 " )
core_key = binascii . a2b_hex ( " 687A4852416D736F356B496E62617857 " )
@ -69,7 +89,11 @@ def dump(file_path):
image_data = f . read ( image_size )
image_data = f . read ( image_size )
# media data
# media data
file_name = meta_data [ ' artist ' ] [ 0 ] [ 0 ] + ' - ' + meta_data [ ' musicName ' ] + ' . ' + meta_data [ ' format ' ]
# 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 )
music_path = os . path . join ( os . path . split ( file_path ) [ 0 ] , file_name )
music_path = os . path . join ( os . path . split ( file_path ) [ 0 ] , file_name )
m = open ( music_path , ' wb ' )
m = open ( music_path , ' wb ' )
@ -120,6 +144,8 @@ if __name__ == '__main__':
files = sys . argv [ 1 : ]
files = sys . argv [ 1 : ]
else :
else :
files = [ file_name for file_name in os . listdir ( ' . ' ) if os . path . splitext ( file_name ) [ - 1 ] == ' .ncm ' ]
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 :
if not files :
print ( ' please input file path! ' )
print ( ' please input file path! ' )