文章目录
- ytmdl:从 YouTube 下载歌曲并自动补齐元数据
ytmdl:从 YouTube 下载歌曲并自动补齐元数据
ytmdl 是一个 Python 命令行工具,专门用来从 YouTube 下载音乐。它和普通下载工具的区别在于,下载完成后会自动从 iTunes、Spotify、Gaana 等平台抓取歌曲的元数据,包括艺术家、专辑名、发行日期、封面图等信息,一并写入音频文件。
目前这个项目在 GitHub 上获得了 3500 多个 Star。
用 YouTube 下载音乐的人大多遇到过同一个问题:下载下来的文件只有音频,没有歌曲信息。文件名可能是乱码,播放器里显示的是视频标题而不是歌名,专辑封面也没有。手动一个个去编辑这些信息很麻烦,尤其是批量下载的时候。
ytmdl 就是为了解决这个问题而做的。
工作原理
ytmdl 底层调用 youtube-dl 来获取 YouTube 视频的音频流。下载完成后,它会用你输入的歌曲名称去多个元数据源搜索匹配的结果。找到匹配的元数据后,自动写入到音频文件的 ID3 标签里。
整个过程中用户可以手动选择搜索结果,也可以用--quiet参数让工具自动选第一个匹配项。
支持的元数据源
ytmdl 支持从以下平台获取歌曲信息:
- iTunes
- Spotify
- Gaana
可以通过配置文件指定使用哪些元数据源,也可以通过--itunes-id或--spotify-id参数直接指定 ID 进行精确查找。
输出格式
默认输出 mp3 格式,也支持 m4a 和 opus。可以通过--format参数或配置文件来修改。
ytmdl 还支持动态目录结构。比如配置SONG_DIR为/音乐$Album->Artist->Title,下载的文件就会自动按「专辑/艺术家/歌名.mp3」的层级存放。
播放列表支持
除了单首歌曲,ytmdl 也能处理 YouTube 播放列表。直接把播放列表的 URL 当作参数传入即可。还可以用--pl-start、--pl-end、--pl-items来指定下载范围,比如只下载列表中的第 1、3、5 首。
下载播放列表时如果某首歌失败了,加--ignore-errors参数可以跳过错误继续下载后面的。
安装方式
ytmdl 支持多种安装方式。
通过 pip 安装:
pip install ytmdlArch Linux 用户可以从 AUR 安装:
yay -S ytmdlNixOS 用户:
nix-env -iA nixos.ytmdlWindows 用户需要先安装 ffmpeg,然后用 pip 安装 ytmdl。ffmpeg 的二进制文件从官网下载后,把所在目录加到系统 PATH 里就行。
安装完成后,第一次运行 ytmdl 会自动在~/.config/ytmdl/下生成配置文件。
基本用法
下载一首歌:
ytmdl "歌名"指定输出目录:
ytmdl "歌名" -o /path/to/save从指定的 YouTube 链接下载:
ytmdl --url "https://youtube.com/watch?v=xxxxx"批量下载,把歌名写在一个文本文件里,一行一首:
ytmdl --list songs.txt跳过元数据,只下载音频:
ytmdl --skip-meta "歌名"手动输入元数据信息:
ytmdl --manual-meta "歌名"配置选项
配置文件位于~/.config/ytmdl/config,可以修改以下默认值:
| 配置项 | 说明 | 默认值 |
|---|---|---|
| SONG_DIR | 歌曲保存目录 | 当前目录 |
| SONG_QUALITY | 音频质量 | 320kbps |
| METADATA_PROVIDERS | 元数据源 | 全部 |
| DEFAULT_FORMAT | 默认格式 | mp3 |
| ON_META_ERROR | 元数据写入失败时的处理 | exit |
| ITUNES_COUNTRY | iTunes 搜索区域 | US |
| SPOTIFY_COUNTRY | Spotify 搜索区域 | US |
其他功能
ytmdl 支持音频裁剪。加--trim参数后,会用语音和音乐分割引擎识别出歌曲的起止位置,去掉开头和结尾的非音乐部分。这个功能在视频包含开场白或结尾杂音时比较实用。
工具还提供了日志级别控制,通过--level参数可以调整日志详细程度。
ytmdl 的开发维护状态正常,代码开源在 GitHub 上,采用 MIT 协议。
或结尾杂音时比较实用。
工具还提供了日志级别控制,通过--level参数可以调整日志详细程度。
ytmdl 的开发维护状态正常,代码开源在 GitHub 上,采用 MIT 协议。
[外链图片转存中…(img-N7uMtsAS-1782450554626)]