如何下载 Apple Music 无损 ALAC 歌曲:gamdl 使用指南

如何下载 Apple Music 无损 ALAC 歌曲:gamdl 使用指南

【免费下载链接】gamdlA command-line app for downloading Apple Music songs, music videos and post videos.项目地址: https://gitcode.com/GitHub_Trending/ga/gamdl

你是否也遇到过这种情况:Apple Music 的订阅明明包含无损音质,浏览器里却只能听到 AAC 的"压缩感"?gamdl就是一个命令行工具,专门把 Apple Music 的歌曲、MV 和帖子视频下载到本地——默认拿到 AAC 256kbps,配上 Wrapper 后还能直接下 ALAC 无损(最高 24-bit/192kHz),并自动打好标签、嵌好封面。

一、gamdl 到底能干什么

一句话定位:gamdl 是一个面向 Apple Music 订阅用户的"抓取 + 解密 + 打标"一体化下载器,输入一个网页链接,输出一个带完整元数据的本地 m4a / m4v 文件。核心能力有:

  1. 歌曲:AAC 256kbps、Dolby Atmos、AC3,以及 ALAC 无损(最高 24-bit/192kHz)
  2. MV:H.264/H.265,分辨率最高 4K
  3. 同步歌词:LRC / SRT / TTML 三种格式
  4. 元数据:自动写入标签并嵌入封面
  5. 批量:URL 支持歌曲、专辑、播放列表、艺人主页,艺人页还能自动挑选内容类型

如果你只想记住两个关键词:Wrapper 集成和ALAC 无损下载,本文就是围绕它们展开的。

二、架构怎么拆的:一次下载的数据流

把架构按数据流看会比列目录清晰得多。一次下载的路径是:你粘贴的 URL → CLI → 认证 → 元数据 → 下载 → 解密拼装 → 成品文件。

  1. gamdl/cli/:解析命令行参数,合并配置文件里的默认值
  2. gamdl/api/:建立连接。要么用WrapperApi连上 wrapper-v2 服务器,要么用 Netscape 格式的 cookies 直连 Apple Music 接口
  3. gamdl/interface/:解析 URL 类型,拉取专辑/歌曲元数据、流信息,按优先级挑码流
  4. gamdl/downloader/:拉取加密的 m4a 分片,下载完成后解密、写标签、嵌入封面
  5. gamdl/downloader/ammuxer/:用 Rust 写的原生扩展gamdl._ammuxer,负责解密和 MP4 拼装,Python 不碰二进制数据

组装过程在 gamdl/cli/cli.py 里,核心调用链如下:

# 认证:用 wrapper-v2 服务器(也可改用 netscape cookies 直连) wrapper_api = await WrapperApi.create( base_url=config.wrapper_url, # wrapper-v2 的 HTTP 地址 decrypt_host=config.wrapper_decrypt_host, # TCP 解密通道 decrypt_port=config.wrapper_decrypt_port, # 默认 10020 ) apple_music_api = await AppleMusicApi.create_from_wrapper( wrapper_api=wrapper_api, language=config.language ) interface = AppleMusicInterface(...) # 元数据与码流选择 downloader = AppleMusicDownloader(...) # 下载、解密、打标 async for item in downloader.get_download_item_from_url(url): await downloader.download(item) # 逐条落地 # ... 中间是各子接口的创建,见源码

三、核心机制深潜

突破 API 限制:Wrapper 是怎么干活的

原理一句话:Apple Music 的公开 webplayback 接口对非 web 码流做了限制,直接调大概率拿不到 ALAC;Wrapper 就像一个帮你跑前堂的"翻译官",替你持有账号、发起播放请求、处理解密。要点:

  • wrapper-v2 独立服务,负责账号认证、播放请求、FairPlay 解密三件事,gamdl 通过--use-wrapper开启
  • HTTP 通道走wrapper_url(默认http://127.0.0.1),批量解密走 TCP 端口10020
  • 用了 Wrapper 可以跳过 cookies,登录态由 Wrapper 管理;首次会交互式要求输入 Apple ID

编解码器优先级:一行配置决定音质

--song-codec-priority是逗号分隔的优先级列表,接口层拿到的码流清单里只要命中清单中的第一个可用项就选它,选中的编解码器定义在 gamdl/interface/enums.py:

class SongCodec(Enum): AAC_WEB = "aac-web" # AAC 256kbps 44.1kHz(默认,免 Wrapper) # ... 省略:aac-he / atmos / ac3 等 ALAC = "alac" # ALAC 最高 24-bit/192kHz,基本依赖 Wrapper

CLI 层还做了保护:选了alac却没开 Wrapper 时会打印警告——能试,但大概率失败。

解密 + 拼装:Rust 扩展 ammuxer

下载到手的是加密的 m4a,不能直接听。gamdl 把这段搬进了 Rust:gamdl/downloader/ammuxer/ 编译成gamdl._ammuxer,一次调用完成"解密 + 写 MP4 容器",Python 侧只剩薄薄一层异步封装(见 gamdl/downloader/ammuxer.py):

# FairPlay 流交给 wrapper-v2 的 TCP 端口批量解密,顺带完成 m4a 拼装 await decrypt_and_mux_wrapper( wrapper_api, track_id, # 媒体的 media id input_audio_path, # 下载下来的加密 m4a output_path, # 解密后的成品路径 fairplay_key_audio=fairplay_key, use_single_content_key=use_single_content_key, )

效果:加密分片进来,可正常播放的 m4a 出去,标签和封面随后由 mutagen 写入。

四、上手实战

场景一:下载第一首歌(Cookies 模式)

前置条件:Python ≥ 3.10,浏览器已登录 Apple Music,并导出了 Netscape 格式的 cookies 文件。

pip install gamdl # 安装 gamdl --cookies-path ./cookies.txt "https://music.apple.com/us/album/never-gonna-give-you-up-2022-remaster/1624945511?i=1624945512"

预期输出:./Apple Music/下出现带标签和封面的 m4a,默认 AAC 256kbps。

场景二:三步配置 Wrapper 实现无损下载

前置条件:本机已启动 wrapper-v2 服务器(HTTP + TCP 10020 两个通道)。

gamdl --use-wrapper \ --song-codec-priority alac \ "https://music.apple.com/us/album/whenever-you-need-somebody-2022-remaster/1624945511"

首次运行会交互式要求输入 Apple ID(可能含 2FA)。常用项写进配置文件~/.gamdl/config.ini(首次运行自动生成,Windows 在%USERPROFILE%\.gamdl\config.ini,命令行参数优先级更高):

[gamdl] use_wrapper = true song_codec_priority = alac

预期输出:专辑整张落地为 ALAC 无损 m4a,比特深度最高可达 24-bit/192kHz。

场景三:批量抓艺人 / 专辑

前置条件:拿到艺人主页链接。

# 自动挑选该艺人的全部专辑,从 urls.txt 批量读链接 gamdl --artist-auto-select all-albums --read-urls-as-txt -r ./urls.txt "https://music.apple.com/us/artist/rick-astley/669771"

交互式界面支持方向键移动、空格勾选、Ctrl+A 全选、Enter 确认。

五、进阶调优

换更快的下载引擎

--download-mode nm3u8dlre把下载引擎从默认的 yt-dlp 切换为 N_m3u8DL-RE(yt-dlp 本身只负责传输,媒体仍直接来自 Apple 服务器)。不在 PATH 里时用--nm3u8dlre-path指定可执行文件,--ffmpeg-path指定 FFmpeg。

跳过已下载曲目

给--database-path一个 SQLite 文件,下载过的媒体会登记其中,再次运行同类任务时自动跳过,适合长期维护一个本地曲库。

自定义目录与文件名

用--output-path指定输出目录,用模板控制结构,如--album-folder-template "{album_artist}/{album}/{date:%Y}"、--single-disc-file-template "{track:02d} {title}"。模板变量支持artist、album、date(strftime 格式)、disc、title等。

六、常见问题与避坑

ALAC 下载失败或报错

现象:指定了 alac 却拿不到流,或直接失败。原因:未启用 Wrapper,非 web 码流受 API 限制,纯 cookies 模式基本拿不到 ALAC。解决:开启--use-wrapper并确保 wrapper-v2 已登录;或退回aac-web。

Wrapper 连不上 / 登录失败

现象:启动即报Error fetching wrapper account info或Unsupported wrapper-v2 API version。原因:wrapper-v2 没启动、地址端口没对上,或版本与 gamdl 要求不一致(当前要求 0.0.2)。解决:确认 wrapper-v2 在运行;检查--wrapper-url与解密端口--wrapper-decrypt-port(默认 10020);升级或切换 wrapper-v2 版本。

4K MV 下不了

现象:2160p分辨率下载失败。原因:4K 需要 Widevine L1 的.wvd设备文件或 PlayReady SL3000 的.prd文件。解决:--wvd-path提供.wvd,或--drm-backend playready --prd-path xxx.prd;不想折腾就降到1080p。

Cookies 过期

现象:认证直接失败或提示无订阅。原因:cookies 有时效性。解决:在登录状态下重新从浏览器导出 Netscape 格式 cookies;或者干脆用 Wrapper 模式,可以完全跳过 cookies。

七、生态与演进

当前生态由四个组件构成:wrapper-v2 负责账号、播放请求与 FairPlay 解密;N_m3u8DL-RE 提供替代下载引擎;yt-dlp 与 FFmpeg 处理媒体传输与格式转换;Rust 扩展 ammuxer 由 maturin 构建,承担解密与 MP4 拼装。参与入口很直接:提 issue 报告 bug 或需求,维护者目前只接收关键 bug 修复的 PR,另有 Discord 社区可以交流。

八、写在最后

回到开头的问题:订阅里有无损,浏览器里却只有 AAC。用 gamdl 加上 Wrapper,你的无损音轨就能安安静静地躺在本地硬盘里——而且连标签和封面都是现成的。现在就去跑一条gamdl --use-wrapper --song-codec-priority alac试试 🎵

【免费下载链接】gamdlA command-line app for downloading Apple Music songs, music videos and post videos.项目地址: https://gitcode.com/GitHub_Trending/ga/gamdl

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

DQN深度强化学习指南:从Q-learning到经验回放与目标网络

DQN深度强化学习指南:从Q-learning到经验回放与目标网络

DQN 这东西,搞强化学习的人早晚要正面碰一次。它从 Q-learning 那张简单的表格一路进化成深度神经网络,可以说是整个深度强化学习爆发的起点。很多人上来就对着成熟的强化学习库调参数,结果训练半天 reward 曲线像心电图,根本不知…

2026/10/21 3:03:06 阅读更多 →
基于Web的校园失物招领系统:Spring Boot+Vue全栈设计与实现

基于Web的校园失物招领系统:Spring Boot+Vue全栈设计与实现

不知道你有没有想过,一所万人规模的学校里,每天到底会产生多少件遗失物品。从我接触过的几个高校后勤项目来看,光是学生餐厅、图书馆和操场这三个地方,一天捡到的水杯、校园卡、耳机、钥匙就有几十件。这些物品大部分被送到失物招…

2026/10/21 3:02:05 阅读更多 →
RJ45接口40年进化史:从百兆到万兆,揭秘网络连接底层逻辑

RJ45接口40年进化史:从百兆到万兆,揭秘网络连接底层逻辑

从百兆到万兆!RJ45接口的40年进化史,藏着网络连接的底层逻辑你家里那根网线,大概率插在一个叫RJ45的接口上。这接口四十多年没变过样子,但从它里面跑过的速度,已经从早期的10Mbps涨到了今天的10Gbps,整整一…

2026/10/21 3:02:05 阅读更多 →

最新新闻

Elasticsearch集群安全配置:TLS/SSL与密钥库管理全解析

Elasticsearch集群安全配置:TLS/SSL与密钥库管理全解析

给Elasticsearch集群做安全配置这件事,远比想象中麻烦。很多人以为在elasticsearch.yml里加几行TLS/SSL配置就能收工,结果往往是节点之间互相不认证书、Kibana连不上、客户端报handshake failed,最后只能回滚。我这次把一套三节点ES集群从裸H…

2026/10/21 5:49:18 阅读更多 →
嘎嘎降AI实战教程:从注册到多轮降重,让AI文本更自然

嘎嘎降AI实战教程:从注册到多轮降重,让AI文本更自然

"嘎嘎降AI"这名字听起来有点随意,但用起来确实能解决一个实际问题:AI生成的内容,如何改得更像人写的。很多朋友现在写材料、做方案、写公众号,第一稿都习惯让AI对话软件先起个草,然后再自己改。可草稿一到手…

2026/10/21 5:49:18 阅读更多 →
广播、未知、同网、异网:交换机转发与排障核心解析

广播、未知、同网、异网:交换机转发与排障核心解析

干网络这行久了,最常被新人追问的一个问题是:交换机把一个帧从某个端口收进来之后,它凭什么决定从哪个端口送出去?教科书上会讲查MAC地址表、泛洪、丢弃,但真到排障时,大家还是容易懵。后来我发现&#xff…

2026/10/21 5:49:18 阅读更多 →
嘎嘎降AI工具详解:从注册到实操的AI文本自然化处理指南

嘎嘎降AI工具详解:从注册到实操的AI文本自然化处理指南

“你手头有一段AI生成的文章,第一眼读起来特别工整,逻辑也没什么毛病,但总觉得有点‘板’,像戴着面具在说话”——这就是我最初接触到“嘎嘎降AI”这个工具时最想解决的问题。它不是用来做文案初稿的,也不是单纯改错别…

2026/10/21 5:49:18 阅读更多 →
技能管理系统:从技能地图到刻意练习的完整框架

技能管理系统:从技能地图到刻意练习的完整框架

很多人看到“skills”这个词,第一反应是“又一篇讲职场技能提升的文章”。但我今天想换个角度聊:技能不是一个名词,而是一套需要持续维护的系统。你收藏过一堆课程、买过一堆书、报过训练营,最后真正变成自己能力的,其…

2026/10/21 5:49:18 阅读更多 →
AI信息挖掘实战:从提问到交叉验证,把碎片信息串成认知

AI信息挖掘实战:从提问到交叉验证,把碎片信息串成认知

元旦的钟声刚敲过,我猜不少人正把“新的一年多学点东西、把手头的事做精”写进计划表。这几天我发现一个很有意思的现象:大家不是不想查资料,而是被资料淹没了。打开浏览器想看某个行业的最新动态,结果十条链接里八条是去年的&…

2026/10/21 5:48:18 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →