From 4e1b876556860222eb673696567af5a15f170d22 Mon Sep 17 00:00:00 2001 From: Nzix Date: Sun, 12 Aug 2018 11:42:01 +0800 Subject: [PATCH] media tag processing #1 --- README.md | 10 +++++++--- ncmdump.py | 49 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0ee8d87..b48ae83 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,20 @@ ## 简介 -早就在算计网易云ncm文件,不过一直没什么机会,前些天突然看到已经有大佬 [anonymous5l/ncmdump ](https://github.com/anonymous5l/ncmdump)实现了,因为好奇加密算法就用Python移植了下,啊大佬不愧是大佬,感激!测试发现转换出来的媒体文件都已包含媒体信息,故未再实现原repo中的写tag操作。还有Python实现比C++慢不少。仅供学习交流,请勿传播扩散。用Python处理字节真让人头大emmm - +感激大佬的 [anonymous5l/ncmdump ](https://github.com/anonymous5l/ncmdump)项目,因好奇加密算法就用Python移植了下。自测发现转换出来的媒体文件都已包含媒体信息(包括专辑封面),~~故未再实现原repo中的写tag操作~~,应issue要求还是补上了写tag操作。Python实现比C++慢不少,实用性不大,仅供学习交流,请勿传播扩散。 ## 依赖 ``` -pip(3) install pycrypto +pip(3) install pycrypto mutagen ``` ## 使用 +指定ncm文件 ``` python(3) ncmdump.py [files ...] +``` +工作目录下所有ncm文件 +``` +python(3) ncmdump.py ``` \ No newline at end of file diff --git a/ncmdump.py b/ncmdump.py index 4a6e614..148024e 100644 --- a/ncmdump.py +++ b/ncmdump.py @@ -11,6 +11,7 @@ import base64 import json import os from Crypto.Cipher import AES +from mutagen import mp3, flac, id3 def dump(file_path): @@ -69,9 +70,9 @@ def dump(file_path): # media data file_name = meta_data['artist'][0][0] + ' - ' + meta_data['musicName'] + '.' + meta_data['format'] - m = open(os.path.join(os.path.split(file_path)[0],file_name),'wb') + music_path = os.path.join(os.path.split(file_path)[0],file_name) + m = open(music_path,'wb') - chunk = bytearray() while True: chunk = bytearray(f.read(0x8000)) chunk_length = len(chunk) @@ -87,13 +88,47 @@ def dump(file_path): m.close() f.close() + # media tag + if meta_data['format'] == 'flac': + audio = flac.FLAC(music_path) + audio.delete() + image = flac.Picture() + image.type = 3 + image.mime = 'image/jpeg' + image.data = image_data + audio.clear_pictures() + audio.add_picture(image) + elif meta_data['format'] == 'mp3': + audio = mp3.MP3(music_path) + audio.delete() + image = id3.APIC() + image.type = 3 + image.mime = 'image/jpeg' + image.data = image_data + audio.tags.add(image) + audio.save() + audio = mp3.EasyMP3(music_path) + + audio['title'] = meta_data['musicName'] + audio['album'] = meta_data['album'] + audio['artist'] = ';'.join([artist[0] for artist in meta_data['artist']]) + audio.save() + if __name__ == '__main__': import sys if len(sys.argv) > 1: - for file_path in sys.argv[1:]: - try: - dump(file_path) - except: - pass + files = sys.argv[1:] else: + files = [file_name for file_name in os.listdir('.') if os.path.splitext(file_name)[-1] == '.ncm'] + + 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 +