analyze_video.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import asyncio
  2. from fastapi import FastAPI
  3. from pydantic import BaseModel
  4. from google_ai.generativeai_video import main
  5. app = FastAPI()
  6. api_keys = [
  7. {'key': 'AIzaSyAa4H7YzIOiqA0QIDuO6kNErFBoWT-BEtc', 'locked': False},
  8. {'key': 'AIzaSyC-IxUvJhbiKWA7uN1RTtVbOjt3pj_-Apc', 'locked': False},
  9. {'key': 'AIzaSyB43Pvugb-CMkEXJUSubXEAxKxYflCPPNU', 'locked': False}
  10. ]
  11. lock = asyncio.Lock()
  12. class VideoRequest( BaseModel ):
  13. video_path: str
  14. async def get_available_api_key():
  15. """获取一个未锁定的 API key,如果没有可用的则等待 60 秒后重试"""
  16. while True: # 无限循环,直到找到可用的 key
  17. async with lock:
  18. for key_data in api_keys:
  19. if not key_data['locked']:
  20. key_data['locked'] = True # 锁定该 key
  21. return key_data['key']
  22. # 如果没有找到可用的 key,等待 60 秒后重试
  23. print( "没有可用的 API key,等待 60 秒后重试..." )
  24. await asyncio.sleep( 60 )
  25. async def release_api_key(api_key):
  26. """释放已锁定的 API key"""
  27. async with lock:
  28. for key_data in api_keys:
  29. if key_data['key'] == api_key:
  30. key_data['locked'] = False # 释放该 key
  31. break
  32. @app.post( "/process_video/" )
  33. async def process_video(request: VideoRequest):
  34. """处理视频请求"""
  35. video_path = request.video_path
  36. # 获取一个可用的 API key
  37. api_key = await get_available_api_key()
  38. try:
  39. print( "来一个请求,使用 API key:", api_key )
  40. result, mark = await main( video_path, api_key )
  41. return {
  42. "code": 0,
  43. "message": "视频处理成功",
  44. "result": result,
  45. "mark": mark
  46. }
  47. except Exception as e:
  48. print( f"视频处理失败: {str( e )}" )
  49. return {
  50. "code": 1,
  51. "message": f"视频处理失败: {e}",
  52. "result": f"视频处理失败: {e}",
  53. "mark": f"视频处理失败: {e}"
  54. }
  55. finally:
  56. # 释放 API key,确保后续请求可以使用
  57. await release_api_key( api_key )