|
import streamlit as st |
|
from pytube import YouTube |
|
from youtube_transcript_api import YouTubeTranscriptApi |
|
from youtube_transcript_api.formatters import SRTFormatter |
|
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_dotenv() |
|
API_KEY = os.getenv("GOOGLE_API_KEY") |
|
if API_KEY: |
|
genai.configure(api_key=API_KEY) |
|
|
|
|
|
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, |
|
) |
|
|
|
|
|
multimodal_Agent = initialize_agent() |
|
|
|
|
|
def get_youtube_captions(youtube_url): |
|
""" |
|
Retrieves YouTube video captions using youtube-transcript-api. |
|
|
|
Parameters: |
|
- youtube_url: The URL of the YouTube video. |
|
|
|
Returns: |
|
- The captions of the video in SRT format, or a message if captions are not available. |
|
""" |
|
video_id = youtube_url.split("v=")[-1].split("&")[0] |
|
|
|
try: |
|
|
|
transcript = YouTubeTranscriptApi.get_transcript(video_id) |
|
|
|
|
|
formatter = SRTFormatter() |
|
formatted_transcript = formatter.format_transcript(transcript) |
|
return formatted_transcript |
|
|
|
except Exception as e: |
|
return f"Error: {str(e)}" |
|
|
|
|
|
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("Fetching and processing the YouTube video..."): |
|
|
|
captions = get_youtube_captions(youtube_url) |
|
|
|
|
|
if "Error" not in captions: |
|
|
|
st.subheader("Video Captions:") |
|
st.text(captions) |
|
else: |
|
st.error(captions) |
|
|
|
|
|
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..."): |
|
|
|
processed_captions = upload_file(captions) |
|
while processed_captions.state.name == "PROCESSING": |
|
time.sleep(1) |
|
processed_captions = get_file(processed_captions.name) |
|
|
|
|
|
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. |
|
""" |
|
) |
|
|
|
|
|
response = multimodal_Agent.run(analysis_prompt, videos=[processed_captions]) |
|
|
|
|
|
st.subheader("Analysis Result") |
|
st.markdown(response.content) |
|
|
|
except Exception as error: |
|
st.error(f"An error occurred during analysis: {error}") |
|
except Exception as e: |
|
st.error(f"An error occurred: {e}") |
|
else: |
|
st.info("Enter a YouTube video link to begin analysis.") |
|
|