YouTube视频下载工具

一个基于Python的工具集,用于下载YouTube视频和播放列表,支持简单的脚本下载和高级的MCP服务器管理。

  • by granludo
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 granludo/youtube-mcp-download

使用说明

YouTube视频下载器

使用yt-dlp下载YouTube内容的Python工具的综合集合,包括简单的脚本和高级MCP服务器。

工具

1.简单脚本

单视频下载器(youtube_downloader.py)

下载带有进度跟踪的单个YouTube视频。

播放列表下载器(playlist_downloader.py)

有序下载整个YouTube播放列表。

2.MCP服务器(youtube_mcp_server_fastmcp.py)

使用FastMCP的高级MCP(模型上下文协议)服务器,提供:

  • 异步视频和播放列表下载
  • 作业跟踪和状态监控
  • 用于元数据存储的SQLite数据库
  • 图书馆综合管理
  • Claude桌面集成

特性

简单脚本

单视频下载器

  • ✅ 提示用户输入YouTube URL
  • ✅ 下载最优质的视频
  • ✅ 创建一个 downloads 保存视频的文件夹
  • ✅ 显示下载进度
  • ✅ 优雅地处理错误
  • ✅ 如果yt-dlp不存在,则自动安装yt-dlp
  • ✅ 无pytube依赖性(根据要求)

播放列表下载器

  • ✅ 提示用户输入YouTube播放列表URL
  • ✅ 下载整个播放列表(默认情况下最多50个视频)
  • ✅ 为每个播放列表创建有组织的文件夹
  • ✅ 下载前显示播放列表信息
  • ✅ 下载带有播放列表索引号的视频
  • ✅ 如果yt-dlp不存在,则自动安装yt-dlp
  • ✅ 下载大型播放列表前的确认提示

MCP服务器功能

  • ✅ 异步下载:开始下载并获取用于跟踪的作业ID
  • ✅ 作业状态监控:检查下载进度和状态
  • ✅ 元数据库:带有视频/播放列表信息的SQLite数据库
  • ✅ 图书馆管理:浏览所有下载的内容
  • ✅ 错误处理:全面的错误跟踪和报告
  • ✅ 并发下载:可以同时运行多个下载
  • ✅ 元数据:存储标题、描述、持续时间、文件路径等。

需求

  • Python 3.11+
  • yt-dlp(丢失时自动安装)
  • MCP SDK(丢失时自动安装)

用法

单视频下载

  1. 运行单个视频下载程序:

    python3 youtube_downloader.py
    
  2. 出现提示时输入YouTube URL

  3. 视频将下载到 downloads 文件夹

播放列表下载

  1. 运行播放列表下载程序:

    python3 playlist_downloader.py
    
  2. 出现提示时输入YouTube播放列表URL

  3. 查看播放列表信息并确认下载

  4. 所有视频都将下载到特定于播放列表的文件夹中

MCP服务器使用情况

MCP服务器为异步下载和库管理提供了四种主要工具。

与紫外线一起使用(推荐)

  1. 安装依赖项并运行:
    cd /Users/granludo/code/testing/youtube_download
    uv sync
    uv run python start_server.py
    

直接使用Python

python3 youtube_mcp_server_fastmcp.py

可用的MCP工具

  1. 下载_视频 -开始异步视频下载
  2. 下载播放列表 -开始异步播放列表下载
  3. get_download_status -监控下载进度
  4. cancel_下载 -取消正在运行的下载
  5. list_downloads -浏览所有下载作业
  6. 获取_视频_元数据 -无需下载即可获取视频信息

例子

单个视频示例

$ python3 youtube_downloader.py

==================================================
YouTube Video Downloader
==================================================
Enter YouTube URL: https://www.youtube.com/watch?v=dQw4w9WgXcQ
📥 Downloading video from: https://www.youtube.com/watch?v=dQw4w9WgXcQ
✓ Download completed!
📁 Files saved to: /path/to/downloads

播放列表示例

$ python3 playlist_downloader.py

==================================================
YouTube Playlist Downloader
==================================================
Enter YouTube Playlist URL: https://www.youtube.com/playlist?list=PLrAXtmRdnEQy5rhxJj7aKre_2qO5yQ5nI
📊 Analyzing playlist...
📋 Playlist name: My Music Playlist
🎥 Number of videos: 25

🔄 Download 25 videos? (y/N): y
📥 Downloading playlist: My Music Playlist
✓ Playlist download completed!
📁 All videos saved to: /path/to/playlists/My Music Playlist

MCP服务器示例

使用紫外线

  1. 安装并运行服务器:

    cd /Users/granludo/code/testing/youtube_download
    uv sync                    # Install dependencies
    uv run python start_server.py  # Start server
    
  2. 服务器将静默启动 (根据MCP协议的要求,没有stdout输出)

MCP工具示例

工具1:下载单个视频

{
  "name": "download_video",
  "arguments": {
    "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "output_dir": "downloads"
  }
}

答复: "Download started successfully. Job ID: abc123-def456-ghi789"

工具2:下载播放列表

{
  "name": "download_playlist",
  "arguments": {
    "url": "https://www.youtube.com/playlist?list=PLrAXtmRdnEQy5rhxJj7aKre_2qO5yQ5nI",
    "output_dir": "playlists"
  }
}

答复: "Playlist download started successfully. Job ID: def456-ghi789-jkl012"

工具3:检查下载状态

{
  "name": "get_download_status",
  "arguments": {
    "job_id": "abc123-def456-ghi789"
  }
}

响应:包含作业状态、进度和元数据的JSON对象

工具4:列表下载

{
  "name": "list_downloads",
  "arguments": {}
}

答复:

📹 VIDEOS:
- Never Gonna Give You Up (ID: video-uuid-123)
  Path: /downloads/Never Gonna Give You Up.mp4
  Duration: 213s

📁 PLAYLISTS:
- Music Collection (ID: playlist-uuid-456)
  Videos: 25
  Path: /playlists/Music Collection

完整工作流示例

  1. 配置Claude桌面 -将MCP服务器添加到您的 claude_desktop_config.json:

    {
      "mcpServers": {
        "youtube-mcp-tools": {
          "command": "/opt/homebrew/bin/uv",
          "args": [
            "--directory",
            "/Users/granludo/code/testing/youtube_download",
            "run",
            "start_server.py"
          ]
        }
      }
    }
    
  2. 下载视频 克劳德:

    "Download this YouTube video: https://www.youtube.com/watch?v=jNQXAC9IVRw"
    

    服务器将启动下载并立即返回作业ID。

  3. 检查下载状态:

    "What's the status of that download?"
    
  4. 列出所有下载:

    "Show me all my download jobs"
    

备注

简单脚本

  • 如果找不到yt-dlp,这两个脚本都会自动安装yt-dlp
  • 视频与原始标题一起保存
  • 播放列表视频按其在播放列表中的位置编号
  • 默认情况下,播放列表下载器将下载限制为50个视频(可调)
  • 这两个脚本都能优雅地处理键盘中断
  • 下载被组织在单独的文件夹中,分别用于视频和播放列表

MCP服务器

  • 使用FastMCP简化MCP服务器实施
  • 创建 youtube_library.db 用于元数据的SQLite数据库
  • 最多支持3次并发下载
  • 每次下载都使用唯一的UUID进行作业跟踪
  • 丰富的元数据存储,包括标题、描述、持续时间、文件路径
  • 异步下载,立即返回作业ID
  • 全面的错误处理和记录
  • 与Claude Desktop和其他MCP客户端兼容