google_ai_studio.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. from utils.feishu_data import Material
  11. CACHE_DIR = '/app/cache/'
  12. # CACHE_DIR = '/Users/z/Downloads/'
  13. # PROXY_ADDR = 'http://localhost:1081'
  14. # os.environ['http_proxy'] = PROXY_ADDR
  15. # os.environ['https_proxy'] = PROXY_ADDR
  16. class GoogleAI(object):
  17. @classmethod
  18. def download_video(cls, video_link: str) -> Optional[str]:
  19. file_path = os.path.join(CACHE_DIR, f'{str(uuid.uuid4())}.mp4')
  20. for _ in range(3):
  21. try:
  22. response = requests.get(url=video_link, timeout=60)
  23. if response.status_code == 200:
  24. with open(file_path, 'wb') as f:
  25. f.write(response.content)
  26. logger.info(f'[内容分析] 视频链接: {video_link}, 存储地址: {file_path}')
  27. return file_path
  28. except Exception:
  29. time.sleep(1)
  30. continue
  31. return
  32. @classmethod
  33. def run(cls, api_key, video_url):
  34. video_path = None
  35. try:
  36. genai.configure(api_key=api_key)
  37. video_path = cls.download_video(video_link=video_url)
  38. if not video_path:
  39. logger.error(f'[内容分析] 视频下载失败, 跳过任务')
  40. os.remove(video_path)
  41. logger.info(f"[内容分析] 文件已删除: {video_path}")
  42. return "[异常] 视频下载失败"
  43. video = genai.upload_file(path=video_path, mime_type='video/mp4')
  44. while video.state.name == 'PROCESSING':
  45. time.sleep(1)
  46. video = genai.get_file(name=video.name)
  47. if video.state.name != 'ACTIVE':
  48. genai.delete_file(name=video.name)
  49. os.remove(video_path)
  50. return "[异常] 上传视频失败"
  51. model = genai.GenerativeModel(
  52. model_name='gemini-1.5-flash',
  53. generation_config=genai.GenerationConfig(response_mime_type='application/json'),
  54. safety_settings={
  55. HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE,
  56. },
  57. )
  58. # mark, prompt = Material.feishu_list()
  59. response = model.generate_content(
  60. contents=[
  61. video,
  62. f'{prompt}',
  63. ],
  64. stream=False,
  65. request_options={
  66. 'timeout': 600,
  67. },
  68. )
  69. text = orjson.loads(response.text.strip())
  70. genai.delete_file(name=video.name)
  71. os.remove(video_path)
  72. return text
  73. except Exception as e:
  74. logger.error(f"[内容分析] 处理异常,异常信息{e}")
  75. os.remove(video_path)
  76. return f"[异常] {e}"
  77. if __name__ == '__main__':
  78. ai = GoogleAI()
  79. ai.run("AIzaSyA_dXKbcW8s0fFIoo89rtPRWU34pJry7mU",
  80. "http://rescdn.yishihui.com/jq_oss/video/2025012215472528213")