Tidal + 网易云音乐离线下载工具指南(2026 现状)
为「已订阅用户」做个人离线聆听整理的工具链梳理。仅供个人离线使用,不得用于二次分发或公开流媒体播放。
1. 背景与适用范围
| 项 | 说明 |
|---|---|
| 目标 | 把已订阅的 Tidal / 网易云音乐专辑、歌单曲目下载到本地,用于离线播放 |
| 不适用 | 任何形式的公开播放、二次分发、网站集成、商业用途 |
| 法务性质 | 灰色地带 —— 严格意义上违反两家服务的 ToS,但个人离线使用通常不会被追究(详见第 6 节) |
| 平台 | macOS(darwin),Python 3.10+ 生态 |
关键认知:Tidal 与网易云都没有「官方开发者 API 用于下载 MP3」。市面上能用的工具都是基于订阅用户的 OAuth token / Cookie 去调用内部流媒体端点,绕过了官方客户端。这意味着所有工具都有 API 变更失效的风险,需要定期更新。
2. 工具选型(2026 年 7 月)
2.1 推荐组合
| 服务 | 推荐工具 | 状态 | 输出格式 |
|---|---|---|---|
| Tidal | streamrip v2.2.0 | ✅ 活跃(最近提交 2026-06) | FLAC(HiFi / HiRes) |
| 网易云音乐 | ncm-dl v0.1.2 | ✅ 全新发布(2026-07-04) | MP3 / FLAC |
2.2 已淘汰 / 不推荐
| 工具 | 状态 | 原因 |
|---|---|---|
Tidal-Media-Downloader(tidal-dl,yaronzz 原版) | ❌ 废弃 | 自 2022-08 起无更新,2026-03 起 API key 全部失效(#1213) |
tidal-dl-ng(exislow) | ❌ 被下架 | 2026-01 整个 GitHub 账户与 PyPI 包被删除,疑似 DMCA |
RedSea(Dniel97 / redsudo fork) | ❌ 死亡 | 最后提交 2023-04,fork 自述「再次废弃」 |
pyncm | ⚠️ 已归档 | 2026-03-17 archive,仍可 pip install 但会逐步腐烂 |
you-get | ⚠️ 维护缓慢 | 多源下载器,网易云支持时好时坏 |
2.3 值得关注的替代
| 工具 | 说明 |
|---|---|
tidekeeper-cli | Tidal-Media-Downloader 的社区 fork(2026-05 创建),修复了认证流程;社区小但活跃 |
neteasecli | TypeScript 实现,浏览器 Cookie 导入 + mpv 播放;需 Node.js ≥ 24 |
NeteaseCloudMusicApiEnhanced/api-enhanced | Node.js API 服务器(非 CLI),适合自己写下载脚本,见第 4.4 节 |
3. Tidal:streamrip
3.1 安装
# 依赖
brew install ffmpeg python@3
# 主程序
pip3 install streamrip --upgrade
# 如遇 OAuth invalid_client 错误(Tidal 轮换凭据),切 dev 分支:
pip3 install git+https://github.com/nathom/streamrip.git@dev --upgrade3.2 认证(OAuth2 设备码流程)
首次运行任意 Tidal 命令时触发:
- 终端打印一个 URL + 用户码
- 浏览器打开 URL,登录 Tidal 账户,输入用户码
- Token 缓存到
~/.config/streamrip/config.toml
手动配置:
rip config open # 用默认编辑器打开 config.tomlconfig.toml 关键字段:
[tidal]
quality = 2 # 0=128k AAC, 1=320k, 2=HiFi FLAC, 3=HiRes FLAC, 4=Max
download_base_path = "~/Music/streamrip"
# 不要在配置文件里写账号密码 —— streamrip 用 OAuth 设备码,不存明文凭据3.3 音质档位
--quality | 格式 | 比特率 / 采样率 | 订阅层级 |
|---|---|---|---|
0 | AAC | 128 kbps | Free |
1 | AAC | 320 kbps | — |
2 | FLAC | 16-bit / 44.1 kHz(CD) | HiFi |
3 | FLAC | 24-bit / ≤96 kHz(MQA) | HiFi Plus |
4 | FLAC | 24-bit / ≤192 kHz | MAX(部分曲目) |
Tidal 曲库本身就不是 MP3 存储,所以下载下来是 FLAC。如需 MP3 用第 5 节的转码流程。
3.4 常用命令
# === 单张专辑(URL) ===
rip --quality 2 url https://tidal.com/browse/album/147569387
# === 搜索 + 交互式下载 ===
rip search tidal album 'fleetwood mac rumours'
rip search tidal playlist 'lo-fi beats'
rip search tidal track 'daft punk get lucky'
# === 歌单 / 艺人全集 ===
rip url https://tidal.com/browse/playlist/abc123
rip url https://tidal.com/browse/artist/12345 --include-singles
# === 下载后自动转 MP3(需 ffmpeg) ===
rip --codec mp3 --quality 2 url https://tidal.com/browse/album/147569387
# === 临时覆盖默认音质 ===
rip --quality 3 url https://tidal.com/browse/album/1475693873.5 已知问题
| 症状 | 原因 | 处理 |
|---|---|---|
invalid_client OAuth 错误 | Tidal 轮换 OAuth 客户端凭据 | 装 dev 分支:pip3 install git+https://github.com/nathom/streamrip.git@dev --upgrade |
| SoundCloud 分段损坏 | v2.1.x bug | 升级到 v2.2.0+ |
| 部分曲目返回 404 | 区域限制 / 版权下架 | 换区或放弃 |
| Token 过期 | 长时间未用 | rip config open → 删 [tidal].user_id 等字段,重新触发设备码流程 |
4. 网易云音乐:ncm-dl
4.1 安装
ncm-dl 用 uv 运行,零系统级安装,所有依赖都是 Python 标准库:
brew install uv
mkdir ~/ncm-dl && cd ~/ncm-dl4.2 认证(MUSIC_U Cookie)
网易云用浏览器 Cookie 鉴权,VIP / SVIP 才能拿到 320k 以上音质:
- 浏览器登录 music.163.com
- 打开 DevTools → Application → Cookies →
https://music.163.com - 复制
MUSIC_U这一项的值
# 写到 shell rc(~/.zshrc)
export MUSIC_U='你的_cookie_值'
export LEVEL=lossless # standard | higher | exhigh | lossless | hires下载目录已迁移到 walkingweekend.com 项目内(Nutstore 同步):
# NetEase 下载目录(由 dl-ncm 脚本自动创建)
public/sharing/listening/netease # → Nutstore 同步路径安全提示:
MUSIC_U等价于你的登录态,泄露即可被冒充操作。不要提交到 git,不要贴在公开场合。
4.3 音质档位
--level | 格式 | 比特率 | 订阅层级 |
|---|---|---|---|
standard | MP3 | 128 kbps | 免费 |
higher | MP3 | 192 kbps | 免费 |
exhigh | MP3 | 320 kbps | VIP |
lossless | FLAC | ~800-1000 kbps | SVIP |
hires | Hi-Res FLAC | >1000 kbps | SVIP(部分曲目) |
4.4 常用命令
# === 搜索 ===
uv run ncm-dl search "晴天 周杰伦"
# === 单曲下载(按 ID,来自搜索结果) ===
uv run ncm-dl dl 186016
# === 只取流媒体 URL,不下载 ===
uv run ncm-dl url 186016
# === 完整歌单 ===
uv run ncm-dl playlist PLAYLIST_ID --level lossless
# === 临时指定音质 ===
uv run ncm-dl dl 186016 --level hires4.5 灰色歌曲(版权下架)处理
网易云对大量曲目做了区域/版权限制,直接请求 song/url 会返回 null。两条出路:
方案 A:NeteaseCloudMusicApi Enhanced(API 服务器)
git clone https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced.git
cd api-enhanced && pnpm install
ENABLE_FLAC=true \
SELECT_MAX_BR=true \
ENABLE_GENERAL_UNBLOCK=true \
node app.js # 启动 API 服务器,默认 :3000关键 env 开关:
| Env | 作用 |
|---|---|
ENABLE_FLAC=true | 启用无损音质 |
SELECT_MAX_BR=true | 自动选最高比特率 |
ENABLE_GENERAL_UNBLOCK=true | 尝试用备用源解锁灰色歌曲 |
调用示例:
// song_url/v1 返回直接可下载的 URL
const res = await fetch('http://localhost:3000/song/url/v1?id=186016&level=lossless', {
headers: { Cookie: `MUSIC_U=${process.env.MUSIC_U}` }
});
const { data: [{ url, type, size }] } = await res.json();
// url 即 FLAC/MP3 直链,type 是后缀名方案 B:ncm-dl + 备用源(待项目支持,目前 v0.1.2 仅走官方端点)
5. FLAC 转 MP3
Tidal 与网易云高音质档都输出 FLAC。如需 MP3(iPod、老播放器、节省空间):
5.1 单文件
# V0 高质量变码率(~190-250 kbps,体积约为 320k CBR 的 70%)
ffmpeg -i input.flac -q:a 0 output.mp3
# 320k CBR
ffmpeg -i input.flac -b:a 320k output.mp35.2 批量转码(保留元数据)
# 把目录下所有 FLAC 转为 V0 MP3,删除原 FLAC
find ~/Music/tidal -name '*.flac' -exec sh -c \
'ffmpeg -i "$0" -q:a 0 "${0%.flac}.mp3" && rm "$0"' {} \;
# 仅转码不删除
find ~/Music/tidal -name '*.flac' -exec sh -c \
'ffmpeg -i "$0" -q:a 0 "${0%.flac}.mp3"' {} \;5.3 ffmpeg MP3 质量档速查
| 参数 | 比特率 | 体积(4 分钟曲) | 用途 |
|---|---|---|---|
-q:a 0 (VBR V0) | ~245 kbps | ~7 MB | 推荐,音质/体积平衡 |
-q:a 2 (VBR V2) | ~190 kbps | ~5.5 MB | 标准 |
-b:a 320k (CBR) | 320 kbps | ~9.5 MB | 最大兼容性 |
-b:a 128k (CBR) | 128 kbps | ~4 MB | 流媒体 / 节省空间 |
6. 风险与注意事项
6.1 服务条款(ToS)
| 服务 | ToS 条款 | 实际执行 |
|---|---|---|
| Tidal | 明确禁止「绕过流媒体分发机制、保存或缓存完整曲目」 | 偶尔发警告邮件,极少数情况封号 |
| 网易云 | 禁止「使用非官方客户端、绕过版权保护」 | 个人使用几乎不追究,第三方客户端众多 |
个人离线使用属于灰色地带:技术上违反 ToS,但与「盗版分发」是不同性质。作者不对此处描述的任何工具的法律后果负责。
6.2 账号封禁风险
| 服务 | 风险等级 | 缓解措施 |
|---|---|---|
| Tidal | 🟡 中 | 1. 用副号订阅,不要绑主邮箱 2. 控制节奏:每周几张专辑 OK,一天拉万首必触发风控 3. OAuth 凭据被 Tidal 轮换后及时升 dev 分支 |
| 网易云 | 🟢 低 | Cookie 鉴权走标准 web API,与众多第三方客户端同源;个人使用封号案例极少 |
6.3 区域限制
| 服务 | 可用区 | 中国大陆访问 |
|---|---|---|
| Tidal | US / EU / UK / 北欧 / 50+ 市场 | ❌ 需全程 VPN |
| 网易云 | 主战场中国大陆 | ✅ 直连;海外访问需 CN 代理 |
海外跑 ncm-dl:
# ncm-dl 走的是 music.163.com API,海外 IP 可能被限流
export https_proxy=http://your-cn-proxy:7890
export http_proxy=http://your-cn-proxy:7890
uv run ncm-dl search "晴天"或在 NeteaseCloudMusicApi Enhanced 里设:
ENABLE_RANDOM_CN_IP=true # 随机伪造 CN 出口 IP(依赖服务端 IP 库)7. 故障排查
7.1 streamrip 常见错误
| 错误信息 | 原因 | 处理 |
|---|---|---|
invalid_client | Tidal 轮换 OAuth client credentials | 装 dev 分支:pip3 install git+https://github.com/nathom/streamrip.git@dev --upgrade |
401 Unauthorized | Token 过期 | rip config open → 删 [tidal] 下的 token 字段,重新触发设备码 |
429 Too Many Requests | 触发速率限制 | 限流,等几分钟;不要并发批量下载 |
| 输出 0 字节文件 | 区域限制或版权下架 | 换区或放弃;查 streamrip issues |
| SoundCloud 分段拼接失败 | v2.1.x bug | 升级 v2.2.0+ |
7.2 ncm-dl 常见错误
| 错误信息 | 原因 | 处理 |
|---|---|---|
MUSIC_U not set | 未导出环境变量 | export MUSIC_U='...',或写进 ~/.zshrc |
url is null | 灰色歌曲 / 版权下架 | 用第 4.5 节方案 A 的 Enhanced API + ENABLE_GENERAL_UNBLOCK |
403 Forbidden | Cookie 过期或 IP 风控 | 重新导出 MUSIC_U;或挂 CN 代理 |
connection reset | 海外 IP 被限流 | 设 http_proxy 指向 CN 出口 |
| 大批量下载卡死 | API 限流 | 加 sleep,单线程跑 |
7.3 通用排查思路
- 先确认认证:Tidal 看
~/.config/streamrip/config.toml是否有 token;网易云echo $MUSIC_U - 再确认网络:能否直接
curl https://tidal.com/curl https://music.163.com - 再确认权限:VIP / SVIP 是否生效(网易云 320k+ 必须订阅)
- 最后看工具版本:
streamrip --version/uv run ncm-dl --version,对比 PyPI 最新
8. 快速参考速查表
8.1 一键环境初始化(macOS)
# === 系统依赖 ===
brew install ffmpeg python@3 uv
# === Tidal ===
pip3 install streamrip --upgrade
rip config open # 编辑 ~/.config/streamrip/config.toml
# === 网易云 ===
uv tool install ncm-dl
# 把下面两行加到 ~/.zshrc
# export MUSIC_U='你的_cookie'
# export LEVEL=lossless
# === Helper 脚本(已部署到 ~/bin/)===
# dl-tidal <url> → 下载到 walkingweekend/public/sharing/listening/tidal/
# dl-ncm <song_id> → 下载到 walkingweekend/public/sharing/listening/netease/8.2 命令速查
| 操作 | Tidal(streamrip) | 网易云(ncm-dl) |
|---|---|---|
| 搜索 | rip search tidal album 'keyword' | uv run ncm-dl search 'keyword' |
| 下载专辑 / 单曲(URL) | rip url https://tidal.com/browse/album/ID | uv run ncm-dl dl SONG_ID |
| 下载歌单 | rip url https://tidal.com/browse/playlist/ID | uv run ncm-dl playlist PLAYLIST_ID |
| 指定音质 | rip --quality 2 url ... | uv run ncm-dl dl ID --level lossless |
| 转码 MP3 | rip --codec mp3 --quality 2 url ... | 无(用 ffmpeg 后处理) |
| 取流媒体 URL(不下载) | — | uv run ncm-dl url SONG_ID |
8.3 音质对照
| 音质 | Tidal | 网易云 |
|---|---|---|
| 标准入门 | --quality 0 (128k AAC) | --level standard (128k MP3) |
| 中等 | --quality 1 (320k) | --level exhigh (320k MP3, 需 VIP) |
| CD / 无损(推荐) | --quality 2 (16/44.1 FLAC, 需 HiFi) | --level lossless (FLAC, 需 SVIP) |
| 高解析 | --quality 3 (24/96 FLAC, 需 HiFi Plus) | --level hires (Hi-Res FLAC, 需 SVIP) |
8.4 关键文件路径
| 用途 | 路径 |
|---|---|
| streamrip 配置 | ~/.config/streamrip/config.toml |
| Tidal 下载目录(walkingweekend) | walkingweekend.com/public/sharing/listening/tidal |
| NetEase 下载目录(walkingweekend) | walkingweekend.com/public/sharing/listening/netease |
| ncm-dl 工具安装 | ~/.local/bin/ncm-dl(via uv tool install ncm-dl) |
| dl-ncm / dl-tidal 脚本 | ~/bin/dl-ncm、~/bin/dl-tidal |
| ffmpeg MP3 转码 | ffmpeg -i in.flac -q:a 0 out.mp3 |
9. 配套脚本
已部署到 ~/bin/,下载后自动写入 walkingweekend.com 项目目录(Nutstore 同步):
~/bin/
├── dl-tidal # rip --quality 2 url "$@" → public/sharing/listening/tidal/
└── dl-ncm # ncm-dl dl "$@" 或 ncm-dl pl "$@" → public/sharing/listening/netease/用法:
# Tidal(需 streamrip + OAuth)
dl-tidal https://tidal.com/browse/album/147569387
# NetEase 单曲(需 MUSIC_U cookie)
dl-ncm 186016 --level lossless
# NetEase 歌单
dl-ncm playlist 123456 --level losslesschmod +x ~/bin/dl-* 并确保 ~/bin 在 $PATH 中。
10. 后续维护
这领域的工具生命周期通常 6-18 个月:API 改、Key 失效、维护者被 DMCA。建议:
- 关注上游 issue:streamrip watch nathom/streamrip;ncm-dl 关注 PyPI release notes
- 遇到
invalid_client类错误第一反应是切 dev 分支,而不是死磕 release 版本 - 每月跑一次
pip3 install streamrip --upgrade和uv run ncm-dl --version,对比 PyPI 最新 - 保留至少一个备选工具:Tidal 看
tidekeeper-cli,网易云看NeteaseCloudMusicApi Enhanced - 不要绑死单一订阅:Tidal / 网易云都有可能突然封号,定期把已下载的曲库整理进本地音乐库(如 Navidrome)
本文档基于 2026-07-07 时点工具状态整理。streamrip v2.2.0、ncm-dl v0.1.2。如有失效请提 issue 更新。