使用 yt-dlp 获取下载视频的文件名

问题描述 投票:0回答:3

我打算使用 yt-dlp 下载视频,然后使用 ffmpeg 剪切视频。但为了能够使用 ffmpeg,我必须知道 yt-dlp 生成的文件的名称。我已阅读他们的文档,但我似乎找不到将文件名返回到我的程序中的方法。

python ffmpeg yt-dlp
3个回答
8
投票

根据文档,您应该能够传递 progress hook 并在那里检索文件名。 它应该可以通过

filename
属性访问,但我见过它附加
.f399
和/或随时间变化的实例。我认为这与部分下载视频有关,实际上是临时文件名。

我发现通过捕获整个

info_dict
字典,有一个
_filename
键似乎具有最终的文件名。

这基本上就是我所做的:

import yt_dlp

final_filename = None

def yt_dlp_monitor(self, d):
    final_filename  = d.get('info_dict').get('_filename')
    # You could also just assign `d` here to access it and see all the data or even `print(d)` as it updates frequently

ydl_opts = {
    "outtmpl": '/whatever/directory/%(uploader)s_%(title)s.%(ext)s',  # this is where you can edit how you'd like the filenames to be formatted
    "progress_hooks": [yt_dlp_monitor]  # here's the function we just defined
    }
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    info = ydl.extract_info("http://youtu.be/whatever_video)

现在

final_filename
每次调用该钩子时都会不断更新文件名。如果您愿意,您可以仅在
d['status'] == 'finished'
上更新。


7
投票

这里是文档示例

您提到的数字(如

.f399
)我相信只是临时的,最终在合并最终文件时会被删除。

如果你想获取文件名:

import subprocess
someFilename = subprocess.getoutput('yt-dlp --print filename https://www.youtube.com/something')
# then pass someFilename to FFmpeg

使用您自己的文件名:

subprocess.run('yt-dlp -o thisIsMyName https://www.youtube.com/something')
# this will likely download a file named thisIsMyName.webm

但是如果您事先不确定文件类型/扩展名并且只想获取:

someFileType = subprocess.getoutput('yt-dlp --print filename -o "%(ext)s" https://www.youtube.com/something')
print(someFileType)

效率不是很高,但可以帮助解释一下:

import subprocess

someFileType = subprocess.getoutput('yt-dlp --print filename -o "%(ext)s" https://www.youtube.com/something')
subprocess.run('yt-dlp -o "myFileName.%(ext)s" https://www.youtube.com/something')
subprocess.run(f'ffmpeg -i "myFileName.{someFileType}" outputFile.mp4')

0
投票

你可以使用这样的代码

from yt_dlp import YoutubeDL

url_to_process = 'https://youtu.be/_sample_hash_'


with YoutubeDL() as ydl:
    info_dict = ydl.extract_info(url_to_process, download=True)
    output_filename = ydl.prepare_filename(info_dict)
    print(f"downloaded {output_filename}")

© www.soinside.com 2019 - 2024. All rights reserved.