如何用if-else识别YouTube视频/播放列表链接并执行对应下载逻辑?
解决方案:识别YouTube链接类型并对应执行下载逻辑
问题根源
当前按钮的command同时调用video_audio()和playlist_audio(),导致播放列表链接会先进入单视频处理逻辑,而YouTube()无法解析播放列表URL,直接触发报错。
修复步骤
- 添加链接类型判断逻辑:通过检查URL中是否包含播放列表特征标识(
playlist或list=)来区分链接类型 - 统一处理入口:创建一个主处理函数,根据判断结果调用对应的下载函数
- 添加异常捕获:避免无效链接导致程序崩溃
修改后的完整代码
from pytube import YouTube, Playlist from tkinter import * import os import re # 设置下载目录 if os.name == "nt": folder = f"{os.getenv('USERPROFILE')}\\Downloads" else: folder = f"{os.getenv('HOME')}/Downloads" def playlist_audio(): get_link = link_field.get().strip() p = Playlist(get_link) # 修复Playlist视频解析正则(针对部分YouTube页面结构) p._video_regex = re.compile(r"\"url\":\"(/watch\?v=[\w-]*a)") for video in p.videos: mp3_audio = video.streams.filter(only_audio=True).first().download(folder) audioconvert(mp3_audio) screen.title('转换完成!') def video_audio(): get_link = link_field.get().strip() screen.title('下载中..') mp3_audio = YouTube(get_link).streams.filter(only_audio=True).first().download(folder) audioconvert(mp3_audio) screen.title('转换完成!') def audioconvert(mp3_audio): base, ext = os.path.splitext(mp3_audio) new_file = base + '.mp3' os.rename(mp3_audio, new_file) def download_handler(): get_link = link_field.get().strip() if not get_link: screen.title('请输入链接!') return screen.title('处理中..') # 判断链接类型,忽略大小写 if 'playlist' in get_link.lower() or 'list=' in get_link: playlist_audio() else: try: video_audio() except Exception as e: screen.title('错误! 无效链接') print(f"错误信息: {e}") # 创建GUI界面 screen = Tk() screen.title('YouTube 转 MP3 转换器') canvas = Canvas(screen, width=400, height=200) canvas.pack() link_field = Entry(screen, width=50) link_label = Label(screen, text="输入视频或播放列表URL:") canvas.create_window(200, 90, window=link_field) canvas.create_window(200, 70, window=link_label) # 修改按钮绑定的处理函数 download_btn = Button(screen, text="下载并转换", bg='green', padx='20', pady='5', font=('Arial', 12), fg='#fff', command=download_handler) canvas.create_window(200, 140, window=download_btn) screen.mainloop()
关键修改说明
- 新增
download_handler()作为统一入口,负责链接类型判断和分发 - 用
lower()处理URL,避免大小写问题导致判断失效 - 添加空链接检查,提示用户输入内容
- 单视频处理添加异常捕获,错误时更新窗口标题并打印错误信息
- 调整窗口标题文案,更符合用户认知
内容的提问来源于stack exchange,提问作者sssssKull
相关产品推荐
相关产品推荐

