Django PIPE youtube-dl 查看下载

Django PIPE youtube-dl to view for download

TL;DR:我想通过单击按钮将 youtube-dl 的输出通过管道传输到用户的浏览器,而不必将视频保存在我服务器的磁盘上。

所以我想在页面(django 后端)上添加一个“下载”按钮,用户可以在其中下载他们正在观看的视频。 我使用的是 youtube-dl 的最新版本。 在我的下载视图中,我有这段代码:

    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        file = ydl.download([f"https://clips.twitch.tv/{pk}"])

在某种程度上,它是有效的。它确实将文件下载到我的机器上,但我不确定如何允许用户下载该文件。 我想到了几种方法来实现这一点,但唯一真正适合我的方法是将下载内容通过管道传输给用户(客户端),而无需在我的磁盘上存储任何视频。我在同一问题上发现 this 问题,但我不确定如何让它发挥作用。我使用 ydl_opts = {'outtmpl': '-'} 成功地将下载传输到 stdout,但我不确定如何将其传输到我的视图响应。一位维护者的回复提到了 subprocess.Popen,我查了一下,但无法确定在我的情况下应该如何实施。

我做了一个解决方法。 我下载具有特定名称的文件,我 return 使用 HttpResponse 的视图,强制下载内容类型,然后使用 python 删除文件。 这不是我最初的想法,但它是我能想到的第二好的解决方案。我将 select 这个答案作为可接受的解决方案,直到 Python 向导给出原始问题的解决方案。 我现在拥有的代码:

def download_clip(request, pk):
    ydl_opts = {
        'outtmpl': f"{pk}.mp4"
    }
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([f"https://clips.twitch.tv/{pk}"])

    path = f"{pk}.mp4"
    file_path = os.path.join(path)
    if os.path.exists(file_path):
        with open(file_path, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type="application/force-download")
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            os.remove(file_path)
            return response
    raise Http404