一鍵將影音轉成mp3音檔 yt-dlp
這是一款強大的開源命令列/CLI工具,可下載許多平台上的影片、音訊、字幕、播放清單、直播回放。
yt-dlp
這是一款強大的開源 命令列/CLI 工具,可下載許多平台上的影片、音訊、字幕、播放清單、直播回放。
下載安裝
pip install -U yt-dlp
說明:
-
-U表示升級到最新版 -
適用於已安裝 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