如何用Python的yt-dlp手动为下载歌曲指定艺术家元数据?
手动指定yt-dlp下载歌曲的艺术家元数据
你之前使用parse-metadata的方式不符合参数语法,导致无法覆盖艺术家信息。这个参数需要遵循源内容:目标字段的映射规则,用来给指定元数据字段赋值。以下是两种直接有效的实现方式:
方法一:通过FFmpegMetadata后处理器强制设置
直接在FFmpegMetadata后处理器中添加metadata参数,手动指定艺术家(及可选的标题)字段,代码修改如下:
import yt_dlp def download(song, url): # 从传入的song参数拆分艺术家和歌曲名 artist, title = song.split(' - ', 1) ydl_opts = { 'format': 'm4a/bestaudio/best', 'verbose': True, 'outtmpl': f"{song}.%(ext)s", 'merge-output-format': 'mkv', 'embed-metadata': True, # 保留自动获取的其他元数据(如专辑、年份) 'postprocessors': [ { 'key': 'FFmpegExtractAudio', 'preferredcodec': 'aac' }, { 'key': 'FFmpegMetadata', 'metadata': { 'artist': artist, # 强制设置目标艺术家 'title': title # 可选:同步设置歌曲标题 } } ] } with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download(url) download('Daniel Pemberton - Falling Apart', 'https://www.youtube.com/watch?v=Uhx77_beiso&pp=ygUNZmFsbGluZyBhcGFydA%3D%3D')
方法二:用parse-metadata实现字段赋值
如果坚持使用parse-metadata,需要按照正确语法将自定义值映射到元数据字段:
# 在ydl_opts中替换原parse-metadata行 'parse-metadata': [ f'{artist}:%(artist)s', # 将拆分出的艺术家值赋值给元数据artist字段 f'{title}:%(title)s' # 可选:同步赋值标题字段 ],
关键说明
- 原写法
'parse-metadata': '%(artist)s - %(title)s'无效,因为该参数需要明确的“源→目标”映射关系,而非单纯的格式字符串。 embed-metadata会保留yt-dlp自动抓取的其他元数据(如专辑、发行年份),FFmpegMetadata的metadata参数仅覆盖你指定的字段。
内容的提问来源于stack exchange,提问作者Arjun Alwe
相关产品推荐
相关产品推荐

