网易云NCM格式转换器

借鉴了GitHub上的ncmdump 项目代码并使用PYQT做了一个界面出来

百度云下载链接

链接:https://pan.baidu.com/s/13KX4at8jOq49DZgCc3p13A 
提取码:s5v3 
复制这段内容后打开百度网盘手机App,操作更方便哦

如果可用麻烦各位给个赞喔,或者留言一下


用java重写了一个新的ncm格式转换器2.0版本

闪退异常时能知道报错信息

能知道进度,不会一直卡着

链接:https://pan.baidu.com/s/1kh_wWprOd0FneT0H5eBKUg 
提取码:p1yw
复制这段内容后打开百度网盘手机App,操作更方便哦

 

有啥问题可以加我q(这是一个免费的学习用小软件)


 

import binascii, struct
import base64, json
import os, traceback

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Util.strxor import strxor as XOR
from mutagen import mp3, flac, id3

def dump(input_path, output_path = None, skip = True):

    output_path = (lambda path, meta: os.path.splitext(path)[0] + '.' + meta['format']) if not output_path else output_path
    output_path = (lambda path, meta: path) if not callable(output_path) else output_path

    core_key = binascii.a2b_hex('687A4852416D736F356B496E62617857')
    meta_key = binascii.a2b_hex('2331346C6A6B5F215C5D2630553C2728')

    f = open(input_path, 'rb')

    # magic header
    header = f.read(8)
    assert binascii.b2a_hex(header) == b'4354454e4644414d'

    f.seek(2, 1)

    # key data
    key_length = f.read(4)
    key_length = struct.unpack('<I', bytes(key_length))[0]

    key_data = bytearray(f.read(key_length))
    key_data = bytes(bytearray([byte ^ 0x64 for byte in key_data]))

    cryptor = AES.new(core_key, AES.MODE_ECB)
    key_data = unpad(cryptor.decrypt(key_data), 16)[17:]
    key_length = len(key_data)

    # S-box (standard RC4 Key-scheduling algorithm)
    key = bytearray(key_data)
    S = bytearray(range(256))
    j = 0

    for i in range(256):
        j = (j + S[i] + key[i % key_length]) & 0xFF
        S[i], S[j] = S[j], S[i]

    # meta data
    meta_length = f.read(4)
    meta_length = struct.unpack('<I', bytes(meta_length))[0]

    if meta_length:
        meta_data = bytearray(f.read(meta_length))
        meta_data = bytes(bytearray([byte ^ 0x63 for byte in meta_data]))
        identification = meta_data.decode('utf-8')
        meta_data = base64.b64decode(meta_data[22:])

        cryptor = AES.new(meta_key, AES.MODE_ECB)
        meta_data = unpad(cryptor.decrypt(meta_data), 16).decode('utf-8')
        meta_data = json.loads(meta_data[6:])
    else:
        meta_data = {'format': 'flac' if os.fstat(f.fileno()).st_size > 1024 ** 2 * 16 else 'mp3'}

    f.seek(5, 1)

    # album cover
    image_space = f.read(4)
    image_space = struct.unpack('<I', bytes(image_space))[0]
    image_size = f.read(4)
    image_size = struct.unpack('<I', bytes(image_size))[0]
    image_data = f.read(image_size) if image_size else None

    f.seek(image_space - image_size, 1)

    # media data
    output_path = output_path(input_path, meta_data)
    if skip and os.path.exists(output_path): return

    data = f.read()
    f.close()

    # stream cipher (modified RC4 Pseudo-random generation algorithm)
    stream = [S[(S[i] + S[(i + S[i]) & 0xFF]) & 0xFF] for i in range(256)]
    stream = bytes(bytearray(stream * (len(data) // 256 + 1))[1:1 + len(data)])
    data = XOR(data, stream)

    m = open(output_path, 'wb')
    m.write(data)
    m.close()

    # media tag
    def embed(item, content, type):
        item.encoding = 0
        item.type = type
        item.mime = 'image/png' if content[0:4] == binascii.a2b_hex('89504E47') else 'image/jpeg'
        item.data = content

    if image_data:
        if meta_data['format'] == 'flac':
            audio = flac.FLAC(output_path)
            image = flac.Picture()
            embed(image, image_data, 3)
            audio.clear_pictures()
            audio.add_picture(image)
        elif meta_data['format'] == 'mp3':
            audio = mp3.MP3(output_path)
            image = id3.APIC()
            embed(image, image_data, 6)
            audio.tags.add(image)
        audio.save()

    if meta_length:
        if meta_data['format'] == 'flac':
            audio = flac.FLAC(output_path)
            audio['description'] = identification
        else:
            audio = mp3.EasyMP3(output_path)
            audio['title'] = 'placeholder'
            audio.tags.RegisterTextKey('comment', 'COMM')
            audio['comment'] = identification
        audio['title'] = meta_data['musicName']
        audio['album'] = meta_data['album']
        audio['artist'] = '/'.join([artist[0] for artist in meta_data['artist']])
        audio.save()

    return output_path

if __name__ == '__main__':
    import sys
    if len(sys.argv) > 1:
        files = sys.argv[1:]
    else:
        files = [name for name in os.listdir('.') if os.path.splitext(name)[-1] == '.ncm']
    
    if sys.version[0] == '2':
        files = [path.decode(sys.stdin.encoding) for path in files]

    if not files:
        print('please input file path!')
        
    for path in files:
        try:
            dump(path)
            print(os.path.split(path)[-1])
        except Exception as e:
            print(traceback.format_exc())
            pass

 

### 回答1: 网易云ncm格式转换器是一款可以在手机上使用的软件,它可以将网易云音乐的ncm格式音频文件转换成常见的音频格式,例如MP3、WAV等。通过这个软件,用户可以将下载的ncm格式音乐文件转换为其他格式,然后可以在其他播放器或设备上播放,提高音乐的兼容性和可用性。 这款软件具有以下几个特点和功能: 1. 界面简洁:网易云ncm格式转换器手机版拥有直观的用户界面,操作简单方便,使用户能够轻松地完成音频文件的格式转换。 2. 快速转换:该软件采用高效的转换算法,可以在短时间内完成音频文件的转换,节省用户的时间。 3. 多种输出格式:该软件支持多种音频格式的转换,用户可以根据自己的需求选择合适的输出格式,以适应不同的播放器与设备。 4. 批量转换:用户可以一次选择多个ncm格式音频文件进行批量转换,提高转换的效率。 5. 保留音质:转换过程中,该软件会尽量保留音乐的音质和音频信息,使转换后的音频文件更加贴近原始音乐。 总之,网易云ncm格式转换器手机版是一款功能强大、操作简单的软件,可以帮助用户将网易云音乐的ncm格式音频文件转换成其他常见格式,提高音乐的可用性。无论是想将音乐保存到其他设备上,还是与其他人分享音乐,这款转换器都能满足需求,并让用户尽情享受音乐的乐趣。 ### 回答2: 网易云音乐是国内非常受欢迎的在线音乐平台,它支持多种音乐格式,其中包括NCM格式。NCM格式是网易云音乐加密的音乐文件格式,只能在网易云音乐客户端上播放,无法在其他音乐播放器中播放。 然而,对于一些用户来说,他们可能希望将这些NCM格式的音乐文件转换为其他常见的音乐格式,以方便在其他播放器上播放。这就需要使用到网易云NCM格式转换器手机版。 网易云NCM格式转换器手机版是一款专门为手机用户设计的转换工具,可以将NCM格式的音乐文件转换为MP3、WAV、FLAC等常见的音乐格式。通过使用这个转换器,用户可以方便地将网易云音乐中收藏的音乐下载为自己手机支持的格式,以便在其他音乐播放器上随时欣赏音乐。 使用网易云NCM格式转换器手机版非常简单。用户只需要在手机上安装这个转换器,并将想要转换的NCM格式音乐文件导入转换器中。然后,选择目标音乐格式和保存路径,点击转换按钮,就可以开始转换了。转换完成后,用户就可以在转换器指定的保存路径中找到转换后的音乐文件,并且可以将其导入到其他播放器中播放。 总的来说,网易云NCM格式转换器手机版是一款非常实用的工具,可以帮助用户将网易云音乐中的NCM格式音乐文件转换为其他常见的音乐格式,使得用户可以更加方便地在手机上享受自己喜爱的音乐。 ### 回答3: 网易云音乐是一款非常受欢迎的音乐播放器,而NCM则是一种特殊的音乐格式,只能在网易云音乐中播放。但是,由于很多人希望能够将NCM格式的音乐文件转换为其他常见的音乐格式,比如MP3或者WAV,这样就可以在其他音乐播放器中播放了。 针对这个需求,有一些开发者推出了网易云NCM格式转换器手机版。这些软件可以帮助用户将NCM格式的音乐文件转换为其他格式,以便在其他设备上播放或者编辑。 使用网易云NCM格式转换器手机版非常简便。用户只需将NCM格式的音乐文件导入软件中,选择目标格式和输出路径,然后点击转换按钮即可开始转换。转换完成后,用户可以在指定的输出路径中找到已转换的音乐文件。 这样,用户就可以将NCM格式的音乐文件转换为其他常见的音乐格式,以便在其他音乐播放器中播放。同时,该软件还支持批量转换,可以一次性转换多个音乐文件,提高了转换的效率。 总的来说,网易云NCM格式转换器手机版是一种非常实用的工具,帮助用户解决了将NCM格式的音乐文件转换为其他常见格式的问题,让用户可以在其他音乐播放器中自由播放他们喜爱的音乐。
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值