Spaces:
Sleeping
Sleeping
| 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 |