""" tools/youtube_transcript.py —— 工具⑦:抓取 YouTube 视频字幕 有的题目给一个 YouTube 视频链接,问"视频里某人说了什么/出现了什么数字"。 这个工具不去真的"看"视频(那太慢),而是直接抓取视频自带的字幕文字, 把整段台词拼成一段文字交给大模型,从中找答案。 """ import re from langchain_core.tools import tool @tool def youtube_transcript(url: str) -> str: """Return the spoken transcript of a YouTube video given its URL (or video id). Use it to answer questions about what is said in a video.""" # 每个 YouTube 视频都有一个 11 位的唯一编号(video id)。下面用正则从各种格式的链接里把它揪出来: # 比如 youtube.com/watch?v=XXXX、youtu.be/XXXX、/shorts/XXXX 等都能匹配。 match = re.search(r"(?:v=|youtu\.be/|/shorts/|/embed/)([0-9A-Za-z_-]{11})", url) # 匹配到就用匹配出的编号;没匹配到就假设传进来的本身就是编号。 video_id = match.group(1) if match else url.strip() try: from youtube_transcript_api import YouTubeTranscriptApi # 这个库新旧版本用法不同,下面两种写法是为了兼容:哪种可用就用哪种。 if hasattr(YouTubeTranscriptApi, "get_transcript"): # 旧版用法:返回一串"片段",每段是 {"text": 这句话, ...},把所有句子拼起来。 chunks = YouTubeTranscriptApi.get_transcript(video_id) return " ".join(c["text"] for c in chunks) # 新版用法:写法略有不同,但同样是把每段台词拼成整段文字。 fetched = YouTubeTranscriptApi().fetch(video_id) return " ".join(snippet.text for snippet in fetched) except Exception as e: # 抓不到字幕(比如视频没字幕、或服务器 IP 被限制)就返回错误说明。 return f"Could not fetch transcript for '{url}': {e}"