55# This software is released under the MIT License.
66#
77# http://opensource.org/licenses/mit-license.php
8-
8+ from functools import lru_cache
99from urllib .parse import urlparse , parse_qs
1010
1111import requests
@@ -32,6 +32,24 @@ def new_server(
3232
3333 ytt_api = YouTubeTranscriptApi (proxy_config = proxy_config )
3434
35+ @lru_cache
36+ def _get_transcript (video_id : str , lang : str ) -> str :
37+ if lang == "en" :
38+ languages = ["en" ]
39+ else :
40+ languages = [lang , "en" ]
41+
42+ page = requests .get (
43+ f"https://www.youtube.com/watch?v={ video_id } " , headers = {"Accept-Language" : "," .join (languages )}
44+ )
45+ page .raise_for_status ()
46+ soup = BeautifulSoup (page .text , "html.parser" )
47+ title = soup .title .string if soup .title else "Transcript"
48+
49+ transcripts = ytt_api .fetch (video_id , languages = languages )
50+
51+ return f"# { title } \n " + "\n " .join ((item .text for item in transcripts ))
52+
3553 mcp = FastMCP ("Youtube Transcript" )
3654
3755 @mcp .tool ()
@@ -50,20 +68,6 @@ def get_transcript(
5068 raise ValueError (f"couldn't find a video ID from the provided URL: { url } ." )
5169 video_id = q [0 ]
5270
53- if lang == "en" :
54- languages = ["en" ]
55- else :
56- languages = [lang , "en" ]
57-
58- page = requests .get (
59- f"https://www.youtube.com/watch?v={ video_id } " , headers = {"Accept-Language" : "," .join (languages )}
60- )
61- page .raise_for_status ()
62- soup = BeautifulSoup (page .text , "html.parser" )
63- title = soup .title .string if soup .title else ""
64-
65- transcripts = ytt_api .fetch (video_id , languages = languages )
66-
67- return f"# { title } \n " + "\n " .join ((item .text for item in transcripts ))
71+ return _get_transcript (video_id , lang )
6872
6973 return mcp
0 commit comments