Spaces:
Runtime error
Runtime error
File size: 5,431 Bytes
21ffffb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
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
from r_types import (
SearchVideosResponse,
SearchImagesResponse,
SearchLinksResponse,
LocalMapResponse,
KnowledgeBaseResponse
)
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 embed_image(json_data: SearchImagesResponse) -> str:
"""
Given image data with 'original' (URL) and 'title',
returns an HTML string with an <img> tag.
"""
title = json_data.get("title", "").replace('"', '\\"')
original = json_data.get("original", "")
if not original:
return "<p>No image URL provided.</p>"
embed_html = f"""
<img src="{original}" alt="{title}" style="width:100%">
"""
return embed_html
def build_search_links_response(urls: List[str]) -> List[SearchLinksResponse]:
"""
Convert raw URLs into a list of dicts,
each with 'title' and 'link' keys for display.
"""
results = []
for url in urls:
# Extract the last part of the URL as a rough "title"
raw_title = url.rstrip("/").split("/")[-1]
# Decode URL-encoded entities like %20
decoded_title = urllib.parse.unquote(raw_title)
# Replace hyphens/underscores with spaces
nice_title = decoded_title.replace("_", " ").replace("-", " ")
results.append({"title": nice_title, "link": url})
return results
def format_links(links: List[SearchLinksResponse]) -> 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\n"
for item in links:
links_md += f"- [{item['title']}]({item['link']})\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(result: KnowledgeBaseResponse) -> str:
"""
Given a dictionary of knowledge data (e.g., about a person),
produce a Markdown string summarizing that info.
"""
title = result.get("title", "Unknown")
type_ = result.get("type", "")
born = result.get("born", "")
died = result.get("died", "")
content = f"""
**{title}**
Type: {type_}
Born: {born}
Died: {died}
"""
return content
def format_followup_questions(questions: List[str]) -> str:
"""
Given a list of follow-up questions, return a Markdown string
with each question as a bulleted list item.
"""
if not questions:
return "No follow-up questions provided."
questions_md = "### Follow-up Questions\n\n"
for question in questions:
questions_md += f"- {question}\n"
return questions_md |