用于导出网易云音乐 NCM 格式的相关内容,核心转换功能参考 anonymous5l/ncmdump,并使用 golang 实现,起初是为了能在 Windows 下快速编译和运行。有任何BUG在这里提交。
- 转换ncm文件
- 为音频(flac和mp3)文件补充tag信息,包含标题、歌手、专辑、封面等
- 保留163key使播放器能识别转换后的文件
-
下载程序ncmdump
- 拖拽方式执行:
拖拽ncm文件或者包含ncm文件夹到执行程序
ncmdump-xxx上,等待程序运行完成- 命令行方式执行:
ncmdump-xxx [files.../dirs...]参数支持:--output 输出文件夹,为空时默认输出文件夹为音频文件的原文件夹 --tag 是否使用ncm的元信息来为音频文件补充tag,默认true参数需要放到输入文件、文件夹之前,如
ncmdump-xxx --output=D:\music_dump\ D:\music D:\music\name.ncm -
代码中使用
下载:
go get -u github.com/MysticalDevil/ncmdump导入:
import ncmdump "github.com/MysticalDevil/ncmdump/lib"本次迁移直接在主分支做了 API 破坏性调整(未发布 v2 模块):
NCMFile/Decode/DumpMeta/DumpCover/Dump的入参从*os.File改为io.ReadSeeker- 新增
ncmdump.DumpFromPath(path)便捷函数
示例:
fp, err := os.Open("a.ncm")
if err != nil {
panic(err)
}
defer fp.Close()
meta, err := ncmdump.DumpMeta(fp) // fp 作为 io.ReadSeeker 传入
if err != nil {
panic(err)
}
data, err := ncmdump.Dump(fp)
if err != nil {
panic(err)
}
_ = meta
_ = data或直接:
data, meta, cover, err := ncmdump.DumpFromPath("a.ncm")顺便提一句,为了转换以及处理方便,ncmdump.Dump(...) 会将解出的原音乐格式放入内存中,如果想直接写入文件建议自行改为流式写出。
项目使用 just 管理构建流程。
- Go 版本:
1.26+(仓库当前toolchain为go1.26.1) - 构建工具:
just、upx、zip - 原
build.sh已移除,请使用justfile
just release v1.0.0该命令会生成 dist/ 目录,并构建打包以下平台:
- windows/amd64
- windows/arm64
- darwin/arm64
- linux/amd64
- linux/arm64
日常开发可直接执行:
go test ./...
go vet ./...NCM 实际上不是音频格式是容器格式,封装了对应格式的 Meta 以及封面等信息,主要的格式如下:
因此,需要解开原格式信息的关键就是拿到 AES 的 KEY,好在每个 NCM 的加密的 KEY 都是一致的(出于性能考虑?)。所以,我们只要拿到 AES 的 KEY 以后,就可以根据格式解开对应的资源。
新版的云音乐已经不在 NCM 嵌入图片以及 Meta 等信息,因此使用 ncmdump.DumpMeta 去调用的时候,需要检查 Meta 信息的完整性。如果您需要 Meta 等信息,建议不要使用最新的客户端。
av3a 文件(通常是 MP4 容器音频)支持导出与打标,打标能力依赖本机 ffmpeg 可用。
- http://www.bewindoweb.com/228.html
- https://github.com/anonymous5l/ncmdump
- https://github.com/go-flac/go-flac
- https://github.com/mingcheng/ncmdump
- eof -
