我网易云的歌单有两千多首。手机换了几轮,歌单一直在云上,可离线下载的额度撑不住,缓存里躺着的东西过一阵子就自己没了。
于是我写了个工具,把歌单整个拉到本地。
ncm(网易云音乐歌单下载器)现在有桌面版和 Android 版,MIT 协议,pywebview 写的。
它做什么
顶部粘一个歌单 ID 或者歌单链接,比如 3778678,点获取,歌单就铺开了。勾上想要的,选好音质,点开始下载。
下载完的歌直接进播放器。播放和下载是两个独立的面板,下载到一半切过去听歌不会打断。
播放这边
音源分四种:登录后的账号歌单、我喜欢的、本地文件夹、最近播放。还能直接搜在线歌曲。
歌词会滚动高亮,带翻译。本地音乐先找同目录的 .lrc,没有就翻音频文件里的内嵌标签,再没有就按歌名去网易云查一次,查到了能一键存成 .lrc 放回本地。
桌面歌词是个独立浮窗,跟着播放走,能拖。字号、颜色、背景样式、文字样式都能调。
播放次数记在本地,默认不上报。想同步到网易云的话,设置里自己打开。
退出的时候记住队列、当前曲目和播放进度,下次打开接着放。
下载这边
音质五档:标准、较高、极高、无损、Hi-Res。选不了的自动降级到能下的那一档,不硬报错。
同时下载 1 到 3 首,默认 2 首。右侧队列显示每首的进度和速度,还有总体统计。
歌词跟音频存在同一个目录,.lrc,原词和翻译合在同一个时间戳下面。已经有歌词的文件不覆盖,下次开应用还能给老歌补上。
下载先写 .part,校验字节数对了才改名。失败的歌单独列出来,不会因为一首卡住整单。
登录
扫码、手机验证码、导入 Cookie,三种。
登录之后才能下非公开歌单和会员歌曲。手机号还没有网易云账号的,能直接在应用里注册。
「验证码发送过于频繁」是网易云自己的限制,同一个号每分钟一条。发送按钮会锁住倒计时,别连点。
Android 版
10 月 27 号发的,官方签名的包。
界面重做了一遍,底部导航加了选中态和文字标签,列表行有按压反馈和分隔线。
本地音乐这块绕了个弯:Android 10 以后应用不能直接翻 /sdcard/Music,现在改成从系统媒体库读。第一次进会问要不要读取手机上的音频,允许之后才有内容;不给权限就显示空状态,不会崩。
27 号那版刚发的时候扫码登录是坏的,弹窗里报 method error,二维码位置是一张裂图。原因是安卓端打包进去的通信代码跟安卓端对不上,每一个请求都在失败,但界面照常显示,看不出来。10 月 30 号的 v3.5.14 把两边对上了,登录弹窗里能正常出码,首页的每日推荐和新歌速递也有了内容。
后面又修了几处安卓的界面问题。v3.5.15 让整个界面固定占满屏幕,底部菜单栏不再被内容顶走;登录弹窗里的提示不再被压住;「发送验证码」加了 60 秒冷却,别再连着发。v3.5.16 修了系统内置浏览器太老的手机 —— 那种机器上打开只能看到一个标题和菜单栏,内容那一块塌掉了,换成旧浏览器也认得的方式撑满屏幕就好了。
其它
界面中英文实时切换,不用重启。
深色浅色跟随系统,窗口从 780×560 到 4K 都能自适应。自定义背景图可以调模糊和压暗,也能从图片里取主色。液态玻璃效果可以关。
账号数据能导出成一个 .ncmbk 文件,包含账号资料、云端收藏和歌单。换账号登录之后导回去,同名歌单会先问你要不要合并。还能单独导出当前登录的 Cookie,在另一台设备上临时免密登录用。
默认下载目录 ~/Music/Downloads,Windows 是 %USERPROFILE%\Music\Downloads。
装
macOS 从 Releases 下 dmg 或 zip,Apple 芯片和 Intel 都有。应用没有做代码签名,第一次打开右键选「打开」,或者:
xattr -dr com.apple.quarantine /Applications/NeteaseMusicDownloader.app
Windows 下 NeteaseMusicDownloader.exe 单文件免安装。需要 WebView2 运行时,Windows 11 和较新的 Windows 10 自带。
Android 版是 NeteaseMusicDownloader-Android-<版本>-arm64-v8a.apk,目前只在预发布标签里,最新是 v3.5.16。预发布的意思是这个版本还没测完,测完确认没问题了会转成正式版。去 Releases 列表页挑带 Android 的文件名下,别点 /latest —— 正式版目前还没有安卓包。
技术上的几个选择
请求走网易云的 eapi 通道,跟官方桌面端同一套签名方式。weapi 在部分网络下会被 CDN 黑洞,任何请求都返回空响应,所以不用它。
在线播放和本地文件都从 127.0.0.1 上的本地媒体服务出声。网易云的 CDN 直链要求带 Referer,走本地服务之后,本地文件和在线歌曲能共用一套拖动和缓存逻辑。这个服务只监听回环地址,只读白名单目录里的文件。
本地音乐的标签解析是自己写的,认 ID3v2、FLAC、MP4、WAV、OGG。不想因为一个解析器把 GPL 传染进来。
免责声明
仅用于个人学习和备份,不要拿去商用。音乐版权归网易云音乐及其权利人所有。
代码和开发笔记都在仓库里:ncm
用起来有问题,或者想要什么功能,说一声。