【问题标题】:How to make user download files client-side in a Flask web application?如何让用户在 Flask Web 应用程序中下载文件客户端?
【发布时间】:2021-05-23 23:28:53
【问题描述】:

我正在尝试使用 youtube-dl Python API 使用 Flask 构建 YouTube 下载器。我一切正常,但我在实际下载视频时遇到了问题。

@app.route("/pytube/video/", methods=["POST", "GET"])
def pytube_video():
    if request.method == "POST":
        pytube_download("https://www.youtube.com/watch?v=kFZ-pW4G-s8", "313")
        return send_file("./videos/test.mp4", as_attachment=True)


@app.route("/pytube/download/", methods=["POST", "GET"])
def pytube_download(url, format_id):
    options = {
        'format': format_id,
        "outtmpl": "./videos/test.mp4",
    }

    with youtube_dl.YoutubeDL(options) as y:
        y.download([url])

此过程有效,但可能会很慢,因为我是在本地下载视频然后发送它们。有没有办法让用户以更直接的方式下载视频,而不需要先在后端下载?

【问题讨论】:

    标签: python python-3.x flask youtube-dl


    【解决方案1】:

    除了使用y.download([url]) 下载视频,您可以提取信息,如下所示:

    from flask import jsonify
    
    
    with youtube_dl.YoutubeDL(options) as y:
            try:
                r = y.extract_info(url, download=False)
                return jsonify(r)
            except:
                return jsonify({'error':'An error has occured'})
    

    然后你可以解析json响应提取下载链接返回给用户,这样用户会直接从视频主机cdn下载,而不是从你的后端消耗带宽。

    【讨论】:

    • 谢谢!有用!但不幸的是,大多数时候视频没有音频 - 要解决这个问题,我需要添加选项:“格式”:fo​​rmat_id + bestaudio,但在这些情况下,因为我使用的是 2 种格式,所以我没有网址,还有可能让这个工作吗?
    • 您可以迭代格式并将格式与编解码器匹配,这意味着该视频有音频。
    【解决方案2】:

    很明显,您正在进行服务器端处理,首先下载 Youtube 视频,然后将其作为附件发送给用户。进行下载的主引擎 (youtube-dl) 位于您的后端服务器中,而不是在最终用户的 PC 中,以便拥有您所建议的内容。

    有两种方法可以解决这个问题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多