IC-Video-App / services /video_analyzer.py
userIdc2024's picture
Update services/video_analyzer.py
e09970c verified
import json
import os
import tempfile
import logging
import pandas as pd
import streamlit as st
from typing import Dict, Any, List
from google import genai
import time
from config import configure_gemini
from prompt.analyser_prompt import analyser_prompt
from schema import AdAnalysis
from utils.video import get_video_thumbnail_base64
from dotenv import load_dotenv
logger = logging.getLogger(__name__)
GEMINI_API_KEY = os.getenv("GEMINI_KEY")
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[logging.StreamHandler()]
)
logger = logging.getLogger(__name__)
def configure_gemini():
return genai.Client(api_key=GEMINI_API_KEY)
def analyze_video_only(video_path: str) -> Dict[str, Any]:
client = configure_gemini()
try:
video_file = client.files.upload(file=video_path)
while getattr(video_file.state, "name", "") == "PROCESSING":
time.sleep(2)
video_file = client.files.get(name=video_file.name)
if getattr(video_file.state, "name", "") == "FAILED":
return {}
resp = client.models.generate_content(
model="gemini-2.0-flash",
contents=[analyser_prompt, video_file],
config={"response_mime_type": "application/json"}
)
raw = getattr(resp, "text", "") or ""
try:
model_obj = AdAnalysis.model_validate_json(raw)
return model_obj.model_dump()
except Exception:
try:
return json.loads(raw)
except Exception:
return {}
except Exception:
return {}
def analyze_multiple_videos(video_files: List[st.runtime.uploaded_file_manager.UploadedFile]) -> List[Dict[str, Any]]:
results = []
for file in video_files:
with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(file.name)[1]) as tmp:
tmp.write(file.read())
video_path = tmp.name
analysis = analyze_video_only(video_path)
thumbnail_b64 = get_video_thumbnail_base64(video_path)
results.append({
"video_name": file.name,
"analysis": analysis,
"thumbnail": thumbnail_b64
})
return results