fetch_youtube_subtitles.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/bin/bash
  2. #
  3. # fetch_youtube_subtitles.sh - 下载YouTube视频字幕
  4. #
  5. # 使用yt-dlp下载YouTube视频或频道的字幕文件(手动字幕优先,自动生成字幕兜底)
  6. #
  7. # 用法:
  8. # ./fetch_youtube_subtitles.sh <URL> [语言代码] [输出目录]
  9. #
  10. # 参数:
  11. # URL - YouTube视频URL或频道URL(必需)
  12. # 语言代码 - 字幕语言,默认 en(可选)
  13. # 输出目录 - 字幕保存位置,默认当前目录(可选)
  14. #
  15. # 示例:
  16. # ./fetch_youtube_subtitles.sh "https://youtube.com/watch?v=xxx"
  17. # ./fetch_youtube_subtitles.sh "https://youtube.com/watch?v=xxx" zh-Hans ./subs
  18. # ./fetch_youtube_subtitles.sh "https://youtube.com/@MrBeast" en ./mrbeast_subs
  19. #
  20. set -euo pipefail
  21. # ---------- 参数解析 ----------
  22. URL="${1:-}"
  23. LANG="${2:-en}"
  24. OUTDIR="${3:-.}"
  25. if [ -z "$URL" ]; then
  26. echo "用法: $0 <YouTube URL> [语言代码] [输出目录]"
  27. echo ""
  28. echo "示例:"
  29. echo " $0 'https://youtube.com/watch?v=xxx'"
  30. echo " $0 'https://youtube.com/watch?v=xxx' zh-Hans ./subs"
  31. echo " $0 'https://youtube.com/@MrBeast' en ./mrbeast_subs"
  32. exit 1
  33. fi
  34. # ---------- 检查/安装 yt-dlp ----------
  35. if ! command -v yt-dlp &> /dev/null; then
  36. echo "[INFO] yt-dlp 未安装,正在通过 pip 安装..."
  37. pip install -q yt-dlp
  38. if ! command -v yt-dlp &> /dev/null; then
  39. echo "[ERROR] yt-dlp 安装失败,请手动安装: pip install yt-dlp 或 brew install yt-dlp"
  40. exit 1
  41. fi
  42. echo "[INFO] yt-dlp 安装完成"
  43. fi
  44. # ---------- 创建输出目录 ----------
  45. mkdir -p "$OUTDIR"
  46. echo "========================================="
  47. echo " YouTube字幕下载器"
  48. echo "========================================="
  49. echo "URL: $URL"
  50. echo "语言: $LANG"
  51. echo "输出: $OUTDIR"
  52. echo ""
  53. # ---------- 先列出可用字幕 ----------
  54. echo "[INFO] 正在查询可用字幕..."
  55. yt-dlp --list-subs --skip-download "$URL" 2>/dev/null | head -50 || true
  56. echo ""
  57. # ---------- 下载字幕 ----------
  58. # 策略:先尝试手动字幕,失败后回退到自动生成字幕
  59. echo "[INFO] 尝试下载手动字幕 (${LANG})..."
  60. if yt-dlp \
  61. --write-sub \
  62. --sub-lang "$LANG" \
  63. --sub-format "srt/vtt/best" \
  64. --skip-download \
  65. --no-overwrites \
  66. -o "${OUTDIR}/%(title)s.%(ext)s" \
  67. "$URL" 2>/dev/null; then
  68. echo "[OK] 手动字幕下载成功"
  69. else
  70. echo "[INFO] 无手动字幕,尝试下载自动生成字幕..."
  71. if yt-dlp \
  72. --write-auto-sub \
  73. --sub-lang "$LANG" \
  74. --sub-format "srt/vtt/best" \
  75. --skip-download \
  76. --no-overwrites \
  77. -o "${OUTDIR}/%(title)s.%(ext)s" \
  78. "$URL" 2>/dev/null; then
  79. echo "[OK] 自动生成字幕下载成功"
  80. else
  81. echo "[ERROR] 未找到任何 ${LANG} 字幕"
  82. echo "[提示] 尝试其他语言代码,或用 --list-subs 查看可用字幕"
  83. exit 1
  84. fi
  85. fi
  86. echo ""
  87. echo "[INFO] 下载的字幕文件:"
  88. find "$OUTDIR" -maxdepth 1 \( -name "*.srt" -o -name "*.vtt" \) -newer "$0" 2>/dev/null | head -20 || \
  89. ls -la "$OUTDIR"/*.{srt,vtt} 2>/dev/null || echo " (无新文件)"
  90. echo ""
  91. echo "完成!"