get_subtitles
Extract subtitles with timestamps from Bilibili videos. Input a video URL to receive organized subtitle content by language for accessibility and analysis.
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
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Implementation Reference
- bilibili_video_info_mcp/server.py:11-42 (handler)Primary implementation of the 'get_subtitles' MCP tool: async handler registered via @mcp.tool decorator, with input schema (url: str), docstring description, and logic to extract video info and fetch subtitles.@mcp.tool( annotations={ "title": "获取视频字幕", "readOnlyHint": True, "openWorldHint": False } ) 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
- Helper function implementing the core API logic for fetching and parsing Bilibili subtitles using aid and cid parameters.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}'}