Вернуть ответ 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") 

Другие вопросы по тегам