gamdl

glomaticoMIT活跃维护

命令行工具,用来下载 Apple Music 的歌曲、音乐视频和动态视频,支持 AAC、M4A、M4V 等格式,最高可下 4K 画质。

A command-line app for downloading Apple Music songs, music videos and post videos.

3.9.1发布于 2026-09-22 12:46 UTC2,748star +2 / 7 天266fork同步于 2026-11-10 11:43 UTC

怎么上手

由 README 提炼,执行前请确认
pip install gamdl
gamdl "https://music.apple.com/us/album/whenever-you-need-somebody-2022-remaster/1624945511"
硬件要求按 README 说明

README 未说明硬件要求,仅要求 Python 3.10 或更高版本,并需要有效的 Apple Music 订阅

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

命令行下载 Apple Music 歌曲、MV 和动态视频,支持高质量音视频与歌词元数据

命令行工具,用来下载 Apple Music 的歌曲、音乐视频和动态视频,支持 AAC、M4A、M4V 等格式,最高可下 4K 画质。

核心能力

  • 下载 AAC 256kbps 歌曲及多种编码格式
  • 下载最高 4K 分辨率的音乐视频
  • 下载 LRC、SRT、TTML 格式的同步歌词
  • 自动写入完整元数据标签
  • 支持按艺人批量下载专辑或 MV

容易踩的坑

需要先在 Apple Music 登录并导出 Netscape 格式的 cookies.txt,默认从当前目录读取;使用 ALAC 编码需额外运行 Wrapper v2 服务,否则大概率失败;切换到 nm3u8dlre 下载模式需自行安装 N_m3u8DL-RE 和 FFmpeg 并配置路径

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本3.9.1
  1. 3.9.1最新正式版2026-09-22 · 2026-09-22 12:46 UTC

    What's Changed

    • Fixed aac-web and aac-he-web decryption with Widevine after the 3.9 regression.
    • Added PlayReady support for untyped web CENC keys by reconstructing a PlayReady WRMHEADER from the content KID.
  2. 3.92026-09-21 · 2026-09-21 20:22 UTC
    查看更新说明

    What's Changed

    • Added PlayReady as a DRM backend with .prd device support, including SL3000 devices for 4K music videos.
    • Improved playlist generation with .m3u8 files, relative media paths, and safer append/overwrite behavior.
    • Improved music video metadata, including missing album, track, and disc information from iTunes metadata and accurate sort tags when available through wrapper.
    • Added automatic filename collision handling for music videos with identical titles, reusing existing files by item ID and numbering distinct videos.
    • Added audio rendition fallback for music videos when audio-stereo-256 is unavailable.
  3. 3.8.52026-08-03 · 2026-08-03 10:58 UTC
    查看更新说明

    What's Changed

    • Fixed an issue when extracting content key from some songs on non-web codecs.
  4. 3.8.42026-07-16 · 2026-07-16 22:08 UTC
    查看更新说明

    What's Changed

    • Fixed an issue that could cause the ending of some songs to be cut off or corrupted when using wrapper decryption.
  5. 3.8.32026-07-12 · 2026-07-12 22:09 UTC
    查看更新说明

    What's Changed

    • Added Python 3.14 support.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Gamdl (Glomatico's Apple Music Downloader)

    PyPI version Python versions License Downloads

    A command-line app for downloading Apple Music songs, music videos and post videos.

    Join our Discord Server: https://discord.gg/aBjMEZ9tnq

    ✨ Features

    • 🎵 High-Quality Songs - Download songs in AAC 256kbps and other codecs
    • 🎬 High-Quality Music Videos - Download music videos in resolutions up to 4K
    • 📝 Synced Lyrics - Download synced lyrics in LRC, SRT, or TTML formats
    • 🏷️ Rich Metadata - Automatic tagging with comprehensive metadata
    • 🎤 Artist Support - Download all albums or music videos from an artist
    • ⚙️ Highly Customizable - Extensive configuration options for advanced users

    📋 Prerequisites

    Required

    Optional Dependencies

    Wrapper

    Run the Wrapper v2 server for wrapper-backed account, playback, and decryption requests. Enable it with --use-wrapper or use_wrapper = true. Configure wrapper HTTP account/playback calls with --wrapper-url or wrapper_url, and configure WV2D batch TCP decrypt with --wrapper-decrypt-host / --wrapper-decrypt-port.

    gamdl builds a private Rust extension from gamdl/downloader/ammuxer as gamdl._ammuxer. That native media engine handles wrapper TCP decrypt/reassembly plus MP4/M4A writing and muxing; Python remains responsible for the CLI, downloads, metadata tagging, and high-level orchestration.

    The wrapper is recommended when using the alac song codec. ALAC can be attempted without wrapper, but it probably won't work due to API limitations.

    Note:

    • When using the Wrapper, you'll be asked to insert your credentials to login if you haven't already.
    • Newer wrapper-v2 builds use HTTP JSON for account/playback and WV2D batch TCP port 10020 for decrypt.
    • For music videos, wrapper playback can provide additional metadata when available from Apple, including sort title (sonm), sort artist (soar), sort album (soal), composer (©wrt), composer ID (cmID), composer sort (soco), comments (©cmt), gapless (pgap), and XID (xid ).
    • Song codecs other than alac do not require the wrapper.
    • Cookies can be skipped when using the wrapper.
    N_m3u8DL-RE

    Use N_m3u8DL-RE as a faster download alternative to the default yt-dlp download mode. Enable it with --download-mode nm3u8dlre or download_mode = nm3u8dlre.

    If the executable is not available in your system PATH, set its location with --nm3u8dlre-path or nm3u8dlre_path.

    N_m3u8DL-RE also needs FFmpeg. If the FFmpeg executable is not available in your system PATH, set its location with --ffmpeg-path or ffmpeg_path.

    📦 Installation

    1. Install Gamdl via pip:

      pip install gamdl
      
    2. Set up the cookies file:

      • Place the cookies file in the working directory as cookies.txt, or
      • Specify the path using --cookies-path or in the config file
    3. Optional: Set up dependencies (only if you need the functionality) See the Optional Dependencies section to determine which optional tools you need.

    🚀 Usage

    gamdl [OPTIONS] URLS...
    

    Supported URL Types

    • Songs (Catalog/Library)
    • Albums (Catalog/Library)
    • Playlists (Catalog/Library)
    • Music Videos (Catalog/Library)
    • Artists
    • Post Videos
    • Apple Music Classical

    Examples

    Download a song:

    gamdl "https://music.apple.com/us/album/never-gonna-give-you-up-2022-remaster/1624945511?i=1624945512"
    

    Download an album:

    gamdl "https://music.apple.com/us/album/whenever-you-need-somebody-2022-remaster/1624945511"
    

    Download from an artist:

    gamdl "https://music.apple.com/us/artist/rick-astley/669771"
    

    Interactive Prompt Controls:

    KeyAction
    Arrow keysMove selection
    SpaceToggle selection
    Ctrl + ASelect all
    EnterConfirm selection

    ⚙️ Configuration

    Configure Gamdl using command-line arguments or a config file.

    Config file location:

    • Linux: ~/.gamdl/config.ini
    • Windows: %USERPROFILE%\.gamdl\config.ini

    The file is created automatically on first run. Command-line arguments override config values.

    Configuration Options

    OptionDescriptionDefault
    General Options
    --read-urls-as-txt, -rRead URLs from text filesfalse
    --config-pathConfig file path<home>/.gamdl/config.ini
    --log-levelLogging levelINFO
    --log-fileLog file path-
    --no-exceptionsDon't print exceptionsfalse
    --artist-auto-selectAutomatically select artist content to download (artist URLs)-
    --database-pathPath to the SQLite database file for registering downloaded media-
    --no-config-file, -nDon't use a config filefalse
    Apple Music Options
    --cookies-path, -cCookies file path./cookies.txt
    --wrapper-urlWrapper HTTP control base URLhttp://127.0.0.1
    --wrapper-decrypt-hostWrapper TCP decrypt host127.0.0.1
    --wrapper-decrypt-portWrapper TCP decrypt port10020
    --language, -lMetadata languageen-US
    Interface Options
    --cover-formatCover formatjpg
    --cover-sizeCover size in pixels1200
    --drm-backendDRM backend (widevine or playready)widevine
    --wvd-path.wvd file path-
    --prd-path.prd file path-
    --use-wrapperUse wrapper for account, playback, and decryption requestsfalse
    Song Options
    --synced-lyrics-formatSynced lyrics formatlrc
    --song-codec-priorityComma-separated codec priorityaac-web
    --use-album-dateUse album release date for songsfalse
    --no-synced-lyricsDon't download synced lyricsfalse
    --synced-lyrics-onlyDownload only synced lyricsfalse
    Music Video Options
    --music-video-resolutionMax music video resolution1080p
    --music-video-codec-priorityComma-separated codec priorityh264,h265
    --music-video-remux-formatMusic video remux formatm4v
    Post Video Options
    --uploaded-video-qualityPost video qualitybest
    Download & Path Options
    --output-path, -oOutput directory path./Apple Music
    --temp-pathTemporary directory path.
    --nm3u8dlre-pathN_m3u8DL-RE executable pathN_m3u8DL-RE
    --ffmpeg-pathFFmpeg executable pathffmpeg
    --download-modeDownload modeytdlp
    Template Options
    --album-folder-templateAlbum folder template{album_artist}/{album}
    --compilation-folder-templateCompilation folder templateCompilations/{album}
    --no-album-folder-templateNo album folder template{artist}/Unknown Album
    --playlist-folder-templatePlaylist folder templatePlaylists/{playlist_artist}
    --single-disc-file-templateSingle disc file template{track:02d} {title}
    --multi-disc-file-templateMulti disc file template{disc}-{track:02d} {title}
    --no-album-file-templateNo album file template{title}
    --playlist-file-templatePlaylist file template{playlist_title}
    --date-tag-templateDate tag template%Y-%m-%dT%H:%M:%SZ
    --exclude-tagsComma-separated tags to exclude-
    --truncateMax filename length-
    File Output Options
    --overwriteOverwrite existing filesfalse
    --save-cover, -sSave cover as separate filefalse
    --save-playlistSave M3U8 playlist filefalse

    Template Variables

    Tags for templates and exclude-tags:

    • album, album_artist, album_id
    • artist, artist_id
    • composer, composer_id
    • date (supports strftime format: {date:%Y})
    • disc, disc_total
    • media_type
    • playlist_artist, playlist_id, playlist_title, playlist_track
    • title, title_id
    • track, track_total

    Tags for exclude-tags only:

    • album_sort, artist_sort, composer_sort, title_sort
    • comment, compilation, copyright, cover, gapless, genre, genre_id, lyrics, rating, storefront, xid
    • all (special: skip all tagging)

    Logging Level

    • DEBUG, INFO, WARNING, ERROR

    Download Mode

    • ytdlp, nm3u8dlre

    [!NOTE]

    • yt-dlp is only used as a file download library. Media is still fetched directly from Apple Music's servers, and yt-dlp is only responsible for handling the file download process.

    Cover Format

    • jpg
    • png
    • raw - Raw format as provided by the artist (requires save_cover to be enabled as it doesn't embed covers into files)

    DRM Backend

    • widevine
    • playready

    [!NOTE]

    • Widevine is the default DRM backend and uses the built-in WVD when --wvd-path is not set.
    • PlayReady requires providing a .prd device with --prd-path.
    • When --use-wrapper is enabled, compatible FairPlay streams are decrypted through wrapper. Streams that cannot use wrapper fall back to the selected --drm-backend.
    • 4K music videos require either a Widevine L1 .wvd device or a PlayReady SL3000 (SL3K) .prd device.

    Metadata Language

    Use ISO 639-1 language codes (e.g., en-US, es-ES, ja-JP, pt-BR). Don't always work for music videos.

    Song Codecs

    Web:

    • aac-web - AAC 256kbps 44.1kHz
    • aac-he-web - AAC-HE 64kbps 44.1kHz

    Non-web (alac can be attempted without wrapper, but it probably won't work due to API limitations):

    • aac - AAC 256kbps up to 48kHz
    • aac-he - AAC-HE 64kbps up to 48kHz
    • aac-binaural - AAC 256kbps binaural
    • aac-downmix - AAC 256kbps downmix
    • aac-he-binaural - AAC-HE 64kbps binaural
    • aac-he-downmix - AAC-HE 64kbps downmix
    • atmos - Dolby Atmos 768kbps
    • ac3 - AC3 640kbps
    • alac - ALAC up to 24-bit/192kHz
    • ask - Interactive codec selection

    Synced Lyrics Format

    • lrc
    • srt - SubRip subtitle format (more accurate timing)
    • ttml - Native Apple Music format (not compatible with most media players)

    Music Video Codecs

    • h264
    • h265
    • ask - Interactive codec selection

    Music Video Resolutions

    • H.264: 240p, 360p, 480p, 540p, 720p, 1080p
    • H.265 only: 1440p, 2160p

    Music Video Remux Formats

    • m4v, mp4

    Post Video Quality

    • best - Up to 1080p with AAC 256kbps
    • ask - Interactive quality selection

    Artist Auto-Select Options

    • main-albums
    • compilation-albums
    • live-albums
    • singles-eps
    • all-albums
    • top-songs
    • music-videos

    🐍 Embedding

    Use Gamdl as a library in your Python projects:

    import asyncio
    
    from gamdl.api import AppleMusicApi
    from gamdl.downloader import (
        AppleMusicBaseDownloader,
        AppleMusicDownloader,
        AppleMusicMusicVideoDownloader,
        AppleMusicSongDownloader,
        AppleMusicUploadedVideoDownloader,
    )
    from gamdl.interface import (
        AppleMusicBaseInterface,
        AppleMusicInterface,
        AppleMusicMusicVideoInterface,
        AppleMusicSongInterface,
        AppleMusicUploadedVideoInterface,
    )
    
    
    async def main():
        # Create AppleMusicApi instance from cookies
        apple_music_api = await AppleMusicApi.create_from_netscape_cookies(
            cookies_path="cookies.txt",
        )
    
        # Check subscription
        if not apple_music_api.active_subscription:
            print("No active Apple Music subscription")
            return
    
        # Create base interface
        base_interface = await AppleMusicBaseInterface.create(
            apple_music_api=apple_music_api,
        )
    
        # Create specialized interfaces
        song_interface = AppleMusicSongInterface(
            base=base_interface,
        )
        music_video_interface = AppleMusicMusicVideoInterface(
            base=base_interface,
        )
        uploaded_video_interface = AppleMusicUploadedVideoInterface(
            base=base_interface,
        )
    
        # Create main interface
        interface = AppleMusicInterface(
            song=song_interface,
            music_video=music_video_interface,
            uploaded_video=uploaded_video_interface,
        )
    
        # Create base downloader
        base_downloader = AppleMusicBaseDownloader(
            interface=interface,
        )
    
        # Create specialized downloaders
        song_downloader = AppleMusicSongDownloader(base=base_downloader)
        music_video_downloader = AppleMusicMusicVideoDownloader(
            base=base_downloader,
        )
        uploaded_video_downloader = AppleMusicUploadedVideoDownloader(base=base_downloader)
    
        # Create main downloader
        downloader = AppleMusicDownloader(
            song=song_downloader,
            music_video=music_video_downloader,
            uploaded_video=uploaded_video_downloader,
        )
    
        # Download from URL
        url = "https://music.apple.com/us/album/never-gonna-give-you-up-2022-remaster/1624945511?i=1624945512"
    
        download_queue = []
        async for media in downloader.get_download_item_from_url(url):
            download_queue.append(media)
    
        for download_item in download_queue:
            try:
                await downloader.download(download_item)
            except Exception as e:
                print(f"Error downloading: {e}")
    
    
    if __name__ == "__main__":
        asyncio.run(main())
    

    📄 License

    MIT License - see LICENSE file for details

    🤝 Contributing

    Currently, I'm not interested in reviewing pull requests that change or add features. Only critical bug fixes will be considered. However, feel free to open issues for bugs or feature requests.