BearLabs
📅 2026-07-07
⏱️ 12 min read·2,954 words
tools

Tidal + 网易云音乐离线下载工具指南(2026 现状)

为「已订阅用户」做个人离线聆听整理的工具链梳理。仅供个人离线使用,不得用于二次分发或公开流媒体播放。


1. 背景与适用范围

说明
目标把已订阅的 Tidal / 网易云音乐专辑、歌单曲目下载到本地,用于离线播放
不适用任何形式的公开播放、二次分发、网站集成、商业用途
法务性质灰色地带 —— 严格意义上违反两家服务的 ToS,但个人离线使用通常不会被追究(详见第 6 节)
平台macOS(darwin),Python 3.10+ 生态

关键认知:Tidal 与网易云都没有「官方开发者 API 用于下载 MP3」。市面上能用的工具都是基于订阅用户的 OAuth token / Cookie 去调用内部流媒体端点,绕过了官方客户端。这意味着所有工具都有 API 变更失效的风险,需要定期更新。


2. 工具选型(2026 年 7 月)

2.1 推荐组合

服务推荐工具状态输出格式
Tidalstreamrip v2.2.0✅ 活跃(最近提交 2026-06)FLAC(HiFi / HiRes)
网易云音乐ncm-dl v0.1.2✅ 全新发布(2026-07-04)MP3 / FLAC

2.2 已淘汰 / 不推荐

工具状态原因
Tidal-Media-Downloadertidal-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-cliTidal-Media-Downloader 的社区 fork(2026-05 创建),修复了认证流程;社区小但活跃
neteasecliTypeScript 实现,浏览器 Cookie 导入 + mpv 播放;需 Node.js ≥ 24
NeteaseCloudMusicApiEnhanced/api-enhancedNode.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 --upgrade

3.2 认证(OAuth2 设备码流程)

首次运行任意 Tidal 命令时触发:

  1. 终端打印一个 URL + 用户码
  2. 浏览器打开 URL,登录 Tidal 账户,输入用户码
  3. Token 缓存到 ~/.config/streamrip/config.toml

手动配置:

rip config open   # 用默认编辑器打开 config.toml

config.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格式比特率 / 采样率订阅层级
0AAC128 kbpsFree
1AAC320 kbps
2FLAC16-bit / 44.1 kHz(CD)HiFi
3FLAC24-bit / ≤96 kHz(MQA)HiFi Plus
4FLAC24-bit / ≤192 kHzMAX(部分曲目)

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/147569387

3.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-dluv 运行,零系统级安装,所有依赖都是 Python 标准库:

brew install uv
mkdir ~/ncm-dl && cd ~/ncm-dl

网易云用浏览器 Cookie 鉴权,VIP / SVIP 才能拿到 320k 以上音质:

  1. 浏览器登录 music.163.com
  2. 打开 DevTools → Application → Cookies → https://music.163.com
  3. 复制 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格式比特率订阅层级
standardMP3128 kbps免费
higherMP3192 kbps免费
exhighMP3320 kbpsVIP
losslessFLAC~800-1000 kbpsSVIP
hiresHi-Res FLAC>1000 kbpsSVIP(部分曲目)

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 hires

4.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.mp3

5.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 区域限制

服务可用区中国大陆访问
TidalUS / 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_clientTidal 轮换 OAuth client credentials装 dev 分支:pip3 install git+https://github.com/nathom/streamrip.git@dev --upgrade
401 UnauthorizedToken 过期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 ForbiddenCookie 过期或 IP 风控重新导出 MUSIC_U;或挂 CN 代理
connection reset海外 IP 被限流http_proxy 指向 CN 出口
大批量下载卡死API 限流加 sleep,单线程跑

7.3 通用排查思路

  1. 先确认认证:Tidal 看 ~/.config/streamrip/config.toml 是否有 token;网易云 echo $MUSIC_U
  2. 再确认网络:能否直接 curl https://tidal.com / curl https://music.163.com
  3. 再确认权限:VIP / SVIP 是否生效(网易云 320k+ 必须订阅)
  4. 最后看工具版本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/IDuv run ncm-dl dl SONG_ID
下载歌单rip url https://tidal.com/browse/playlist/IDuv run ncm-dl playlist PLAYLIST_ID
指定音质rip --quality 2 url ...uv run ncm-dl dl ID --level lossless
转码 MP3rip --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 lossless

chmod +x ~/bin/dl-* 并确保 ~/bin$PATH 中。


10. 后续维护

这领域的工具生命周期通常 6-18 个月:API 改、Key 失效、维护者被 DMCA。建议:

  1. 关注上游 issue:streamrip watch nathom/streamrip;ncm-dl 关注 PyPI release notes
  2. 遇到 invalid_client 类错误第一反应是切 dev 分支,而不是死磕 release 版本
  3. 每月跑一次 pip3 install streamrip --upgradeuv run ncm-dl --version,对比 PyPI 最新
  4. 保留至少一个备选工具:Tidal 看 tidekeeper-cli,网易云看 NeteaseCloudMusicApi Enhanced
  5. 不要绑死单一订阅:Tidal / 网易云都有可能突然封号,定期把已下载的曲库整理进本地音乐库(如 Navidrome)

本文档基于 2026-07-07 时点工具状态整理。streamrip v2.2.0、ncm-dl v0.1.2。如有失效请提 issue 更新。

BearLabs | Tidal + 网易云音乐离线下载工具指南(2026 现状)