|
@@ -1,4 +1,4 @@
|
|
|
-from typing import Any
|
|
|
+from typing import Any, ClassVar
|
|
|
|
|
|
from duckduckgo_search import DDGS
|
|
|
|
|
@@ -11,6 +11,17 @@ class DuckDuckGoVideoSearchTool(BuiltinTool):
|
|
|
Tool for performing a video search using DuckDuckGo search engine.
|
|
|
"""
|
|
|
|
|
|
+ IFRAME_TEMPLATE: ClassVar[str] = """
|
|
|
+<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; \
|
|
|
+max-width: 100%; border-radius: 8px;">
|
|
|
+ <iframe
|
|
|
+ style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"
|
|
|
+ src="{src}"
|
|
|
+ frameborder="0"
|
|
|
+ allowfullscreen>
|
|
|
+ </iframe>
|
|
|
+</div>"""
|
|
|
+
|
|
|
def _invoke(self, user_id: str, tool_parameters: dict[str, Any]) -> list[ToolInvokeMessage]:
|
|
|
query_dict = {
|
|
|
"keywords": tool_parameters.get("query"),
|
|
@@ -26,6 +37,9 @@ class DuckDuckGoVideoSearchTool(BuiltinTool):
|
|
|
# Remove None values to use API defaults
|
|
|
query_dict = {k: v for k, v in query_dict.items() if v is not None}
|
|
|
|
|
|
+ # Get proxy URL from parameters
|
|
|
+ proxy_url = tool_parameters.get("proxy_url", "").strip()
|
|
|
+
|
|
|
response = DDGS().videos(**query_dict)
|
|
|
|
|
|
# Create HTML result with embedded iframes
|
|
@@ -36,20 +50,21 @@ class DuckDuckGoVideoSearchTool(BuiltinTool):
|
|
|
title = res.get("title", "")
|
|
|
embed_html = res.get("embed_html", "")
|
|
|
description = res.get("description", "")
|
|
|
+ content_url = res.get("content", "")
|
|
|
|
|
|
- # Modify iframe to be responsive
|
|
|
- if embed_html:
|
|
|
- # Replace fixed dimensions with responsive wrapper and iframe
|
|
|
- embed_html = """
|
|
|
-<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; \
|
|
|
-max-width: 100%; border-radius: 8px;">
|
|
|
- <iframe
|
|
|
- style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"
|
|
|
- src="{src}"
|
|
|
- frameborder="0"
|
|
|
- allowfullscreen>
|
|
|
- </iframe>
|
|
|
-</div>""".format(src=res.get("embed_url", ""))
|
|
|
+ # Handle TED.com videos
|
|
|
+ if not embed_html and "ted.com/talks" in content_url:
|
|
|
+ embed_url = content_url.replace("www.ted.com", "embed.ted.com")
|
|
|
+ if proxy_url:
|
|
|
+ embed_url = f"{proxy_url}{embed_url}"
|
|
|
+ embed_html = self.IFRAME_TEMPLATE.format(src=embed_url)
|
|
|
+
|
|
|
+ # Original YouTube/other platform handling
|
|
|
+ elif embed_html:
|
|
|
+ embed_url = res.get("embed_url", "")
|
|
|
+ if proxy_url and embed_url:
|
|
|
+ embed_url = f"{proxy_url}{embed_url}"
|
|
|
+ embed_html = self.IFRAME_TEMPLATE.format(src=embed_url)
|
|
|
|
|
|
markdown_result += f"{title}\n\n"
|
|
|
markdown_result += f"{embed_html}\n\n"
|