videoanalysis / app.py
codelion's picture
Update app.py
b3e97a9 verified
raw
history blame
3.67 kB
import os
import time
import gradio as gr
from google import genai
from google.genai import types
# Retrieve API key from environment variables
GOOGLE_API_KEY = os.environ.get("GOOGLE_API_KEY")
if not GOOGLE_API_KEY:
raise ValueError("Please set the GOOGLE_API_KEY environment variable with your Google Cloud API key.")
# Initialize the Gemini API client
client = genai.Client(api_key=GOOGLE_API_KEY)
MODEL_NAME = "gemini-2.5-pro-exp-03-25" # Model from the notebook that supports video analysis
def upload_and_process_video(video_file: str) -> types.File:
"""
Upload a video file to the Gemini API and wait for processing.
Args:
video_file (str): Path to the video file
Returns:
types.File: Processed video file object
"""
try:
video_file_obj = client.files.upload(file=video_file)
while video_file_obj.state == "PROCESSING":
print(f"Processing {video_file}...")
time.sleep(10)
video_file_obj = client.files.get(name=video_file_obj.name)
if video_file_obj.state == "FAILED":
raise ValueError(f"Video processing failed: {video_file_obj.state}")
print(f"Video processing complete: {video_file_obj.uri}")
return video_file_obj
except Exception as e:
raise Exception(f"Error uploading video: {str(e)}")
def analyze_video(video_file: str, user_query: str) -> str:
"""
Analyze the video using the Gemini API and return a summary.
Args:
video_file (str): Path to the video file
user_query (str): Optional query to guide the analysis
Returns:
str: Markdown-formatted report
"""
# Validate input
if not video_file or not os.path.exists(video_file):
return "Please upload a valid video file."
if not video_file.lower().endswith('.mp4'):
return "Please upload an MP4 video file."
try:
# Upload and process the video
video_file_obj = upload_and_process_video(video_file)
# Prepare prompt
prompt = "Provide a detailed summary of this video."
if user_query:
prompt += f" Focus on: {user_query}"
# Analyze video with Gemini API
response = client.models.generate_content(
model=MODEL_NAME,
contents=[
video_file_obj, # Pass the processed video file object
prompt
]
)
summary = response.text
# Generate Markdown report
markdown_report = (
"## Video Analysis Report\n\n"
f"**Summary:**\n{summary}\n"
)
return markdown_report
except Exception as e:
error_msg = (
"## Video Analysis Report\n\n"
f"**Error:** Unable to analyze video.\n"
f"Details: {str(e)}\n"
)
return error_msg
# Define the Gradio interface
iface = gr.Interface(
fn=analyze_video,
inputs=[
gr.Video(label="Upload Video File (MP4)"), # Removed type="filepath"
gr.Textbox(label="Analysis Query (optional)",
placeholder="e.g., focus on main events or themes")
],
outputs=gr.Markdown(label="Video Analysis Report"),
title="AI Video Analysis Agent with Gemini",
description=(
"Upload an MP4 video to get a summary using Google's Gemini API. "
"This tool analyzes the video content directly without audio or frame extraction. "
"Optionally, provide a query to guide the analysis."
)
)
if __name__ == "__main__":
# Launch with share=True to create a public link
iface.launch(share=True)