如何正确获取youtube_dl下载文件的实际存储路径
核心解法
根本不需要手动根据outtmpl规则拼接路径字符串,YoutubeDL类本身就提供了专门生成最终保存路径的内置方法,这是最简洁、完全适配所有自定义配置的方案。
你之前的实现存在两个固有问题:
- 手动拼接的逻辑和outtmpl配置强绑定,只要调整outtmpl规则(比如新增输出目录、添加自定义模板字段),拼接代码就会直接失效。
- 依赖
yinfo['ext']拼路径时,拿到的是原始媒体流的扩展名,不是最终合并文件的扩展名。当youtube-dl自动选择最优音视频流、需要通过ffmpeg跨编码合并时,会自动选择适配所有流编码的容器格式(比如你遇到的mkv替换mp4的场景),这时候拼接出来的路径自然和实际落盘文件对不上。
修正后的实现
直接调用YoutubeDL实例自带的prepare_filename()方法,把extract_info返回的视频信息传入,即可生成和实际保存完全一致的文件路径,示例代码:
#!/usr/bin/env python3 import youtube_dl ydl_opts = { 'outtmpl': '%(title)s.%(ext)s', } with youtube_dl.YoutubeDL(ydl_opts) as ydl: yinfo = ydl.extract_info('https://www.youtube.com/watch?v=dQw4w9WgXcQ') filename = ydl.prepare_filename(yinfo) print(filename)
方法适配性说明
- 完全兼容任意自定义的outtmpl规则,不管是配置多级输出目录、添加自定义模板变量、使用条件判断逻辑,都不需要修改路径获取代码,自动同步配置规则。
- 自动适配格式合并后的扩展名变化:内部会处理ffmpeg合并、格式转码后的容器格式选择逻辑,生成的扩展名和实际保存的文件完全一致,不会出现mp4/mkv不匹配的问题。
- 完全保留youtube-dl自动选择最优格式的原生行为,不会干扰原有下载配置的逻辑。
内容的提问来源于stack exchange,提问作者dug
相关产品推荐
相关产品推荐

