更新於 2024/11/16閱讀時間約 10 分鐘

[PyQt5 ]建立GUI 通過 yt-dlp來下載 YT

本篇文章將帶你一步步建立一個簡單的 PyQt5 GUI 應用程式,通過 yt-dlp 來下載 YT 視頻。你可以在這個應用中輸入視頻的 URL,並即時看到下載進度。


GUI介面

raw-image

下載到開啟的資料夾路徑


前置條件

在開始之前,請確保你已經安裝了以下軟體和庫:

  1. 安裝 Python 確保你的系統安裝了 Python(3.7 及以上版本)。你可以在命令行中輸入以下命令來檢查版本:
    python --version
    若未安裝,可以前往 Python 官方網站 下載並安裝。
  2. 安裝 PyQt5 PyQt5 是 Python 的一個圖形界面庫,允許你創建桌面應用。使用以下命令安裝:
    pip install pyqt5
  3. 安裝 yt-dlp yt-dlp 是一個強大的視頻下載工具,可以用來下載 YouTube 和其他網站上的視頻。使用以下命令安裝:
    pip install yt-dlp

程式設計:建立 PyQt5 下載器

以下是程式碼,將展示如何使用 PyQt5 創建一個簡單的 GUI 下載工具,並結合 yt-dlp 來下載視頻。

import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QLineEdit, QPushButton, QLabel, QWidget
from PyQt5.QtCore import QThread, pyqtSignal
import subprocess

class DownloadThread(QThread):
update_label = pyqtSignal(str)

def __init__(self, url, parent=None):
super().__init__(parent)
self.url = url

def run(self):
try:
self.update_label.emit("正在處理...") # 初始狀態
# 使用 yt-dlp 下載
process = subprocess.Popen(
['yt-dlp', '--progress', '--newline', self.url], # 啟動 yt-dlp 進行下載
stdout=subprocess.PIPE, # 捕獲標準輸出
stderr=subprocess.PIPE, # 捕獲錯誤輸出
text=True # 開啟文本模式
)
# 實時捕獲輸出,並將其更新到 UI
for line in process.stdout:
self.update_label.emit(line.strip())
process.wait() # 等待下載完成

# 判斷下載是否成功
if process.returncode == 0:
self.update_label.emit("下載完成!")
else:
self.update_label.emit("下載失敗,請檢查網址是否正確。")
except Exception as e:
self.update_label.emit(f"錯誤:{e}") # 顯示錯誤信息

class DownloadApp(QWidget):
def __init__(self):
super().__init__()
self.init_ui()

def init_ui(self):
self.setWindowTitle("YT 下載器") # 設定視窗標題

layout = QVBoxLayout() # 垂直布局

# 輸入框
self.url_input = QLineEdit(self)
self.url_input.setPlaceholderText("請輸入YT視頻網址") # 提示文本
layout.addWidget(self.url_input)

# 下載按鈕
self.download_button = QPushButton("下載", self)
self.download_button.clicked.connect(self.start_download) # 按下按鈕時觸發下載
layout.addWidget(self.download_button)

# 狀態標籤
self.status_label = QLabel("狀態:等待輸入網址", self)
layout.addWidget(self.status_label)

self.setLayout(layout)

def start_download(self):
url = self.url_input.text().strip() # 獲取輸入的網址
if not url:
self.status_label.setText("狀態:請輸入有效的網址") # 若網址無效,顯示提示
return

self.status_label.setText("狀態:正在處理...") # 顯示正在處理的訊息
# 創建下載線程,並開始下載
self.download_thread = DownloadThread(url)
self.download_thread.update_label.connect(self.update_status) # 更新 UI
self.download_thread.start()

def update_status(self, message):
self.status_label.setText(f"狀態:{message}") # 顯示當前狀態

if __name__ == "__main__":
app = QApplication(sys.argv)
window = DownloadApp()
window.resize(400, 200) # 設定視窗大小
window.show() # 顯示視窗
sys.exit(app.exec_()) # 進入主事件循環

程式碼說明

1. 下載線程 (DownloadThread)

  • DownloadThread 類別繼承自 QThread,負責執行視頻下載任務。使用 yt-dlp 命令行工具下載視頻,並通過 stdout 實時捕獲下載過程的輸出。
  • 當下載過程有輸出時,它會觸發 update_label 信號,更新 UI 上的標籤顯示下載進度或錯誤訊息。

2. 主要應用 (DownloadApp)

  • DownloadApp 類別是應用的主界面,包含一個輸入框(QLineEdit)、一個下載按鈕(QPushButton)和一個顯示下載狀態的標籤(QLabel)。
  • 用戶輸入視頻的 URL,並按下下載按鈕後,啟動下載線程。下載過程中的信息會通過信號更新顯示。

3. 使用 yt-dlp 下載視頻

  • 使用 subprocess.Popen 啟動 yt-dlp 下載視頻,並實時捕獲輸出來更新下載進度。
  • 支援進度條、錯誤訊息顯示等功能。

使用方法

  1. 執行程式後,輸入 YouTube 視頻的 URL。
  2. 點擊「下載」按鈕,開始下載。
  3. 下載過程會顯示在界面上的標籤中,並且會顯示進度。

注意事項

  • 合法性:請遵守版權法規,僅下載授權或許可的視頻內容。支持正版,並僅將此工具用於學習或個人用途。
  • 錯誤處理:如果 yt-dlp 遇到無法處理的視頻,會顯示錯誤訊息,並請檢查網址是否正確。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.