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
完整示例
- 以 1080p 下载 MP4 视频:
python scripts/download_video.py "https://www.youtube.com/watch?v=dQw4w9WgXcQ" -q 1080p
- 仅下载音频为 MP3:
python scripts/download_video.py "https://www.youtube.com/watch?v=dQw4w9WgXcQ" -a
- 以 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()