12 KiB
Executable File
name, description
| name | description |
|---|---|
| musicdl | Use and configure the musicdl NetEase Cloud Music command-line downloader. Use when Codex needs to explain or operate song, playlist, artist, album, lyric, cover, metadata, history, M3U, archive, cleanup, rename, preview, or batch-download features in `163_music_downloader.js`, including `config.json`, interactive menu choices, command-line flags, quality selection, Linux and Windows paths, output naming, optional tools, and troubleshooting. |
使用 Musicdl
快速开始
在 163_music_downloader.js 所在目录运行 Node.js:
# 打开中文交互菜单
node 163_music_downloader.js
# 下载一首或多首歌曲
node 163_music_downloader.js 歌曲ID
node 163_music_downloader.js 歌曲ID1 歌曲ID2 歌曲ID3
# 下载整个歌单或专辑
node 163_music_downloader.js --playlist=歌单ID
node 163_music_downloader.js --album=专辑ID
从网易云歌曲、歌单或专辑网页地址中取得对应数字 ID。需要精确下载完整专辑时优先使用专辑 ID;按名称搜索只能覆盖接口返回的搜索结果。
准备运行环境
必须准备:
- Node.js;脚本只使用内置模块,不要求项目存在
package.json。 - 可访问
config.json中音乐接口及网易云接口的网络环境。 - 下载目录的创建和写入权限。
按需准备:
- 安装可被当前脚本解析到的
node-id3,为 MP3 写入封面、歌词和 ID3 标签。 - 将
ffmpeg加入PATH,为 FLAC 等非 MP3 文件写入封面和标签,并作为 MP3 的后备工具。 - 将
mpv、ffplay、play、cvlc或aplay加入PATH,使用试听和本地播放功能。 - 在 Windows 上注意播放器检测使用
which,即使已经安装播放器也可能检测不到;此时直接复制显示的音频 URL 到播放器。 - 准备系统
zip命令以输出 ZIP;缺少zip时脚本尝试使用tar输出.tar.gz。
缺少可选工具不会阻止音频下载;相关封面嵌入、标签或播放能力会降级。
配置 config.json
在脚本同目录编辑 config.json:
{
"api": {
"music": "https://api.chksz.top/api/163_music",
"lyric": "https://api.chksz.top/api/163_lyric",
"search": "https://api.chksz.top/api/163_search",
"playlist": "https://api.chksz.top/api/163_playlist",
"neteaseBaseUrl": "https://music.163.com"
},
"paths": {
"downloadDir": "downloads",
"historyFile": "download_history.json",
"runtimeConfigFile": "downloader_config.json",
"trashDir": ".trash",
"tempZipDir": ".tmp_zip"
},
"defaults": {
"quality": "jymaster",
"retries": 3,
"historyLimit": 500
}
}
按以下规则设置:
- 使用
api.music获取音频地址和基础歌曲信息。 - 使用
api.lyric获取原文和翻译歌词。 - 使用
api.search搜索歌曲、歌手和专辑。 - 使用
api.playlist获取歌单曲目。 - 使用
api.neteaseBaseUrl获取歌曲、专辑、发行时间和曲序等详细元数据。 - 使用
paths.downloadDir设置音频和歌词根目录。 - 使用
paths.historyFile设置下载历史 JSON。 - 使用
paths.runtimeConfigFile保存交互菜单选择的音质;不要把它与静态config.json设为同一文件。 - 使用
paths.trashDir设置软删除目录。 - 使用
paths.tempZipDir设置歌单打包临时目录。 - 使用
defaults.quality设置初始音质。 - 使用
defaults.retries设置单曲默认尝试次数。 - 使用
defaults.historyLimit设置历史记录上限。
使用相对路径时,以脚本所在目录为基准。也可直接使用绝对路径:
{
"paths": {
"downloadDir": "/mnt/storage/music"
}
}
Linux 使用 /home/user/Music、/mnt/storage/music 等绝对路径;Windows 在 JSON 中将反斜杠写成双反斜杠,例如 D:\\Music\\Downloads。目录不存在时由脚本递归创建。配置缺失、无法解析或字段无效时使用脚本内置默认值。
选择音质
使用以下音质标识:
standard:标准音质。exhigh:极高音质。lossless:无损音质。hires:Hi-Res。jymaster:超清母带,默认值。sky:空间音频。jyeffect:高清臻品。
接口可能按歌曲实际可用资源返回低于请求值的音质。交互模式使用菜单 0 保存常用音质;命令行使用 --level=<音质> 临时覆盖。
使用命令行批处理
命令行只要出现歌曲 ID、--playlist 或 --album,就直接进入批处理模式并跳过菜单:
# 单曲和多首歌曲
node 163_music_downloader.js 123456
node 163_music_downloader.js 123456 234567 345678
# 歌单
node 163_music_downloader.js --playlist=123456789
# 完整专辑
node 163_music_downloader.js --album=123456
# 组合选项
node 163_music_downloader.js --album=123456 --level=lossless --retries=5
node 163_music_downloader.js 123456 --no-lyric --no-cover
可用参数:
--playlist=<ID>:下载歌单全部曲目。--album=<ID>:从网易云专辑接口读取并下载全部曲目。--level=<音质>:覆盖本次批处理音质。--retries=<次数>:覆盖单曲失败尝试次数。--no-lyric:不下载.lrc文件。--no-cover:不嵌入封面和标签。
允许在一次命令中同时提供专辑、歌单和单曲 ID;脚本依次处理。批量曲目之间保留约 500ms 间隔。
使用交互菜单
运行 node 163_music_downloader.js 后输入菜单键。
搜索与下载
1搜索歌曲并下载:输入关键词,查看歌曲、歌手和专辑,选择一个或多个结果后选择音质下载。2按歌曲 ID 下载:输入单个 ID,或用逗号分隔多个 ID。3下载整个歌单:输入歌单 ID,确认曲目数量和音质后逐首下载。4查看歌单并选择下载:列出歌单曲目;输入a下载全部,或输入1,3,5、5-10等序号组合。6按歌手批量下载:输入歌手名和搜索数量;下载全部匹配结果或指定序号、序号范围。s按歌名搜索:列出搜索结果;输入序号下载,输入a下载全部,输入v3试听第 3 首,输入d3查看第 3 首详情。a下载专辑:输入专辑 ID 可获取完整曲目;也可输入专辑名,从有限搜索结果中选择一个或多个专辑分组。b批量 ID 下载:连续输入逗号、空格或换行分隔的 ID,输入空行结束;自动去重、统计成功与失败,并可重试失败项目。f从文件批量下载:读取每行一个歌曲 ID 或歌手 - 歌名的文本文件;名称条目先搜索匹配,再统一确认下载。
歌词、试听与详情
5查看歌词:输入歌曲 ID,显示去除时间标签后的歌词;按提示保存原文.lrc和合并翻译歌词。7试听歌曲:输入歌曲 ID,取得标准音质地址并调用本地播放器;未检测到播放器时显示 URL。8查看歌曲详情:显示歌曲 ID、歌手、专辑、时长、别名、曲号、碟号、热度、发行日期、发行公司、专辑歌手、流派、不同音质信息和部分专辑简介。
本地文件与标签
l查看已下载歌曲:按修改时间列出下载根目录中的音频文件和大小;输入p+序号播放,输入d+序号软删除,输入da移动全部文件到回收站。当前列表只扫描下载根目录,不递归展示专辑子目录。n从文件名识别并补全标签:识别歌手 - 歌名.mp3、歌手-歌名.flac等名称;选择文件后搜索最佳歌曲,补全标签和歌词,并按标准名称重命名。g自动补全标签:扫描下载根目录中符合歌手 - 歌名且缺少歌词的音频,搜索匹配项并补全封面、标签、歌词和历史记录。w重命名歌曲:输入序号,分别确认歌手和歌名;同时重命名关联.lrc文件。此功能存在于脚本中,但当前主菜单没有显示w提示,可直接输入使用。
l、n、g、w 目前只扫描 downloadDir 顶层,不递归处理按歌手/专辑存放的专辑文件。
历史、列表与统计
9查看下载历史:显示最近 30 条和总数;输入d删除指定记录,输入c清空全部记录。删除历史不会删除音频文件。e导出历史:选择 CSV、JSON 或 TXT;结果保存到脚本目录并带时间戳。t查看统计:显示累计歌曲数、总大小、音质分布、下载最多的歌手和最近 7 天下载量。m保存歌单为 M3U:优先写入已存在的本地歌曲路径,未下载歌曲使用配置的音乐 API 作为网络备用地址;M3U 保存到脚本目录。
打包、清理与设置
z下载歌单并打包:把歌单歌曲下载到临时目录,优先生成 ZIP,缺少zip时尝试生成.tar.gz;成功或失败后清理本次临时目录。此流程只打包音频,不执行标准歌词和标签下载流程。c清理缓存:删除配置的临时打包目录和孤立的.cover.jpg、.tmp.*文件;清空回收站前再次询问。0设置音质:输入序号或音质名称,并写入运行时配置文件。p暂停或恢复批量下载:只在交互模式且终端支持 TTY 按键事件时可靠工作;正在执行的单首网络下载不会立即中断,下一次暂停检查点才会生效。r重置设置:删除运行时配置并恢复config.json指定的默认音质;随后选择是否保留下载历史。不会删除静态config.json或已下载音频。h显示内置帮助。q退出程序;也可以输入exit或quit。
理解输出文件
普通单曲、歌单和歌手批量下载默认保存为:
downloadDir/
├── 歌手 - 歌名.flac
├── 歌手 - 歌名.lrc
└── 歌手 - 歌名.合并翻译.lrc
专辑下载保存为:
downloadDir/
└── 专辑歌手/
└── 专辑名/
├── 01. 歌曲名.flac
├── 01. 歌曲名.lrc
├── 01. 歌曲名.合并翻译.lrc
├── 02. 歌曲名.flac
└── ...
按接口返回的专辑曲目顺序编号,至少补齐两位;曲目超过 99 首时使用三位编号。根据实际下载 URL 决定 .mp3、.flac、.m4a、.wav 或 .aac 扩展名,不强制转换格式。自动清理歌手、专辑和歌曲名中的非法路径字符。
歌词处理规则:
- 将原文保存为同名
.lrc。 - 存在翻译时,按时间戳交错合并原文和译文,另存
.合并翻译.lrc。 - 嵌入标签时使用原文歌词,并尝试从歌词头提取作词、作曲、编曲和制作人信息。
封面和标签规则:
- MP3 优先使用
node-id3。 - FLAC 等格式或缺少
node-id3时尝试使用ffmpeg。 - 尝试写入标题、歌手、专辑、专辑歌手、曲号、碟号、发行年份、完整日期、流派、发行公司、歌词和封面。
- 在处理结束后清理临时
.cover.jpg。
理解重复下载与历史
下载前检查目标文件名:
- 已有文件与接口文件大小差异低于 1% 时跳过音频下载,并尝试补齐缺少的歌词或封面标签。
- 大小差异明显时直接覆盖同名音频。
- 每次完成流程后将记录写入历史文件,最新记录位于最前,并按
historyLimit截断。 - 专辑历史中的
file字段保存相对于downloadDir的歌手、专辑和文件路径。
删除本地文件时优先使用菜单 l 的软删除功能,将音频和关联歌词移动到 trashDir。菜单中“删除全部”的提示文字较强,但实现仍是移动到回收站;使用 c 清空回收站后才不可恢复。
处理常见问题
- 出现接口错误或无搜索结果时,检查
config.json接口地址和网络连通性,再确认 ID 类型是否正确。 - 请求高音质却得到较低音质时,以接口返回的实际音质为准;歌曲可能没有对应资源。
- 没有封面或标签时,确认
node-id3可被 Node.js 解析,或确认ffmpeg在PATH中。 - 无法试听时,确认播放器在
PATH中;Windows 可直接使用脚本显示的音频 URL。 - Linux 绝对下载目录无法写入时,检查运行脚本用户对目标目录及其父目录的权限。
- 专辑名称搜索缺歌时,改用准确的专辑 ID 和
--album=<ID>。 - 本地文件列表看不到专辑歌曲时,直接查看
downloadDir/歌手/专辑;当前管理菜单不递归扫描。 - 配置文件损坏时,修复 JSON 语法;脚本读取失败会回退到内置默认配置并显示警告。