Summarizer / app.py
keer2004ks's picture
Create app.py
35d2961 verified
Raw
History Blame Contribute Delete
2.4 kB
from youtube_transcript_api import YouTubeTranscriptApi
from urllib.parse import urlparse, parse_qs
from transformers import pipeline
import gradio as gr
# 1. Helper: extract ID
def get_video_id(url):
parsed = urlparse(url)
if parsed.hostname == "youtu.be":
return parsed.path[1:]
elif parsed.hostname in ["www.youtube.com", "youtube.com"]:
if parsed.path == "/watch":
return parse_qs(parsed.query)["v"][0]
elif parsed.path.startswith("/embed/") or parsed.path.startswith("/v/"):
return parsed.path.split("/")[2]
raise ValueError("Invalid YouTube URL")
# 2. Helper: get transcript
def get_transcript(video_id, lang="en"):
try:
transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)
transcript = transcript_list.find_transcript([lang])
lines = transcript.fetch()
return " ".join([line.text for line in lines])
except Exception as e:
return f"Error: {e}"
# 3. Load model
summarizer = pipeline("summarization", model="sshleifer/distilbart-cnn-12-6")
# 4. Summarize in chunks
def local_summarize_text(text, max_chunk_words=400):
words = text.split()
chunks = [words[i:i+max_chunk_words] for i in range(0, len(words), max_chunk_words)]
summaries = []
for chunk in chunks:
chunk_text = " ".join(chunk)
result = summarizer(
chunk_text,
max_length=min(130, int(len(chunk_text.split()) * 0.8)),
min_length=20,
do_sample=False
)
summaries.append(result[0]["summary_text"])
return "\n\n".join(summaries)
# 5. Gradio interface function
def gradio_summarizer(youtube_url):
try:
video_id = get_video_id(youtube_url)
except Exception as e:
return f"❌ Error extracting video ID: {e}"
transcript = get_transcript(video_id)
if not transcript or transcript.startswith("Error"):
return f"❌ Failed to fetch transcript. Reason: {transcript}"
summary = local_summarize_text(transcript)
return summary
# 6. Launch
iface = gr.Interface(
fn=gradio_summarizer,
inputs=gr.Textbox(label="YouTube Video URL"),
outputs=gr.Textbox(label="Summary"),
title="YouTube Video Summarizer",
description="Enter a YouTube link (with subtitles). The app fetches and summarizes the transcript."
)
if __name__ == "__main__":
iface.launch()