get_subtitles
Retrieve subtitles from any Bilibili video by providing its URL. Returns subtitles grouped by language with timestamps for easy access.
Instructions
Get subtitles from a Bilibili video
Args:
url: Bilibili video URL, e.g., https://www.bilibili.com/video/BV1x341177NN
Returns:
List of subtitles grouped by language. Each entry contains subtitle content with timestamps.Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Implementation Reference
- bilibili_video_info_mcp/server.py:18-42 (handler)The 'get_subtitles' tool handler function. Extracts BVID from URL, gets basic video info (aid/cid), then calls bilibili_api.get_subtitles to fetch subtitle data grouped by language.
async def get_subtitles(url: str) -> list: """Get subtitles from a Bilibili video Args: url: Bilibili video URL, e.g., https://www.bilibili.com/video/BV1x341177NN Returns: List of subtitles grouped by language. Each entry contains subtitle content with timestamps. """ bvid = bilibili_api.extract_bvid(url) if not bvid: return [f"错误: 无法从 URL 提取 BV 号: {url}"] aid, cid, error = bilibili_api.get_video_basic_info(bvid) if error: return [f"获取视频信息失败: {error['error']}"] subtitles, error = bilibili_api.get_subtitles(aid, cid) if error: return [f"获取字幕失败: {error['error']}"] if not subtitles: return ["该视频没有字幕"] return subtitles - The tool signature (async def get_subtitles(url: str) -> list) serves as the schema definition, with docstring specifying input URL and output list of subtitles grouped by language.
async def get_subtitles(url: str) -> list: """Get subtitles from a Bilibili video Args: url: Bilibili video URL, e.g., https://www.bilibili.com/video/BV1x341177NN Returns: List of subtitles grouped by language. Each entry contains subtitle content with timestamps. """ bvid = bilibili_api.extract_bvid(url) if not bvid: return [f"错误: 无法从 URL 提取 BV 号: {url}"] aid, cid, error = bilibili_api.get_video_basic_info(bvid) if error: return [f"获取视频信息失败: {error['error']}"] subtitles, error = bilibili_api.get_subtitles(aid, cid) if error: return [f"获取字幕失败: {error['error']}"] if not subtitles: return ["该视频没有字幕"] return subtitles - bilibili_video_info_mcp/server.py:11-17 (registration)The decorator @mcp.tool registers get_subtitles as an MCP tool with annotations including title '获取视频字幕', readOnlyHint and openWorldHint.
@mcp.tool( annotations={ "title": "获取视频字幕", "readOnlyHint": True, "openWorldHint": False } ) - The helper function get_subtitles(aid, cid) that actually calls the Bilibili API (API_GET_SUBTITLE), fetches subtitle JSON data, parses subtitle_body into content lists grouped by language ('lan').
def get_subtitles(aid, cid): """Fetches subtitles for a given aid and cid.""" headers = _get_headers() subtitles = [] try: params_subtitle = {'aid': aid, 'cid': cid} response_subtitle = requests.get(API_GET_SUBTITLE, params=params_subtitle, headers=headers) response_subtitle.raise_for_status() subtitle_data = response_subtitle.json() if subtitle_data.get('code') == 0 and subtitle_data.get('data', {}).get('subtitle', {}).get('subtitles'): for sub_meta in subtitle_data['data']['subtitle']['subtitles']: if sub_meta.get('subtitle_url'): try: subtitle_json_url = f"https:{sub_meta['subtitle_url']}" response_sub_content = requests.get(subtitle_json_url, headers=headers) response_sub_content.raise_for_status() sub_content = response_sub_content.json() subtitle_body = sub_content.get('body', []) content_list = [item.get('content', '') for item in subtitle_body] subtitles.append({ 'lan': sub_meta['lan'], 'content': content_list }) except requests.RequestException as e: print(f"Could not fetch or parse subtitle content from {sub_meta.get('subtitle_url')}: {e}") return subtitles, None except requests.RequestException as e: return [], {'error': f'Could not fetch subtitles: {e}'}