如何在 Flask Web 应用程序中让用户在客户端下载文件?
How to make user download files client-side in a Flask web application?
我正在尝试使用 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])
这个过程有效,但它可能会很慢,因为我是在本地下载视频然后发送它们。有没有办法让用户更直接的下载视频,而不是先在后台下载?
很明显,您正在进行服务器端处理,首先下载 Youtube 视频,然后将其作为附件发送给用户。进行下载的主要引擎 (youtube-dl) 位于您的后端服务器中,而不是在最终用户的 PC 中,以便获得您建议的内容。
有两种方法可以解决此问题:
在具有高带宽和高处理能力的托管服务提供商中部署您的应用程序服务器。这将显着减少您的下载时间和视频处理时间(如果有的话)。
如果您真的想让最终用户完成所有繁重的工作。您应该选择客户端处理,即使用 JS 应用程序。为此,您可以使用以下 JS 库来完成 youtube-dl 工作。
https://github.com/fent/node-youtube-dl
https://github.com/fent/node-ytdl
https://github.com/fent/node-ytdl-core
除了使用 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响应来提取下载link和return给用户,这样用户将直接从视频主机cdn下载而不是消耗带宽从你的后端。
我正在尝试使用 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])
这个过程有效,但它可能会很慢,因为我是在本地下载视频然后发送它们。有没有办法让用户更直接的下载视频,而不是先在后台下载?
很明显,您正在进行服务器端处理,首先下载 Youtube 视频,然后将其作为附件发送给用户。进行下载的主要引擎 (youtube-dl) 位于您的后端服务器中,而不是在最终用户的 PC 中,以便获得您建议的内容。
有两种方法可以解决此问题:
在具有高带宽和高处理能力的托管服务提供商中部署您的应用程序服务器。这将显着减少您的下载时间和视频处理时间(如果有的话)。
如果您真的想让最终用户完成所有繁重的工作。您应该选择客户端处理,即使用 JS 应用程序。为此,您可以使用以下 JS 库来完成 youtube-dl 工作。
https://github.com/fent/node-youtube-dl
https://github.com/fent/node-ytdl
https://github.com/fent/node-ytdl-core
除了使用 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响应来提取下载link和return给用户,这样用户将直接从视频主机cdn下载而不是消耗带宽从你的后端。