Spaces:
Runtime error
Runtime error
| from dotenv import load_dotenv | |
| import os | |
| import gradio as gr | |
| import urllib.parse | |
| import re | |
| from pytube import YouTube | |
| from typing import List, Optional, Dict | |
| from r_types import ( | |
| SearchVideosResponse, | |
| SearchImagesResponse, | |
| SearchLinksResponse, | |
| LocalMapResponse, | |
| KnowledgeBaseResponse | |
| ) | |
| import json | |
| def get_video_id(url: str) -> Optional[str]: | |
| """ | |
| Safely retrieve the YouTube video_id from a given URL using pytube. | |
| Returns None if the URL is invalid or an error occurs. | |
| """ | |
| if not url: | |
| return None | |
| try: | |
| yt = YouTube(url) | |
| return yt.video_id | |
| except Exception: | |
| # If the URL is invalid or pytube fails, return None | |
| return None | |
| def embed_video(videos: List[SearchVideosResponse]) -> str: | |
| """ | |
| Given a list of video data (with 'link' and 'title'), | |
| returns an HTML string of embedded YouTube iframes. | |
| """ | |
| if not videos: | |
| return "<p>No videos found.</p>" | |
| # Collect each iframe snippet | |
| iframes = [] | |
| for video in videos: | |
| url = video.get("link", "") | |
| video_id = get_video_id(url) | |
| if not video_id: | |
| # Skip invalid or non-parsable links | |
| continue | |
| title = video.get("title", "").replace('"', '\\"') # Escape quotes | |
| iframe = f""" | |
| <iframe | |
| width="560" | |
| height="315" | |
| src="https://www.youtube.com/embed/{video_id}" | |
| title="{title}" | |
| frameborder="0" | |
| allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" | |
| allowfullscreen> | |
| </iframe> | |
| """ | |
| iframes.append(iframe) | |
| # If no valid videos after processing, return a fallback message | |
| if not iframes: | |
| return "<p>No valid YouTube videos found.</p>" | |
| # Join all iframes into one HTML string | |
| return "\n".join(iframes) | |
| def get_video_thumbnail(videos: List[SearchVideosResponse]) -> str: | |
| pass | |
| def format_links(links) -> str: | |
| """ | |
| Convert a list of {'title': str, 'link': str} objects | |
| into a bulleted Markdown string with clickable links. | |
| """ | |
| if not links: | |
| return "No links found." | |
| links_md = "**Links:**\n" | |
| for url in links: | |
| title = url.rstrip('/').split('/')[-1] | |
| links_md += f"- [{title}]({url})\n" | |
| return links_md | |
| def embed_google_map(map_url: str) -> str: | |
| """ | |
| Extracts a textual location from the given Google Maps URL | |
| and returns an embedded Google Map iframe for that location. | |
| Assumes you have a valid API key in place of 'YOUR_API_KEY'. | |
| """ | |
| load_dotenv() | |
| GOOGLE_MAPS_API_KEY = os.getenv("GOOGLE_MAPS_API_KEY") | |
| if not map_url: | |
| return "<p>Invalid Google Maps URL.</p>" | |
| # Attempt to extract "San+Francisco,+CA" from the URL | |
| match = re.search(r"/maps/place/([^/]+)", map_url) | |
| if not match: | |
| return "Invalid Google Maps URL. Could not extract location." | |
| location_text = match.group(1) | |
| # Remove query params or additional slashes from the captured group | |
| location_text = re.split(r"[/?]", location_text)[0] | |
| # URL-encode location to avoid issues with special characters | |
| encoded_location = urllib.parse.quote(location_text, safe="") | |
| embed_html = f""" | |
| <iframe | |
| width="600" | |
| height="450" | |
| style="border:0" | |
| loading="lazy" | |
| allowfullscreen | |
| src="https://www.google.com/maps/embed/v1/place?key={GOOGLE_MAPS_API_KEY}&q={encoded_location}"> | |
| </iframe> | |
| """ | |
| return embed_html | |
| def format_knowledge(raw_result: str) -> str: | |
| """ | |
| Given a dictionary of knowledge data (e.g., about a person), | |
| produce a Markdown string summarizing that info. | |
| """ | |
| if not raw_result: | |
| return 0000 | |
| # Clean up the raw JSON string | |
| clean_json_str = cleanup_raw_json(raw_result) | |
| print('Knowledge Data: ', clean_json_str) | |
| try: | |
| # Parse the cleaned JSON string | |
| result = json.loads(clean_json_str) | |
| title = result.get("title", "...") | |
| type_ = result.get("type", "...") | |
| born = result.get("born", "...") | |
| died = result.get("died", "...") | |
| content = f""" | |
| **{title}** | |
| Type: {type_} | |
| Born: {born} | |
| Died: {died} | |
| """ | |
| return content | |
| except json.JSONDecodeError: | |
| return "Error: Failed to parse knowledge data." | |
| def format_followup_questions(raw_questions: str) -> str: | |
| """ | |
| Extracts and formats follow-up questions from a raw JSON-like string. | |
| The input string may contain triple backticks (```json ... ```) which need to be removed before parsing. | |
| Expected input format: | |
| ```json | |
| { | |
| "followup_question": [ | |
| "What materials are needed to make a slingshot?", | |
| "How to make a slingshot more powerful?" | |
| ] | |
| } | |
| ``` | |
| Returns a Markdown-formatted string with the follow-up questions. | |
| """ | |
| if not raw_questions: | |
| return "No follow-up questions available." | |
| # Clean up the raw JSON string | |
| clean_json_str = cleanup_raw_json(raw_questions) | |
| try: | |
| # Parse the cleaned JSON string | |
| questions_dict = json.loads(clean_json_str) | |
| # Ensure the expected key exists | |
| followup_list = questions_dict.get("followup_question", []) | |
| if not isinstance(followup_list, list) or not followup_list: | |
| return "No follow-up questions available." | |
| # Format the questions into Markdown | |
| questions_md = "### Follow-up Questions\n\n" | |
| for question in followup_list: | |
| questions_md += f"- {question}\n" | |
| return questions_md | |
| except json.JSONDecodeError: | |
| return "Error: Failed to parse follow-up questions." | |
| def cleanup_raw_json(raw_json: str) -> str: | |
| """ | |
| Remove triple backticks and 'json' from the beginning and end of a raw JSON string. | |
| """ | |
| return re.sub(r"```json|```", "", raw_json).strip() |