其實最近在用Python寫一些小工具,只是我並不會寫Python,該功能也主要是透過AI生成的主要執行步驟如下(目前引用的yt-dlp是20260131的,網站會經常更新,因此該工具也必須經常更新才行):
該工具僅做Python學習使用,勿將相關流程或產出內容用於任何不法用途或營利、散布行為。本文重點在於記錄 Python 呼叫外部工具、參數傳遞與錯誤處理流程,非著重於下載內容本身。
確認目前版本:yt-dlp --version
若版本不是最新,可以執行該指令更新:pip install -U yt-dlp

- 由於會回傳下載失敗的網址在資料夾內的文字檔,因此開啟後會有一個選項,一般可依先勾選否直接貼上網址。

- 在選擇否之後就可以貼上網址,選擇OK之後會出現下載模式供選擇,若是一般的單一影片,建議選擇"否",不然他會不停的延伸各種影片的網址永無止境的下載。若貼上播放清單網址,則可處理該清單內的影音內容 。

- 最後選擇或創建你要轉檔的資料夾即可完成,最後確認failed.txt內是否有下載失敗的內容,有的話在重複執行一次就行,但是有個前提,若你的youtube內就已經是被隱藏或打不開的影片,是無法轉檔的哦。

- 完成後會顯示結果畫面:

Python程式碼分享如下(以AI生成):
以下程式碼僅節錄核心流程,實際使用時請自行研究 yt-dlp 相關參數
import subprocess
import json
import os
import tkinter as tk
from tkinter import simpledialog, filedialog, messagebox
# ===== tkinter 初始化(不顯示主視窗)=====
root = tk.Tk()
root.withdraw()
# ===== 選擇來源:網址 or failed.txt =====
source_is_txt = messagebox.askyesno(
"選擇來源",
"請選擇下載來源:\n\n【是】選擇 failed.txt(或網址清單 txt)\n【否】手動貼上 YouTube 網址"
)
urls = []
# ===== 從 txt 載入網址(單曲模式)=====
if source_is_txt:
txt_path = filedialog.askopenfilename(
title="請選擇 failed.txt(或包含網址的 txt)",
filetypes=[("Text file", "*.txt")]
)
if not txt_path:
messagebox.showwarning("取消", "未選擇檔案,程式結束")
exit()
with open(txt_path, "r", encoding="utf-8") as f:
urls = [line.strip() for line in f if line.strip()]
if not urls:
messagebox.showwarning("錯誤", "txt 內沒有任何網址")
exit()
download_playlist = False # 強制單曲模式
# ===== 手動輸入網址 =====
else:
input_url = simpledialog.askstring(
"輸入網址",
"請輸入 YouTube 影片或播放清單網址:"
)
if not input_url:
messagebox.showwarning("取消", "未輸入網址,程式結束")
exit()
# 是否下載整個播放清單?
download_playlist = messagebox.askyesno(
"下載模式",
"是否下載整個播放清單?\n\n【是】下載 playlist\n【否】只下載這一首"
)
# playlist 模式 → 先展開
if download_playlist:
result = subprocess.run(
["yt-dlp", "--flat-playlist", "-J", input_url],
capture_output=True,
text=True,
encoding="utf-8"
)
data = json.loads(result.stdout)
for entry in data.get("entries", []):
urls.append(f"https://www.youtube.com/watch?v={entry['id']}")
else:
urls = [input_url]
# ===== 選擇下載資料夾 =====
target_dir = filedialog.askdirectory(
title="請選擇下載資料夾(可自行新建)"
)
if not target_dir:
messagebox.showwarning("取消", "未選擇資料夾,程式結束")
exit()
os.makedirs(target_dir, exist_ok=True)
# ===== 開始下載 =====
failed = []
for url in urls:
print(f"下載中: {url}")
cmd = [
"yt-dlp",
"--no-playlist", # 防止延伸下載
# 音訊處理參數(依需求自行調整)
"-x", "--audio-format", "mp3",
"--user-agent", "Mozilla/5.0",
"--referer", "https://www.youtube.com/",
"--sleep-interval", "1",
"--max-sleep-interval", "5",
"--retries", "10",
"--fragment-retries", "10",
"-o", os.path.join(target_dir, "%(title)s.%(ext)s"),
url
]
ret = subprocess.run(cmd)
if ret.returncode != 0:
failed.append(url)
# ===== 寫入新的 failed.txt =====
failed_path = os.path.join(target_dir, "failed.txt")
with open(failed_path, "w", encoding="utf-8") as f:
for u in failed:
f.write(u + "\n")
# ===== 完成提示 =====
messagebox.showinfo(
"完成",
f"下載完成!\n"
f"總數:{len(urls)}\n"
f"失敗:{len(failed)}\n\n"
f"失敗清單:\n{failed_path}"
)
本文僅為 Python 工具練習與流程紀錄,
範例內容僅適用於使用者對其擁有合法權利之影音內容。
請遵守各平台服務條款與所在地相關法規, 作者不對任何不當使用行為負責。










