123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- import os
- import time
- import uuid
- from typing import Optional
- import google.generativeai as genai
- import orjson
- import requests
- from google.generativeai.types import (HarmBlockThreshold, HarmCategory)
- from loguru import logger
- from utils.feishu_data import Material
- CACHE_DIR = '/app/cache/'
- # CACHE_DIR = '/Users/z/Downloads/'
- # PROXY_ADDR = 'http://localhost:1081'
- # os.environ['http_proxy'] = PROXY_ADDR
- # os.environ['https_proxy'] = PROXY_ADDR
- class GoogleAI(object):
- @classmethod
- def download_video(cls, video_link: str) -> Optional[str]:
- file_path = os.path.join(CACHE_DIR, f'{str(uuid.uuid4())}.mp4')
- for _ in range(3):
- try:
- response = requests.get(url=video_link, timeout=60)
- if response.status_code == 200:
- with open(file_path, 'wb') as f:
- f.write(response.content)
- logger.info(f'[内容分析] 视频链接: {video_link}, 存储地址: {file_path}')
- return file_path
- except Exception:
- time.sleep(1)
- continue
- return
- @classmethod
- def run(cls, api_key, video_url):
- video_path = None
- try:
- genai.configure(api_key=api_key)
- video_path = cls.download_video(video_link=video_url)
- if not video_path:
- logger.error(f'[内容分析] 视频下载失败, 跳过任务')
- os.remove(video_path)
- logger.info(f"[内容分析] 文件已删除: {video_path}")
- return "[异常] 视频下载失败"
- video = genai.upload_file(path=video_path, mime_type='video/mp4')
- while video.state.name == 'PROCESSING':
- time.sleep(1)
- video = genai.get_file(name=video.name)
- if video.state.name != 'ACTIVE':
- genai.delete_file(name=video.name)
- os.remove(video_path)
- return "[异常] 上传视频失败"
- model = genai.GenerativeModel(
- model_name='gemini-1.5-flash',
- generation_config=genai.GenerationConfig(response_mime_type='application/json'),
- safety_settings={
- HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE,
- },
- )
- # mark, prompt = Material.feishu_list()
- response = model.generate_content(
- contents=[
- video,
- f'{prompt}',
- ],
- stream=False,
- request_options={
- 'timeout': 600,
- },
- )
- text = orjson.loads(response.text.strip())
- genai.delete_file(name=video.name)
- os.remove(video_path)
- return text
- except Exception as e:
- logger.error(f"[内容分析] 处理异常,异常信息{e}")
- os.remove(video_path)
- return f"[异常] {e}"
- if __name__ == '__main__':
- ai = GoogleAI()
- ai.run("AIzaSyA_dXKbcW8s0fFIoo89rtPRWU34pJry7mU",
- "http://rescdn.yishihui.com/jq_oss/video/2025012215472528213")
|