Вернуть ответ File/Stream из googlevideo в Fast API
Я использую Fast API для возврата видеоответа с googlevideo.com. Это код, который я использую:
@app.get(params.api_video_route)
async def get_api_video(url=None):
def iter():
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as resp:
yield from io.BytesIO(resp.read())
return StreamingResponse(iter(), media_type="video/mp4")
но это не работает
Я хочу, чтобы этот Nodejs был преобразован в FAST API python:
app.get("/download-video", function(req, res) {
http.get(decodeURIComponent(req.query.url), function(response) {
res.setHeader("Content-Length", response.headers["content-length"]);
if (response.statusCode >= 400)
res.status(500).send("Error");
response.on("data", function(chunk) { res.write(chunk); });
response.on("end", function() { res.end(); }); }); });
1 ответ
Я столкнулся с похожими проблемами, но решил все. Основная идея состоит в том, чтобы создать сессию с помощью request.Session() и выдавать чанки один за другим вместо того, чтобы получать весь контент и выдавать его сразу. Это работает очень хорошо, не создавая проблем с памятью.
@app.get(params.api_video_route)
async def get_api_video(url=None):
def iter():
session = requests.Session()
r = session.get(url, stream=True)
r.raise_for_status()
for chunk in r.iter_content(1024*1024):
yield chunk
return StreamingResponse(iter(), media_type="video/mp4")