# 多音源批量音乐下载器(ezmusicd)

支持多音乐平台的批量下载工具,PyQt5 图形界面,可扩展新音源。

音源搜索歌单导入音频直链歌词
歌曲吧 gequba.com支持-完整音频(m4a/mp3)-
INMP3 inmp3.com支持-完整音频(多为 mp3)支持
Hi歌曲 higequ.com支持-完整音频(多为 mp3)支持
网易云音乐 music.163.com支持支持免费歌曲;VIP 仅试听片段支持
酷狗音乐 kugou.com-支持仅解析歌单,音频走回退链-

网易云的 VIP/数字专辑歌曲只返回试听片段,工具不会下载片段,而是保留网易云的歌名/歌手/歌词信息,按「歌曲吧 → INMP3 → Hi歌曲」顺序回退搜索并下载完整音频。酷狗同理:只解析歌单拿到歌名/歌手,音频由回退链下载(酷狗接口对绝大多数曲目返回空直链)。

功能

* 多音源搜索、分页浏览,结果表标注来源
* 网易云歌单导入:粘贴歌单链接或 id,一次载入整张歌单
* 批量粘贴关键词(每行 歌名 或 歌名 - 歌手),自动匹配最佳结果
* 多线程下载(1–8 线程)、实时进度/速度、暂停与继续
* 断点续传(.part + HTTP Range)、失败重试、直链过期自动重新解析
* 可选歌词下载(网易云 .lrc,与音频同名)
* 本机装有 ffmpeg 时默认把 M4A/AAC 转成 320k MP3

界面交互

* 音源:搜索行左侧的下拉框选择当前音源;歌单导入按链接自动识别(网易云 / 酷狗)。选择「酷狗音乐」时搜索控件会自动禁用,用「导入歌单…」。
* 搜索结果:勾选左侧复选框选择歌曲,双击整行或按空格也能勾选/取消;顶部有「全选本页 / 清空选择」,并实时显示已选数量与来源。
* 加入队列:优先使用勾选的行;没有勾选时使用当前选中行;二者都没有时只提示不误操作。
* 导入歌单:粘贴网易云 / 酷狗歌单链接或 id(每行一个),可勾选"解析完成后全部加入队列并开始下载"。
* 下载队列:按钮作用于选中行,Delete 移除,右键菜单支持打开目录、重试、取消、移除;每行有独立进度条,底部是总进度与日志。

运行

# 安装依赖(PyQt5 + AES 解密库)
pip install -r requirements.txt

# 图形界面
python ezmusicd_gui.py
# 或
python -m ezmusicd

命令行模式: # 歌单导入下载(网易云,自动回退完整音源) python ezmusicd_gui.py --cli -p "https://music.163.com/playlist?id=18434148858" # 酷狗歌单导入(只解析歌单,音频走回退链) python ezmusicd_gui.py --cli -p "https://m.kugou.com/songlist/gcid_3z9kil66z1fz01a/" # 指定网易云音源搜索下载,不下载歌词 python ezmusicd_gui.py --cli --provider netease -q "Because Of You - Ne-Yo" --no-lyrics # 歌曲吧 / INMP3 音源按关键词批量下载 python ezmusicd_gui.py --cli --provider gequba -q "放生 - 范逸臣" -n 2 -o downloads -w 4 python ezmusicd_gui.py --cli --provider inmp3 -q "Piano - FIOS" python ezmusicd_gui.py --cli --provider higequ -q "Piano"

常用参数:--provider、-p/--playlist、-q/--query、-r/--rid、-f/--file、-n/--limit、-o/--out、-w/--workers、--no-lyrics、--no-convert、--no-skip。界面设置保存在 config.json。

打包(Nuitka 单文件)

# 精简版:约 22.5 MB,目标机器需自备 ffmpeg 才能把 m4a/aac 转 MP3
powershell -ExecutionPolicy Bypass -File build_nuitka.ps1

# 内置转换器版:约 45.5 MB,目标机器无需安装 ffmpeg
powershell -ExecutionPolicy Bypass -File build_nuitka.ps1 -BundleFfmpeg

* 精简版 dist\ezmusicd.exe:目标机器没有 ffmpeg 时下载不受影响,只是M4A/AAC 会保留原格式("转 MP3" 选项自动禁用),MP3 直链音源照常输出 MP3
* 完整版 dist\ezmusicd-full.exe:内置 gyan essentials ffmpeg(约 84 MB,onefile 压缩后整包 45.5 MB),任何机器都能转 320k MP3;转换器找不到时会依次查内置 vendor/ffmpeg → 系统 PATH
* 时长校验在没有 ffprobe 时自动改用 ffmpeg -i 输出解析,所以完整版只需内置一个 ffmpeg.exe
* 体积优化:排除 pytest / tkinter / PIL / cryptography 等未用依赖,--python-flag=no_docstrings,no_asserts 去文档串和断言,LTO + onefile 压缩
* 打包脚本会自动生成应用图标(tools/make_icon.py),并写入 exe 图标与版本信息
* 内置转换器由 tools/fetch_ffmpeg.py 自动获取(PyPI 的 imageio-ffmpeg wheel),也可以手动把 ffmpeg.exe 放进 vendor/ffmpeg/
* 首次启动会把单文件解压到缓存目录(--onefile-tempdir-spec 控制);config.json生成在 exe 同目录
* 需要 MSVC(VS 2022 Build Tools,脚本用 --msvc=latest)或 MinGW;构建中间产物已用 --remove-output 清理

接口分析(2026-10 实测)

歌曲吧 gequba.com

用途请求说明
搜索GET /s/{关键词}[/{页码}]a.hover-zoom[href*="/songs/"],title 属性是 歌名 - 歌手,每页 20 条
歌曲页GET /songs/{32位hash}window.appData 含 play_id、mp3_type 等
播放地址POST /api/geturlHMAC-SHA256 签名 + 双层 base64 + AES-256-CBC 解密得到 CDN 直链
音频kw-*.kuwo.cn/.../C200001xxx.m4a支持 Range;ffmpeg 可转 320k MP3

INMP3 inmp3.com

用途请求说明
搜索GET /so/{关键词}/{页码}/div.result-item[data-rid] 含 .result-title、.result-artist、.result-album,总页数在 span#total-pages
歌曲页GET /song/{rid}/#music-title / #music-artist / #album-cover,let code = "" 解码即直链
音频kw-*.kuwo.cn/.../M5000xxx.mp3多为 mp3,支持 Range
歌词歌曲页 div.lyric-line[data-time]直接转成 LRC

Hi歌曲 higequ.com 与 INMP3 同模板:搜索 GET /s/{关键词}/{页码}/,歌曲页 GET /player/{rid}/,直链与歌词解析方式完全一致(共用 providers/template_site.py)。

网易云音乐 music.163.com

用途请求说明
歌单GET /api/v6/playlist/detail?id={id}&n=1000返回歌单名、封面、歌曲列表(trackIds 兜底批量拉详情)
搜索GET /api/search/get?s={词}&type=1&offset=&limit=返回 result.songs 与总数
歌曲信息GET /api/song/detail?ids=[{id}]歌名、歌手、专辑、时长、封面
播放地址GET /api/song/enhance/player/url/v1?ids=[{id}]&level=exhigh&encodeType=mp3免费歌曲返回直链;VIP 返回 freeTrialInfo(试听片段,弃用并回退)
歌词GET /api/song/lyric?id={id}&lv=1&kv=1&tv=-1返回 LRC 文本

酷狗音乐 kugou.com(仅歌单)

用途请求说明
歌单页GET https://m.kugou.com/songlist/{gcid}/内嵌 window.$output JSON:歌单名、总数、specialid 与首批歌曲
完整列表GET http://mobilecdn.kugou.com/api/v3/special/song?specialid={id}&page={n}&pagesize=30&version=9108filename 为 歌手 - 歌名,含 hash、duration;与页面数据按 hash 合并去重
音频-酷狗接口对 VIP/付费曲目返回空直链,统一走回退链下载

扩展新音源

  • 在 ezmusicd/providers/ 新建模块,继承 MusicProvider: from .base import MusicProvider, SearchPage, SongInfo class ExampleProvider(MusicProvider):


  • key = "example"
    label = "示例平台"
    supports_playlist = False
    supports_lyrics = False

    def search(self, keyword: str, page: int = 1) -> SearchPage: ...
    def get_song(self, rid: str) -> SongInfo: ...

  • 在 ezmusicd/providers/__init__.py 的 _REGISTRY 注册这个类。


  • 需要歌单/歌词时实现 parse_playlist / get_lyrics 并把对应的supports_playlist、supports_lyrics 置为 True。


  • 站点与 INMP3/Hi歌曲 同模板时更省事:直接继承 TemplateSiteProvider,只填 base_url、search_prefix、song_path 三个类属性即可。
  • 搜索、下载队列、GUI 下拉框会自动带上新音源;若音源没有完整直链,get_song 返回空 direct_url 与 fallback_query,管理器会自动到fallback_providers(默认按「歌曲吧 → INMP3 → Hi歌曲」顺序)下载完整音频。

    目录结构

    ezmusicd/
    api.py # 兼容层:公共数据结构 + 音源注册表
    providers/
    base.py # MusicProvider 接口与数据结构
    gequba.py # 歌曲吧音源(签名 + AES 解密)
    template_site.py # 同模板站点基类(搜索 / base64 直链 / 歌词)
    inmp3.py # INMP3 音源
    higequ.py # Hi歌曲音源
    netease.py # 网易云音源(歌单 / 歌词 / 试听检测)
    kugou.py # 酷狗音源(仅歌单解析)
    download.py # 线程池、断点续传、回退、歌词落盘、转码
    gui.py # PyQt5 界面
    cli.py # 命令行入口
    util.py # 文件名净化、格式化、ffmpeg 封装
    tests/ # pytest 单元测试

    运行测试:python -m pytest -q

    常见问题

    * 网易云歌曲只下载到试听片段? 不会。检测到 freeTrialInfo 时直接按「歌曲吧 → INMP3 → Hi歌曲」链式回退下载完整音频;回退时会自动尝试「简化歌名 → 歌名+歌手 → 原查询」多个关键词变体,日志里会写明"已通过 歌曲吧/INMP3/Hi歌曲 获取完整音频"。
    * 回退下载会不会搜到片段或翻唱? 有两道校验:下载完成后用 ffprobe对比网易云时长,明显偏短(低于 60%)的片段会被删除并自动尝试下一个候选;候选里也会过滤掉翻唱歌手,只接受原唱。如果确实没有原唱完整版,任务会明确失败并提示"仅有片段或翻唱",不会拿翻唱冒充原唱。
    * 歌词是空的? 网易云、INMP3、Hi歌曲支持歌词;歌曲吧不支持,会跳过歌词但不影响音频。部分冷门歌曲本身没有歌词。
    * 酷狗为什么不能搜索/没有歌词? 酷狗只用于歌单导入:解析出歌名和歌手后,音频交给回退链(歌曲吧 → INMP3 → Hi歌曲)下载,所以歌词也由回退到的音源提供(若其支持)。
    * 歌曲吧提示签名/解密失败? 站点可能改版,需要重新提取providers/gequba.py 顶部的密钥表(测试里保留了已知向量)。
    * 请求过于频繁(429):客户端自带限速与退避重试。

    免责声明

    请在使用本项目(含代码、文档、构建产物)前完整阅读并理解以下内容;一旦使用,即视为你已阅读、理解并同意本声明全部条款。

    1. 项目性质:本项目是用于学习网络协议、软件架构、加密参数解析与音频处理的个人技术研究项目,按"现状"开源,不构成任何形式的服务、内容提供或技术支持承诺。
    2. 不提供内容:本项目自身不提供、不存储、不上传、不分发任何音频、歌词、封面或其他资源;所有内容均来自使用者在运行时指定的第三方公开页面,仅在使用者本机解析并下载到本地。
    3. 版权与权利归属:音乐、歌词、封面及相关内容的著作权、录音制作者权、表演者权等全部权利,归各自唱片公司、音乐人、词曲作者及其他权利人所有。下载内容的权利不因下载行为而转移给使用者、本项目或其作者。
    4. 不规避技术保护措施:本项目不破解、不绕过任何数字版权管理(DRM)、付费墙、会员/VIP 权限限制或其他技术保护措施。第三方平台仅提供试听片段或付费获取的内容,本项目仅做识别与提示,不提供任何规避手段;请不要通过修改本项目的方式实现上述目的。
    5. 合法使用范围:本项目仅可用于个人学习、技术研究,或对你本人已合法取得的内容进行本地备份。严禁用于商业用途、经营性使用、二次分发、公开传播、售卖、共享账号,或上传至公开网站、网盘、社群,亦不得用于任何侵犯他人合法权益或违反平台规则的场景。
    6. 合规义务:使用者应自行确认并确保其行为符合所在国家/地区适用的法律法规(包括但不限于《中华人民共和国著作权法》《信息网络传播权保护条例》及个人信息、网络安全相关法律)、相关平台的服务条款与 robots 协议。因使用本项目引发的账号封禁、投诉索赔、行政处罚、民事纠纷或刑事责任,均由使用者自行承担,与本项目作者无关。
    7. 第三方服务:本项目通过第三方网站的公开接口获取信息,不对任何第三方网站的内容、可用性或合法性负责。第三方接口、域名、参数随时可能变更或失效,作者不保证相关功能持续、稳定、准确可用,也无义务进行维护或更新。
    8. 请求频率:代码内置请求间隔与失败退避,请勿移除、修改限速逻辑或进行高频、并发抓取,以免对第三方服务造成超出正常访问范围的压力。
    9. 数据与隐私:本项目完全在使用者本机运行,不收集、不上传搜索记录、下载记录、配置或任何个人信息;配置文件仅保存在本地。因使用者自行修改、二次开发或接入其他服务导致的数据泄露,作者不承担责任。
    10. 无担保声明:本项目按"现状"及"现有"基础提供,不对适销性、特定用途适用性、准确性、完整性、不侵权或持续可用性作任何明示或默示担保。使用本项目产生的全部风险由使用者自行承担。
    11. 责任限制:在适用法律允许的最大范围内,对于因使用或无法使用本项目(包括但不限于数据丢失、设备损坏、业务中断、权利纠纷、第三方索赔)导致的任何直接、间接、附 带、惩罚性或后果性损失,本项目作者不承担任何责任。
    12. 商标与标识:文中出现的第三方平台名称(如网易云音乐、酷狗音乐等)及相关商标、标识归其各自权利人所有;本项目与上述平台无任何关联、授权或合作关系,提及仅用于技术说明。
    13. 未成年人使用:未成年人应在监护人指导与同意下方可使用,并由监护人对其使用行为承担责任。
    14. 支持正版:如果你喜欢某首音乐,请通过官方平台购买数字专辑、开通会员或购买实体唱片,支持创作者与正版音乐生态。本项目不应被理解为替代正版消费的途径。
    15. 权利人通知:若任何权利人认为本项目的代码、文档或示例侵犯了你的合法权益,可通过项目公示的联系方式提供权属证明与具体说明,作者在核实后将及时删除或整改相关内容。
    16. 不构成法律意见:本声明仅为风险提示,不构成法律意见或合规结论。如对你自身使用行为的合法性存在疑问,请咨询执业律师等专业人士。
    17. 声明更新与可分性:本声明可能随项目更新而调整,以使用时的最新版本为准;若其中任何条款被认定为无效或不可执行,不影响其余条款的效力。继续使用即视为接受更新后的声明。

    下载

    点击下载 https://luocch.lanzoub.com/i3oxN4apneda密码:vear

    可以赞助一个硬币吗,做这个很不容易的球球了哥哥姐姐义父义母QwQ

    6f247ecf66f0e006698bcffbe148a9fa