使用python youtube_dl将数据直接下载到临时文件中



我使用的是python嵌入式youtube_dl,我想将视频内容直接下载到一个临时文件中。我试图创建一个NamedTemporaryFile并将youtube_dl写入其中,但我总是得到一个提示,即该文件已经下载(临时文件具有该名称,它认为下载已经发生(。

我还试图让youtube_dl流式下载数据到stdout,并将stdout重定向到临时文件,但我无法获得python嵌入式版本。它不输出到stdout,只是创建一个名为-.mp4的文件。

import youtube_dl
ydl_opts = {
"format": "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best",
"merge-output-format": "mp4",
"recode-video": "mp4",
"outtmpl": "-",
"verbose": True,
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(["https://www.youtube.com/watch?v=h3h035Eyz5A&ab_channel=Loku"])

总之,如果-.mp4文件已经存在,上面的代码不会覆盖它们,也不会将下载流式传输到stdout中,因此我可以将其重定向到临时文件中。

需要临时文件,因为它是进一步处理的中间步骤。在这一点上,我感觉我需要将文件复制到临时文件并删除原始文件,或者我需要将youtube_dl与一个子流程一起使用,这感觉很傻。

我以前也遇到过类似的问题。我发现一个很好的方法是使用tempfile。TemporaryDirectory((临时存储文件,然后打开((检索文件。

查看youtube_dl代码库,您似乎希望直接使用extract_info而不是download方法。

import tempfile
from youtube_dl import YoutubeDL
from youtube_dl.utils import DownloadError
with tempfile.TemporaryDirectory() as tempdirname:
ydl_opts = {
"format": "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best",
"merge_output_format": "mp4",
"outtmpl": f"{tempdirname}/%(id)s.%(ext)s",
"noplaylist": True,
"verbose": True,
}
ydl = YoutubeDL(ydl_opts)
try:
meta = ydl.extract_info(
"https://www.youtube.com/watch?v=h3h035Eyz5A&ab_channel=Loku",
download=True,
)
except DownloadError as e:
raise e
else:
video_id = meta["id"]
video_ext = meta["ext"]
file = open(f"{tempdirname}/{video_id}.{video_ext}", "rb")
# whatever else you gotta do bruh...
# when the with statement finishes execution, the temp directory
# will be cleaned up.

请注意,您应该使用snake_case作为参数(ydl_opts中的键(,因为您没有使用cli。我还认为recode-video不是一个受支持的选项,但请检查此处以确定。

还要注意,我假设你想下载一个视频。上面的代码不考虑从临时目录中检索播放列表,我有意在ydl_opts中添加了noplaylist选项。

最新更新