import streamlit as st from yt_dlp import YoutubeDL from phi.agent import Agent from phi.model.google import Gemini from phi.tools.duckduckgo import DuckDuckGo from google.generativeai import upload_file, get_file import google.generativeai as genai import time from pathlib import Path from dotenv import load_dotenv import os import tempfile # Load environment variables load_dotenv() API_KEY = os.getenv("GOOGLE_API_KEY") if API_KEY: genai.configure(api_key=API_KEY) # Page configuration st.set_page_config( page_title="YouTube Video Summarizer", page_icon="🎥", layout="wide" ) st.title("Phidata YouTube Video Summarizer Agent 🎥🎤🖬") st.header("Powered by Gemini 2.0 Flash Exp") @st.cache_resource def initialize_agent(): return Agent( name="YouTube Video Summarizer", model=Gemini(id="gemini-2.0-flash-exp"), tools=[DuckDuckGo()], markdown=True, ) # Initialize the agent multimodal_Agent = initialize_agent() # Function to download YouTube video using yt-dlp def download_youtube_video(youtube_url): with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as temp_video: ydl_opts = { 'format': 'bestvideo+bestaudio/best', 'outtmpl': temp_video.name, 'quiet': True, } with YoutubeDL(ydl_opts) as ydl: ydl.download([youtube_url]) return temp_video.name # YouTube video URL input youtube_url = st.text_input( "Enter the YouTube video link", placeholder="Paste the YouTube video URL here", help="Provide the link to the YouTube video you want to summarize." ) if youtube_url: try: with st.spinner("Downloading and processing the YouTube video..."): # Download video using yt-dlp video_path = download_youtube_video(youtube_url) # Display video st.video(video_path, format="video/mp4", start_time=0) # User query input user_query = st.text_area( "What insights are you seeking from the video?", placeholder="Ask anything about the video content. The AI agent will analyze and gather additional context if needed.", help="Provide specific questions or insights you want from the video." ) if st.button("🔍 Analyze Video", key="analyze_video_button"): if not user_query: st.warning("Please enter a question or insight to analyze the video.") else: try: with st.spinner("Analyzing video and gathering insights..."): # Upload and process video file processed_video = upload_file(video_path) while processed_video.state.name == "PROCESSING": time.sleep(1) processed_video = get_file(processed_video.name) # Prompt generation for analysis analysis_prompt = ( f""" Analyze the content of the uploaded YouTube video. Respond to the following query using video insights and supplementary web research: {user_query} Provide a detailed, user-friendly, and actionable response. """ ) # AI agent processing response = multimodal_Agent.run(analysis_prompt, videos=[processed_video]) # Display the result st.subheader("Analysis Result") st.markdown(response.content) except Exception as error: st.error(f"An error occurred during analysis: {error}") finally: # Clean up temporary video file Path(video_path).unlink(missing_ok=True) except Exception as e: st.error(f"An error occurred while downloading the video: {e}") else: st.info("Enter a YouTube video link to begin analysis.")