基于pytube与custom tkinter的YouTube下载器报错排查
问题
我用pytube和custom tkinter写了一个Python版YouTube视频下载器,但粘贴YouTube链接尝试下载时,程序总是触发自定义的“Download Error”提示。
完整代码如下:
import tkinter import customtkinter from pytube import YouTube # Youtube/Pytube Library def startDownload(): try: ytLink = link.get() ytObject = YouTube(ytLink, on_progress_callback=on_progress) video = ytObject.streams.get_highest_resolution() title.configure(text=ytObject.title, text_color="white") video.download() finishLabel.configure(text="Downloaded!") except: finishLabel.configure(text="Download Error", text_color="red") def on_progress(stream, chunk, bytes_remaining): total_size = stream.filesize bytes_downloaded = total_size - bytes_remaining percentage = bytes_downloaded / total_size * 100 per = str(int(percentage)) progress.configure(text=per + '%') progress.update() progressbar.set(float(percentage) / 100) #system settings customtkinter.set_appearance_mode("System") customtkinter.set_default_color_theme("blue") #Framework app = customtkinter.CTk() app.geometry("720x480") app.title("DerpyStudios Downloader") #UI Elements Basics title = customtkinter.CTkLabel(app, text="Insert Youtube Link Here") title.pack(padx=50, pady=50) #Input url_var = tkinter.StringVar() link = customtkinter.CTkEntry(app, width=350, height=40, textvariable=url_var) link.pack() #Download download = customtkinter.CTkButton(app, text="Download", command=startDownload) download.pack(padx=10, pady=10) #Progress progress = customtkinter.CTkLabel(app, text="0%") progress.pack() progressbar = customtkinter.CTkProgressBar(app, width=400) progressbar.set(0) progressbar.pack(padx=10, pady=10) #Post Download finishLabel = customtkinter.CTkLabel(app, text="") finishLabel.pack() #loop app.mainloop()
程序为常规.py文件,GUI会显示下载错误提示。
解决方案
1. 先捕获具体错误信息
当前代码的except块未捕获具体异常,无法定位问题根源。修改startDownload函数,打印错误详情到控制台:
def startDownload(): try: ytLink = link.get() ytObject = YouTube(ytLink, on_progress_callback=on_progress) video = ytObject.streams.get_highest_resolution() title.configure(text=ytObject.title, text_color="white") video.download() finishLabel.configure(text="Downloaded!") except Exception as e: finishLabel.configure(text="Download Error", text_color="red") print(f"具体错误:{str(e)}") # 控制台输出错误详情
运行后查看控制台信息,能精准定位问题类型。
2. 针对pytube常见问题的修复方法
- 更新pytube到最新版本:YouTube会频繁更新,旧版pytube容易失效。执行命令升级:
pip install --upgrade pytube - 添加OAuth授权:部分网络/地区环境下,pytube的签名验证会失败。初始化YouTube对象时添加授权参数:
首次运行会弹出浏览器窗口要求登录YouTube授权,之后会缓存授权信息。ytObject = YouTube(ytLink, on_progress_callback=on_progress, use_oauth=True, allow_oauth_cache=True) - 检查网络与视频权限:确保网络可正常访问YouTube,部分视频有地区限制,可换一个公开无限制的视频链接测试。
- 替换分辨率获取方式:部分视频的最高分辨率流可能无法直接下载,改用兼容性更好的筛选方式:
该方式会选择带音频的MP4格式最高分辨率流,避免单独下载视频流无声音的问题。video = ytObject.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()
内容的提问来源于stack exchange,提问作者DaDerpyBoi
相关产品推荐
相关产品推荐

