影片批量下載工具 - 支援 YouTube 與 Bilibili 平台
# 1. 安裝 (使用 uv 推薦)
uv sync
# 或 pip install PySide6 yt-dlp
# 2. 執行
python video_downloader.py三步驟開始下載:
- 選擇下載路徑 (
Ctrl+O) - 貼上影片網址(支援拖放!)
- 開始下載 (
Ctrl+Enter)
- 🎬 支援 YouTube 和 Bilibili 影片/播放清單下載
- 📊 下載進度追蹤與歷史記錄
- ⌨️ 鍵盤快捷鍵與拖放支援
- 🍪 Cookie 狀態指示(🟢有效 🟡未驗證 🔴無效)
- 🔄 自動重試機制
- 💡 完整的 Tooltip 說明
| 快捷鍵 | 功能 |
|---|---|
Ctrl+Enter |
開始下載 |
Ctrl+Shift+V |
快速貼上 URL |
Ctrl+O |
選擇下載路徑 |
F1 |
顯示說明 |
Ctrl+Q |
退出程式 |
- Python 3.10+
- PySide6
- yt-dlp (用於下載)
- ffmpeg (用於合併影片,可選)
# 安裝開發依賴
pip install -e ".[dev]"
# 執行測試
pytest
# 程式碼檢查
ruff check .# 1. Install (uv recommended)
uv sync
# or: pip install PySide6 yt-dlp
# 2. Run
python video_downloader.pyThree steps to start downloading:
- Select download path (
Ctrl+O) - Paste video URL (drag & drop supported!)
- Start download (
Ctrl+Enter)
- 🎬 YouTube and Bilibili video/playlist downloads
- 📊 Download progress tracking and history
- ⌨️ Keyboard shortcuts and drag-drop support
- 🍪 Cookie status indicators (🟢valid 🟡unverified 🔴invalid)
- 🔄 Auto-retry mechanism
- 💡 Comprehensive tooltips
| Shortcut | Action |
|---|---|
Ctrl+Enter |
Start download |
Ctrl+Shift+V |
Quick paste URL |
Ctrl+O |
Select download path |
F1 |
Show help |
Ctrl+Q |
Quit |
- Python 3.10+
- PySide6
- yt-dlp (for downloading)
- ffmpeg (for merging, optional)
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Lint
ruff check .See CHANGELOG.md for full history.
- 🐛 修正啟用檔名修剪時
[%(id)s]被截斷導致不同影片產生相同檔名、互相覆蓋的問題 - 🔧 啟用修剪時自動將 ID 移到檔名前方
[%(id)s] %(uploader)s - %(title)s,確保唯一識別碼不被截斷
- 🐛 修正播放清單下載只下載部分影片且成功數只顯示 1 的問題
- 🔧 播放清單模式現在會先展開為個別影片 URL 再逐一下載,正確追蹤每部影片的進度與成功/失敗狀態
- 🔧 自動過濾已下載影片,避免重複下載
- 🆕 新增「記憶此播放清單」選項:使用者可自行決定是否記錄播放清單供日後追蹤更新
- 🆕 檢查播放清單時對話框顯示播放清單名稱,批次檢查多個清單時可清楚辨別
- 🔧 播放清單狀態儲存新增標題欄位,批次檢查日誌顯示各清單名稱
- 🐛 修正 YouTube n-challenge 仍然失敗的問題:加入
--remote-components ejs:github下載遠端 challenge solver 腳本 - 🔧 TV player variant + remote EJS solver 雙重修正,徹底解決
Requested format is not available錯誤
- 🐛 修正 YouTube n-challenge 解碼失敗導致
Requested format is not available錯誤 - 🔧 YouTube 下載自動使用
player_js_variant=tv繞過 player 4e51e895 的 EJS 相容性問題
- 🐛 修正 Cookie 檔案不存在時自動 fallback 到
--cookies-from-browser firefox,解決 403 錯誤 - 🐛 下載失敗後自動清理
.part、.ytdl、.temp等不完整檔案
- 🐛 播放清單檢查自動排除被作者刪除/私人化的影片
- 🐛 修正播放清單部分影片失敗導致整個任務標記為失敗的問題
- 🔧 yt-dlp 的 ERROR/WARNING 訊息現在會顯示在日誌中
- 🐛 修正播放清單檢查無法偵測本地檔案缺失的問題
- 🐛 檢查時自動掃描已知影片的本地檔案,缺失時清除歷史紀錄並提示重新下載
- 🔧 例外處理改善:17 處 bare
except Exception:替換為具體例外類型 - 🔧 Cookie 提取程式碼重構,消除 ~40 行重複
- 🔧 新增執行緒安全機制(threading.Lock)防止競態條件
- 🐛 修正已刪除影片在播放清單檢查時不會重新下載的問題
- 🧪 測試擴充:從 9 個增加到 80 個單元測試
- 🆕 鍵盤快捷鍵支援 (Ctrl+Enter, Ctrl+Shift+V, F1, Ctrl+O, Ctrl+Q)
- 🆕 拖放 URL 與檔案支援
- 🆕 自動 URL 類型偵測
- 🆕 Cookie 狀態指示燈 (🟢🟡🔴)
- 🆕 所有設定選項 Tooltip 說明
- 🆕 完整文件:快速入門、FAQ、疑難排解、使用指南
- 🆕 增強說明對話框
- 新增下載速度限制、自動重試、系統托盤、主題切換等功能
- 從 PyQt6 遷移到 PySide6
See CONTRIBUTING.md