一鍵將影音轉成mp3音檔 yt-dlp
這是一款強大的開源命令列/CLI工具,可下載許多平台上的影片、音訊、字幕、播放清單、直播回放。

yt-dlp

這是一款強大的開源 命令列/CLI 工具,可下載許多平台上的影片、音訊、字幕、播放清單、直播回放。

下載安裝

安裝 yt-dlp ,可用pip跨 平台 下載

pip install -U yt-dlp

說明:

  1. -U表示升級到最新版

  2. 適用於已安裝 Python的環境,不論是Linux、macOS、Windows都行

測試安裝成功了嗎?輸入:

yt-dlp --version

二條「–」代表指令的選項是完整的單字,若是縮寫則為一條「-」。如果能顯示版本號,就代表安裝成功!

一鍵轉檔

腳本 了!

我請AI幫我下載網站的影音自動轉成.mp3的音檔格式,也可以選擇儲存為.mp4的影音檔,並把輸出的音檔存在指定的目錄~/Music裡面。

建立一個空白文件並命名為yt2media.sh,輸入以下指令、存檔並給可執行權限就變成一個shell了。

💡更新

Youtube加了些東東,讓使用者無法取得真實的網址而無法下載,所以我補上防https401、403錯誤的程式碼。我的電腦必須在虛擬環境下執行python完成任務,您可以選擇刪除跟虛擬環境有關的指令。

#!/usr/bin/env bash
# yt2media.sh — 互動版:自動解析 YouTube 連結並下載 MP3/MP4(固定輸出 ~/Music)

set -u

# ---- 選 yt-dlp 執行檔(優先 ~/.local/bin → pipx → 系統)----
YTDLP=""
for c in \
  "$HOME/.local/bin/yt-dlp" \
  "$HOME/.local/pipx/venvs/yt-dlp/bin/yt-dlp" \
  "$(command -v yt-dlp 2>/dev/null)"; do
  [[ -n "${c:-}" && -x "$c" ]] && { YTDLP="$c"; break; }
done
if [[ -z "$YTDLP" ]]; then
  echo "❌ 找不到 yt-dlp。請先安裝官方單檔版:"
  echo '   mkdir -p ~/.local/bin && wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O ~/.local/bin/yt-dlp && chmod +x ~/.local/bin/yt-dlp'
  exit 1
fi

# ---- 輸入 YouTube 連結 ----
read -rp "請輸入 YouTube 影片連結: " RAW_URL

# ---- 選擇輸出格式 ----
echo "請選擇下載格式:"
select FORMAT in "MP3 (音訊)" "MP4 (影片)"; do
  case "$REPLY" in
    1) MEDIA_TYPE="mp3"; break ;;
    2) MEDIA_TYPE="mp4"; break ;;
    *) echo "請輸入 1 或 2";;
  esac
done

# ---- 固定輸出目錄 ----
OUTPUT_DIR="$HOME/Music"; mkdir -p "$OUTPUT_DIR"
OUT_TMPL="${OUTPUT_DIR}/%(title).80s_%(id)s.%(ext)s"

# ---- 淨化 URL(抓出正確的 11 字元 ID)----
normalize_url() { python3 - "$1" <<'PY'
import sys, re, urllib.parse as u
s=sys.argv[1].strip().strip('"').strip("'")
def to_watch(id_): return f"https://www.youtube.com/watch?v={id_}"
p=u.urlparse(s); q=u.parse_qs(p.query)
m=re.fullmatch(r'[A-Za-z0-9_-]{11}', s)
if m: print(to_watch(s)); sys.exit(0)
if 'v' in q: print(to_watch(q['v'][0])); sys.exit(0)
m=re.search(r'([A-Za-z0-9_-]{11})', s)
if m: print(to_watch(m.group(1))); sys.exit(0)
print(s)
PY
}
CLEAN_URL="$(normalize_url "$RAW_URL")"

# ---- Cookie 偵測 ----
COOKIE_MODE="none"; BROWSER="brave"; BROWSER_COOKIES_OPTS=()
if [[ -f "$HOME/Downloads/cookies.txt" ]]; then
  COOKIE_MODE="file"; COOKIES_FILE="$HOME/Downloads/cookies.txt"
elif python3 - <<'PY' >/dev/null 2>&1
import importlib, sys
try: importlib.import_module("secretstorage"); importlib.import_module("keyring")
except Exception: sys.exit(1)
PY
then
  COOKIE_MODE="browser"; BROWSER_COOKIES_OPTS=( --cookies-from-browser "$BROWSER" )
fi
case "$COOKIE_MODE" in
  browser) echo "🟡 使用瀏覽器 cookie:$BROWSER" ;;
  file)    echo "🟡 使用 cookies.txt:$COOKIES_FILE" ;;
  none)    echo "⚠️ 無 cookies;遇 403/152 機率較高" ;;
esac

# ---- yt-dlp 共用參數(新版 YouTube/SABR workaround)----
COMMON_OPTIONS=(
  --ignore-config
  --restrict-filenames
  --retries infinite
  --fragment-retries infinite
  --concurrent-fragments 1
  --http-chunk-size 1M
  --force-ipv4
  --user-agent "Mozilla/5.0 (X11; Linux x86_64)"
  # 關鍵修改:不要強制 web_embedded,用 JS 真實版本來解碼
  --extractor-args "youtube:player_js_version=actual"
  --no-playlist
)

case "$COOKIE_MODE" in
  browser) COMMON_OPTIONS+=( "${BROWSER_COOKIES_OPTS[@]}" ) ;;
  file)    COMMON_OPTIONS+=( --cookies "$COOKIES_FILE" ) ;;
esac

# ---- 執行下載:先單檔 18/22,失敗再退高品質 ----
LOGFILE="$(mktemp -t ytdlp_XXXX.log)"
set +e
if [[ "$MEDIA_TYPE" == "mp3" ]]; then
  "$YTDLP" "${COMMON_OPTIONS[@]}" -o "$OUT_TMPL" -f "18/22/best" \
    -x --audio-format mp3 --audio-quality 0 \
    "$CLEAN_URL" 2>&1 | tee "$LOGFILE"
else
  "$YTDLP" "${COMMON_OPTIONS[@]}" -o "$OUT_TMPL" -f "18/22/best" \
    --merge-output-format mp4 \
    "$CLEAN_URL" 2>&1 | tee "$LOGFILE"
fi
YTD_STATUS=${PIPESTATUS[0]}
set -e

# 若是 YouTube 回傳 Error code: 152,先提醒你這可能是官方限制
if grep -q "Error code: 152" "$LOGFILE"; then
  echo "⚠️ 注意:YouTube 回傳 Error code: 152,表示影片在目前的 client/環境下被標記為「不可播放」"
  echo "   這通常是 YouTube 端的限制(例如嵌入限制、區域/帳號限制),不一定能透過 yt-dlp 解決。"
fi

if [[ $YTD_STATUS -ne 0 ]]; then
  echo "⚠️ 單檔 18/22 失敗,改試高品質…"
  if [[ "$MEDIA_TYPE" == "mp3" ]]; then
    "$YTDLP" "${COMMON_OPTIONS[@]}" -o "$OUT_TMPL" \
      -f "ba/bestaudio/best" \
      -x --audio-format mp3 --audio-quality 0 \
      "$CLEAN_URL" 2>&1 | tee -a "$LOGFILE"
  else
    "$YTDLP" "${COMMON_OPTIONS[@]}" -o "$OUT_TMPL" \
      -f "b[ext=mp4]/bv*+ba/best" \
      --merge-output-format mp4 \
      "$CLEAN_URL" 2>&1 | tee -a "$LOGFILE"
  fi
  YTD_STATUS=${PIPESTATUS[0]}
fi

if [[ $YTD_STATUS -ne 0 ]]; then
  echo "❌ 下載失敗,請檢查日誌:$LOGFILE"
  echo "👉 可用格式:"
  "$YTDLP" "${COMMON_OPTIONS[@]}" -F "$CLEAN_URL" || true
  exit 1
fi

echo "✅ 下載完成!已儲存至 ~/Music"

yt2media.sh可執行權限

chmod +x ~/Music/yt2media.sh

我把檔案放在~/Music,所以在該目錄執行.sh

./yt2media.sh

然後輸入欲下載的網址,等待終端機完成 任務 吧!我寫可以在終端機看下戴進度的腳本,這樣比較不會無聊吧。

注意事項

雖然技術上yt-dlp可以下載很多東西,但法律與倫理上仍有一些必須注意的紅線:

🔒 1. 智慧財產權

  • 僅用於個人離線觀看通常會被視為合理使用,但下載後轉傳、重上傳或商業用途就可能違法。
  • 破解 DRM 加密的影片(如 Netflix、Disney+)涉及非法行為,屬嚴格禁止。

🤐 2. 隱私與肖像權

  • 若下載影片包含他人私密影像或未經同意拍攝的內容,轉傳可能侵犯他人隱私或肖像權,要特別注意直播影片、監視畫面、街頭拍攝等。

🌐 3. 平台使用條款

  • 多數影音平台明文禁止未經授權的影片抓取、下載。
  • 使用工具如 yt-dlp 可能違反這些服務條款(Terms of service), 但不一定違法。

🧑‍⚖️ 4. 合法與灰色地帶

  • 工具本身合法,但使用方式可能非法。
  • 在自己的網站或文章中,嵌入或放置別人 YouTube 影片的連結或嵌入碼,是沒有問題的,YouTube本來就提供分享及嵌入功能。

上次修改於 2025-07-27