google_ai_studio.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import os
  2. import time
  3. import uuid
  4. from typing import Optional
  5. import google.generativeai as genai
  6. import orjson
  7. import requests
  8. from google.generativeai.types import (HarmBlockThreshold, HarmCategory)
  9. from loguru import logger
  10. import traceback
  11. from utils.json_utils import parse_general_json
  12. CACHE_DIR = '/app/cache/'
  13. # CACHE_DIR = '/Users/z/Downloads/'
  14. # PROXY_ADDR = 'http://localhost:1081'
  15. # os.environ['http_proxy'] = PROXY_ADDR
  16. # os.environ['https_proxy'] = PROXY_ADDR
  17. class GoogleAI(object):
  18. @classmethod
  19. def download_video(cls, video_link: str) -> Optional[str]:
  20. file_path = os.path.join(CACHE_DIR, f'{str(uuid.uuid4())}.mp4')
  21. for _ in range(3):
  22. try:
  23. response = requests.get(url=video_link, timeout=60)
  24. if response.status_code == 200:
  25. with open(file_path, 'wb') as f:
  26. f.write(response.content)
  27. logger.info(f'[内容分析] 视频链接: {video_link}, 存储地址: {file_path}')
  28. return file_path
  29. except Exception:
  30. time.sleep(1)
  31. continue
  32. return
  33. @classmethod
  34. def run(cls, api_key, video_path):
  35. max_retries = 3 # 最大重试次数
  36. for retry in range(max_retries):
  37. try:
  38. genai.configure(api_key=api_key)
  39. video = genai.upload_file(path=video_path, mime_type='video/mp4')
  40. while video.state.name == 'PROCESSING':
  41. time.sleep(1)
  42. video = genai.get_file(name=video.name)
  43. if video.state.name != 'ACTIVE':
  44. genai.delete_file(name=video.name)
  45. return
  46. # 定义 response_schema
  47. response_schema = {
  48. "type": "object",
  49. "properties": {
  50. "text": {
  51. "type": "string"
  52. }
  53. },
  54. "required": ["text"]
  55. }
  56. model = genai.GenerativeModel(
  57. model_name='gemini-1.5-flash',
  58. generation_config=genai.GenerationConfig(response_mime_type='application/json',
  59. response_schema=response_schema),
  60. safety_settings={
  61. HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE,
  62. },
  63. )
  64. response = model.generate_content(
  65. contents=[
  66. video,
  67. '你是一名专业的短视频分析师,请你输出这个视频的完整口播,只输出文字即可。使用以下JSON格式输出,不要包含任何额外的解释、注释或非JSON文本:{"text": string}',
  68. ],
  69. stream=False,
  70. request_options={
  71. 'timeout': 600,
  72. },
  73. )
  74. # 打印响应内容用于调试
  75. logger.info(f"[+] 响应内容: {response.text}")
  76. # 使用通用 JSON 解析函数解析响应
  77. text = parse_general_json(response.text, key='text')
  78. if text is None:
  79. return
  80. # text = orjson.loads(response.text.strip())['text']
  81. genai.delete_file(name=video.name)
  82. return text
  83. except Exception as e:
  84. # 异常处理逻辑(添加重试延迟和日志)
  85. logger.error(
  86. f"[内容分析] 第 {retry + 1}/{max_retries} 次尝试失败, 异常信息: {e}\n{traceback.format_exc()}")
  87. if retry < max_retries - 1: # 非最后一次重试,等待后继续
  88. time.sleep(2 ** retry) # 指数退避延迟(1s, 2s, 4s)
  89. else: # 最后一次重试失败,返回失败标识
  90. genai.delete_file(name=video.name) if 'video' in locals() else None
  91. logger.error("[内容分析] 已耗尽重试次数,任务失败")
  92. return
  93. if __name__ == '__main__':
  94. GoogleAI.run("AIzaSyDWNwy7SIHLaJ7gROE7qeLB5XjDIDIq644",
  95. "/Users/zhangliang/Downloads/FC8VomZVnZ6t9tTGkmN5I5ubG2nTqoCxsw1f5hspINAXuqAT8kxQeGreofBahmI3WVGGsVb9iYhzhEnZH0svtl3g4JLTVQhwaFzQCTK3gPo8MH6QaHb-VFLDQwrRbt3S1IHgCQCwi_X12ZXH6NXam7pGCKHyrI7maUwG43o76UNuX9CuYaH9z9QviuE0LkmI.mp4")