Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import requests | |
| from bs4 import BeautifulSoup | |
| import re | |
| # Function to search YouTube videos using web scraping | |
| def youtube_search(query, max_results=50): | |
| search_url = f"https://www.youtube.com/results?search_query={query}" | |
| headers = { | |
| "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" | |
| } | |
| try: | |
| # Make the HTTP request to YouTube search results page | |
| response = requests.get(search_url, headers=headers) | |
| response.raise_for_status() # Raise an error for bad responses (4xx or 5xx) | |
| # Parse the HTML content | |
| soup = BeautifulSoup(response.text, "html.parser") | |
| video_elements = soup.find_all("a", href=True, class_="yt-uix-tile-link") | |
| # Extract up to 'max_results' video details | |
| gallery_items = [] | |
| for idx, video in enumerate(video_elements): | |
| if idx >= max_results: | |
| break | |
| video_id = video['href'].split('=')[-1] | |
| video_title = video.get_text(strip=True) | |
| thumbnail_url = f"https://img.youtube.com/vi/{video_id}/mqdefault.jpg" | |
| # Append tuple (thumbnail, video ID) | |
| gallery_items.append((thumbnail_url, video_id)) | |
| return gallery_items | |
| except requests.exceptions.RequestException as e: | |
| # Print the error message to help debug issues | |
| print(f"Error during YouTube web scraping request: {e}") | |
| return [] | |
| # Update Gradio-related parts | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## YouTube Video Search, Selection, and Playback") | |
| with gr.Row(): | |
| with gr.Column(scale=3): | |
| search_query_input = gr.Textbox(label="Search YouTube", placeholder="Enter your search query here") | |
| search_button = gr.Button("Search") | |
| search_output = gr.Gallery(label="Search Results", columns=5, height="1500px") | |
| with gr.Column(scale=2): | |
| selected_video_link = gr.Textbox(label="Selected Video Link", interactive=False) | |
| play_video_button = gr.Button("Play Video") | |
| video_output = gr.HTML(label="Video Player") | |
| # Define search button behavior | |
| def update_search_results(query): | |
| gallery_items = youtube_search(query) | |
| return gallery_items | |
| # Update the selected video link field when a video is clicked in the gallery | |
| def on_video_select(evt: gr.SelectData): | |
| # Extract the video ID from the event value, which is a dictionary containing details of the selected item | |
| selected_video_id = evt.value["caption"] | |
| video_url = f"https://www.youtube.com/watch?v={selected_video_id}" | |
| return video_url | |
| # Play the video when the Play Video button is clicked | |
| def play_video(video_url): | |
| return show_video(video_url) | |
| search_button.click(update_search_results, inputs=search_query_input, outputs=search_output) | |
| search_output.select(on_video_select, inputs=None, outputs=selected_video_link) | |
| play_video_button.click(play_video, inputs=selected_video_link, outputs=video_output) | |
| # Launch the Gradio interface | |
| demo.launch() | |