import subprocess subprocess.check_call(["pip", "install", "transformers==4.34.0"]) subprocess.check_call(["pip", "install", "torch>=1.7.1"]) subprocess.check_call(["pip", "install", "youtube_transcript_api>=0.6.3"]) subprocess.check_call(["pip", "install", "pytube"]) subprocess.check_call(["pip", "install", "huggingface_hub>=0.19.0"]) subprocess.check_call(["pip", "install", "PyPDF2>=3.0.1"]) subprocess.check_call(["pip", "install", "google-generativeai"]) subprocess.check_call(["pip", "install", "textblob>=0.17.1"]) subprocess.check_call(["pip", "install", "python-dotenv>=1.0.0"]) subprocess.check_call(["pip", "install", "genai"]) subprocess.check_call(["pip", "install", "google-cloud-aiplatform==1.34.0"]) subprocess.check_call(["pip", "install", "google-api-python-client>=2.0.0"]) import transformers import torch import os import youtube_transcript_api import pytube import gradio import PyPDF2 import pathlib import pandas import numpy import textblob import gradio as gr from youtube_transcript_api import YouTubeTranscriptApi import google.generativeai as genai from googleapiclient.discovery import build import requests from textblob import TextBlob import re #from google.cloud import generativeai from googleapiclient.discovery import build from huggingface_hub import login from youtube_transcript_api import YouTubeTranscriptApi, TranscriptsDisabled, NoTranscriptFound def install_missing_packages(): required_packages = { "torch":">=1.11.0", "transformers":">=4.34.0", "youtube_transcript_api" :">=0.6.3" , "pytube":None, "huggingface_hub": ">=0.19.0", "PyPDF2": ">=3.0.1", "textblob":">=0.17.1", "python-dotenv":">=1.0.0", "genai":None, "google-generativeai": None, "google-cloud-aiplatform":"==1.34.0", "google-api-python-client": ">=2.0.0" } for package, version in required_packages.items(): try: __import__(package) except ImportError: package_name = f"{package}{version}" if version else package subprocess.check_call(["pip", "install", package_name]) install_missing_packages() # Configuration hf_token = os.getenv("HF_TOKEN") if hf_token: login(hf_token) else: raise ValueError("HF_TOKEN environment variable not set.") YOUTUBE_API_KEY = "AIzaSyD_SDF4lC3vpHVAMnBOcN2ZCTz7dRjUc98" # Replace with your YouTube API Key USER_CREDENTIALS = {"admin": "password"} # Example user credentials import os from youtube_transcript_api import YouTubeTranscriptApi, TranscriptsDisabled, NoTranscriptFound # Use environment variables GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") YOUTUBE_API_KEY = os.getenv("YOUTUBE_API_KEY") if not GOOGLE_API_KEY or not YOUTUBE_API_KEY: raise ValueError("Please set GOOGLE_API_KEY and YOUTUBE_API_KEY environment variables") genai.configure(api_key=GOOGLE_API_KEY) # Database students_data = [ (1, "Alice", "A", "Computer Science"), (2, "Aliaa", "B", "Mathematics"), (3, "Charlie", "A", "Machine Learning"), (4, "Daan", "A", "Physics"), (5, "Jhon", "C", "Math"), (6, "Emma", "A+", "Computer Science") ] teachers_data = [ (1, "Dr. Smith", "Math", "MS Mathematics"), (2, "Ms. Johnson", "Science", "MSc Physics"), (3, "Ms. Jack", "Artificial Intelligence Engineer", "MSc AI"), (4, "Ms. Evelyn", "Computer Science", "MSc Computer Science"), ] courses_data = [ (1, "Algebra", "Dr. Smith", "Advanced"), (2, "Biology", "Ms. Mia", "Intermediate"), (3, "Machine Learning", "Ms. Jack", "Intermediate"), (4, "Computer Science", "Ms. Evelyn", "Intermediate"), (5, "Mathematics", "Ms. Smith", "Intermediate") ] def extract_video_id(url): match = re.search(r"(?:v=|\/)([0-9A-Za-z_-]{11})", url) return match.group(1) if match else None def get_video_metadata(video_id): try: youtube = build("youtube", "v3", developerKey=YOUTUBE_API_KEY) request = youtube.videos().list(part="snippet", id=video_id) response = request.execute() if "items" in response and len(response["items"]) > 0: snippet = response["items"][0]["snippet"] return { "title": snippet.get("title", "No title available"), "description": snippet.get("description", "No description available"), } return {} except Exception as e: return {"title": "Error fetching metadata", "description": str(e)} def clean_text_for_analysis(text): return " ".join(text.split()) def get_recommendations(keywords, max_results=5): if not keywords: return "Please provide search keywords" try: response = requests.get( "https://www.googleapis.com/youtube/v3/search", params={ "part": "snippet", "q": f"educational {keywords}", "type": "video", "maxResults": max_results, "relevanceLanguage": "en", "key": YOUTUBE_API_KEY } ).json() results = [] for item in response.get("items", []): title = item["snippet"]["title"] channel = item["snippet"]["channelTitle"] video_id = item["id"]["videoId"] results.append(f"šŸ“ŗ {title}\nšŸ‘¤ {channel}\nšŸ”— https://youtube.com/watch?v={video_id}\n") return "\n".join(results) if results else "No recommendations found" except Exception as e: return f"Error: {str(e)}" def process_youtube_video(url): try: thumbnail = None summary = "No transcript available" sentiment_label = "N/A" video_id = extract_video_id(url) if not video_id: return None, "Invalid YouTube URL", "N/A" thumbnail = f"https://img.youtube.com/vi/{video_id}/maxresdefault.jpg" try: transcript_list = YouTubeTranscriptApi.list_transcripts(video_id) transcript = None try: transcript = transcript_list.find_transcript(['en']) except: transcript = transcript_list.find_generated_transcript(['en']) text = " ".join([t['text'] for t in transcript.fetch()]) if not text.strip(): raise ValueError("Transcript is empty") cleaned_text = clean_text_for_analysis(text) sentiment = TextBlob(cleaned_text).sentiment sentiment_label = f"{'Positive' if sentiment.polarity > 0 else 'Negative' if sentiment.polarity < 0 else 'Neutral'} ({sentiment.polarity:.2f})" summary = f"Summary: {cleaned_text[:400]}..." except (TranscriptsDisabled, NoTranscriptFound): metadata = get_video_metadata(video_id) summary = metadata.get("description", "No subtitles available") sentiment_label = "N/A" return thumbnail, summary, sentiment_label except Exception as e: return None, f"Error: {str(e)}", "N/A" # Gradio Interface with gr.Blocks(theme=gr.themes.Soft()) as app: # Login Page with gr.Group() as login_page: gr.Markdown("# šŸŽ“ Educational Learning Management System") username = gr.Textbox(label="Username") password = gr.Textbox(label="Password", type="password") login_btn = gr.Button("Login", variant="primary") login_msg = gr.Markdown() # Main Interface with gr.Group(visible=False) as main_page: with gr.Row(): with gr.Column(scale=1): gr.Markdown("### šŸ“‹ Navigation") nav_dashboard = gr.Button("šŸ“Š Dashboard", variant="primary") nav_students = gr.Button("šŸ‘„ Students") nav_teachers = gr.Button("šŸ‘Øā€šŸ« Teachers") nav_courses = gr.Button("šŸ“š Courses") nav_youtube = gr.Button("šŸŽ„ YouTube Tool") logout_btn = gr.Button("🚪 Logout", variant="stop") with gr.Column(scale=3): # Dashboard Content dashboard_page = gr.Group() with dashboard_page: gr.Markdown("## šŸ“Š Dashboard") gr.Markdown(f""" ### System Overview - šŸ‘„ Total Students: {len(students_data)} - šŸ‘Øā€šŸ« Total Teachers: {len(teachers_data)} - šŸ“š Total Courses: {len(courses_data)} ### Quick Actions - View student performance - Access course materials - Generate learning insights """) # Students Content students_page = gr.Group(visible=False) with students_page: gr.Markdown("## šŸ‘„ Students") gr.DataFrame( value=students_data, headers=["ID", "Name", "Grade", "Program"] ) # Teachers Content teachers_page = gr.Group(visible=False) with teachers_page: gr.Markdown("## šŸ‘Øā€šŸ« Teachers") gr.DataFrame( value=teachers_data, headers=["ID", "Name", "Subject", "Qualification"] ) # Courses Content courses_page = gr.Group(visible=False) with courses_page: gr.Markdown("## šŸ“š Courses") gr.DataFrame( value=courses_data, headers=["ID", "Name", "Instructor", "Level"] ) # YouTube Tool Content youtube_page = gr.Group(visible=False) with youtube_page: gr.Markdown("## Agent for YouTube Content Exploration") with gr.Row(): with gr.Column(scale=2): video_url = gr.Textbox( label="YouTube URL", placeholder="https://youtube.com/watch?v=..." ) keywords = gr.Textbox( label="Keywords for Recommendations", placeholder="e.g., python programming, machine learning" ) analyze_btn = gr.Button("šŸ” Analyze Video", variant="primary") recommend_btn = gr.Button("šŸ”Ž Get Recommendations", variant="primary") with gr.Column(scale=1): video_thumbnail = gr.Image(label="Video Preview") with gr.Row(): with gr.Column(): summary = gr.Textbox(label="šŸ“ Summary", lines=8) sentiment = gr.Textbox(label="😊 Content Sentiment") with gr.Column(): recommendations = gr.Textbox(label="šŸŽÆ Related Videos", lines=10) def login_check(user, pwd): if USER_CREDENTIALS.get(user) == pwd: return { login_page: gr.update(visible=False), main_page: gr.update(visible=True), login_msg: "" } return { login_page: gr.update(visible=True), main_page: gr.update(visible=False), login_msg: "āŒ Invalid credentials" } def show_page(page_name): updates = { dashboard_page: gr.update(visible=False), students_page: gr.update(visible=False), teachers_page: gr.update(visible=False), courses_page: gr.update(visible=False), youtube_page: gr.update(visible=False) } updates[page_name] = gr.update(visible=True) return updates # Event Handlers login_btn.click( login_check, inputs=[username, password], outputs=[login_page, main_page, login_msg] ) nav_dashboard.click(lambda: show_page(dashboard_page), outputs=list(show_page(dashboard_page).keys())) nav_students.click(lambda: show_page(students_page), outputs=list(show_page(students_page).keys())) nav_teachers.click(lambda: show_page(teachers_page), outputs=list(show_page(teachers_page).keys())) nav_courses.click(lambda: show_page(courses_page), outputs=list(show_page(courses_page).keys())) nav_youtube.click(lambda: show_page(youtube_page), outputs=list(show_page(youtube_page).keys())) analyze_btn.click( process_youtube_video, inputs=[video_url], outputs=[video_thumbnail, summary, sentiment] ) recommend_btn.click( get_recommendations, inputs=[keywords], outputs=[recommendations] ) logout_btn.click( lambda: { login_page: gr.update(visible=True), main_page: gr.update(visible=False) }, outputs=[login_page, main_page] ) if __name__ == "__main__": app.launch()