YouTube 视频下载器(Video Downloader)

入门 Starter 工具型 Tool claude-code
5 min read · 249 lines

下载 YouTube 视频:自定义画质、格式,支持仅音频 MP3

YouTube 视频下载器(Video Downloader)

下载 YouTube 视频,可自定义画质和格式选项。当用户要求下载、保存或抓取 YouTube 视频时使用此技能。支持多种画质设置(best、1080p、720p、480p、360p)、多种格式(mp4、webm、mkv)以及仅音频的 MP3 下载。

快速开始

最简单的下载方式:

python scripts/download_video.py "https://www.youtube.com/watch?v=VIDEO_ID"

这将以最高可用画质的 MP4 格式下载视频到 /mnt/user-data/outputs/

选项

画质设置

使用 -q--quality 指定视频画质:

  • best(默认):最高可用画质
  • 1080p:Full HD(全高清)
  • 720p:HD(高清)
  • 480p:Standard definition(标清)
  • 360p:较低画质
  • worst:最低可用画质

示例:

python scripts/download_video.py "URL" -q 720p

格式选项

使用 -f--format 指定输出格式(仅视频下载时):

  • mp4(默认):兼容性最好
  • webm:现代格式
  • mkv:Matroska 容器格式

示例:

python scripts/download_video.py "URL" -f webm

仅音频

使用 -a--audio-only 仅下载音频为 MP3:

python scripts/download_video.py "URL" -a

自定义输出目录

使用 -o--output 指定不同的输出目录:

python scripts/download_video.py "URL" -o /path/to/directory

完整示例

  1. 以 1080p 下载 MP4 视频:
python scripts/download_video.py "https://www.youtube.com/watch?v=dQw4w9WgXcQ" -q 1080p
  1. 仅下载音频为 MP3:
python scripts/download_video.py "https://www.youtube.com/watch?v=dQw4w9WgXcQ" -a
  1. 以 720p WebM 格式下载到自定义目录:
python scripts/download_video.py "https://www.youtube.com/watch?v=dQw4w9WgXcQ" -q 720p -f webm -o /custom/path

工作原理

本技能使用 yt-dlp,一个强大的 YouTube 下载工具,功能包括:

  • 如果未安装会自动安装
  • 下载前先获取视频信息
  • 选择符合你条件的最佳可用流
  • 需要时自动合并视频和音频流
  • 支持广泛的 YouTube 视频格式

重要说明

  • 默认下载保存到 /mnt/user-data/outputs/
  • 视频文件名根据视频标题自动生成
  • 脚本自动处理 yt-dlp 的安装
  • 默认只下载单个视频(自动跳过播放列表)
  • 更高画质的视频下载时间更长,占用更多磁盘空间

下载脚本源码

#!/usr/bin/env python3
"""
YouTube 视频下载器
下载 YouTube 视频,支持自定义画质和格式选项。
"""

import argparse
import sys
import subprocess
import json


def check_yt_dlp():
    """检查 yt-dlp 是否已安装,未安装则自动安装。"""
    try:
        subprocess.run(["yt-dlp", "--version"], capture_output=True, check=True)
    except (subprocess.CalledProcessError, FileNotFoundError):
        print("yt-dlp not found. Installing...")
        subprocess.run([sys.executable, "-m", "pip", "install",
                       "--break-system-packages", "yt-dlp"], check=True)


def get_video_info(url):
    """获取视频信息(不下载)。"""
    result = subprocess.run(
        ["yt-dlp", "--dump-json", "--no-playlist", url],
        capture_output=True, text=True, check=True
    )
    return json.loads(result.stdout)


def download_video(url, output_path="/mnt/user-data/outputs",
                   quality="best", format_type="mp4", audio_only=False):
    """
    下载 YouTube 视频。

    参数:
        url: YouTube 视频 URL
        output_path: 保存目录
        quality: 画质设置(best, 1080p, 720p, 480p, 360p, worst)
        format_type: 输出格式(mp4, webm, mkv)
        audio_only: 是否仅下载音频(mp3)
    """
    check_yt_dlp()

    # 构建命令
    cmd = ["yt-dlp"]

    if audio_only:
        cmd.extend([
            "-x",                    # 提取音频
            "--audio-format", "mp3",
            "--audio-quality", "0",  # 最佳质量
        ])
    else:
        # 视频画质设置
        if quality == "best":
            format_string = "bestvideo+bestaudio/best"
        elif quality == "worst":
            format_string = "worstvideo+worstaudio/worst"
        else:
            # 指定分辨率(如 1080p、720p)
            height = quality.replace("p", "")
            format_string = (f"bestvideo[height<={height}]"
                           f"+bestaudio/best[height<={height}]")

        cmd.extend([
            "-f", format_string,
            "--merge-output-format", format_type,
        ])

    # 输出模板
    cmd.extend([
        "-o", f"{output_path}/%(title)s.%(ext)s",
        "--no-playlist",  # 默认不下载播放列表
    ])

    cmd.append(url)

    print(f"下载来源:{url}")
    print(f"画质:{quality}")
    print(f"格式:{'mp3 (仅音频)' if audio_only else format_type}")
    print(f"输出:{output_path}\n")

    try:
        # 先获取视频信息
        info = get_video_info(url)
        print(f"标题:{info.get('title', 'Unknown')}")
        print(f"时长:{info.get('duration', 0) // 60}:"
              f"{info.get('duration', 0) % 60:02d}")
        print(f"上传者:{info.get('uploader', 'Unknown')}\n")

        # 下载视频
        subprocess.run(cmd, check=True)
        print(f"\n下载完成!")
        return True
    except subprocess.CalledProcessError as e:
        print(f"\n下载视频出错:{e}")
        return False
    except Exception as e:
        print(f"\n错误:{e}")
        return False


def main():
    parser = argparse.ArgumentParser(
        description="下载 YouTube 视频,支持自定义画质和格式"
    )
    parser.add_argument("url", help="YouTube 视频 URL")
    parser.add_argument(
        "-o", "--output",
        default="/mnt/user-data/outputs",
        help="输出目录(默认:/mnt/user-data/outputs)"
    )
    parser.add_argument(
        "-q", "--quality",
        default="best",
        choices=["best", "1080p", "720p", "480p", "360p", "worst"],
        help="视频画质(默认:best)"
    )
    parser.add_argument(
        "-f", "--format",
        default="mp4",
        choices=["mp4", "webm", "mkv"],
        help="视频格式(默认:mp4)"
    )
    parser.add_argument(
        "-a", "--audio-only",
        action="store_true",
        help="仅下载音频为 MP3"
    )

    args = parser.parse_args()

    success = download_video(
        url=args.url,
        output_path=args.output,
        quality=args.quality,
        format_type=args.format,
        audio_only=args.audio_only
    )

    sys.exit(0 if success else 1)


if __name__ == "__main__":
    main()

相关技能 Related Skills