yt-dlp 使用筆記:Python 呼叫外部工具的實作

更新 發佈閱讀 9 分鐘

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

確認目前版本:yt-dlp --version
若版本不是最新,可以執行該指令更新:pip install -U yt-dlp

raw-image
  1. 由於會回傳下載失敗的網址在資料夾內的文字檔,因此開啟後會有一個選項,一般可依先勾選否直接貼上網址。
    raw-image
  2. 在選擇否之後就可以貼上網址,選擇OK之後會出現下載模式供選擇,若是一般的單一影片,建議選擇"否",不然他會不停的延伸各種影片的網址永無止境的下載。若貼上播放清單網址,則可處理該清單內的影音內容 。
    raw-image
  3. 最後選擇或創建你要轉檔的資料夾即可完成,最後確認failed.txt內是否有下載失敗的內容,有的話在重複執行一次就行,但是有個前提,若你的youtube內就已經是被隱藏或打不開的影片,是無法轉檔的哦。
    raw-image
  4. 完成後會顯示結果畫面:
raw-image

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 工具練習與流程紀錄,
範例內容僅適用於使用者對其擁有合法權利之影音內容
請遵守各平台服務條款與所在地相關法規, 作者不對任何不當使用行為負責。


    含 AI 應用內容
留言
avatar-img
劉權儀的沙龍
0會員
4內容數
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
別讓你的房子,變成家中最大的「閒置資產」 作為一名服務高淨值客戶的私人銀行顧問,我每天的任務只有一個:幫客戶「讓錢滾動」。然而,當我觀察身旁許多同樣育有子女的朋友們,即便他們多半已是職場上的中高階主管,表面上看似光鮮亮麗,有房有車;但實際上,大家都是典型的「夾心世代」。每個月薪水一入帳,扣掉沉重的
Thumbnail
別讓你的房子,變成家中最大的「閒置資產」 作為一名服務高淨值客戶的私人銀行顧問,我每天的任務只有一個:幫客戶「讓錢滾動」。然而,當我觀察身旁許多同樣育有子女的朋友們,即便他們多半已是職場上的中高階主管,表面上看似光鮮亮麗,有房有車;但實際上,大家都是典型的「夾心世代」。每個月薪水一入帳,扣掉沉重的
Thumbnail
本文介紹如何使用Python、PyTorch和yfinance建立三層式類神經網路模型預測股票價格,並結合管制圖進行數據健康性檢視,有機會提供更全面的投資分析參考。
Thumbnail
本文介紹如何使用Python、PyTorch和yfinance建立三層式類神經網路模型預測股票價格,並結合管制圖進行數據健康性檢視,有機會提供更全面的投資分析參考。
Thumbnail
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
Thumbnail
什麼是時間複雜度? 時間複雜度(Time Complexity)是用來衡量演算法執行時間隨著輸入大小變化的增長速度。通常使用 Big-O 表示法(O 記號)來描述,目的是估算最壞情況下的運行時間。 時間複雜度的計算主要基於以下幾個原則: 忽略常數係數:O(2n) 與 O(n) 視為相同,因為增
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
Thumbnail
上一篇提到利用cv2.inRangex,建立遮罩來過濾出紅球。這次我們稍微更動一下程式碼,將紅球變顏色。 [OpenCV][Python]利用cv2.inRange搭配cv2.bitwise_and過濾紅球 結果圖 將紅球改變顏色成藍球
Thumbnail
用小畫家隨意畫三個圈分別用紅藍綠,我們利用cv2.inRange與搭配cv2.bitwise_and,將紅球過濾出來吧。 程式範例 因為OpenCV中cv2.imread讀取圖檔預設讀取是為[B,G,R]的格式,所以設置紅色範圍要注意設定在R的範圍內。
Thumbnail
用小畫家隨意畫三個圈分別用紅藍綠,我們利用cv2.inRange與搭配cv2.bitwise_and,將紅球過濾出來吧。 程式範例 因為OpenCV中cv2.imread讀取圖檔預設讀取是為[B,G,R]的格式,所以設置紅色範圍要注意設定在R的範圍內。
Thumbnail
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
Thumbnail
在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。 本文將利用Traceback來讓異常訊息變得更好理解。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News