import wx
import requests
from bs4 import BeautifulSoup
import os
import datetime
import random
class DownloadCoverFrame(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, title=title, size=(400, 300))
self.panel = wx.Panel(self)
# Save path controls
save_path_label = wx.StaticText(self.panel, label="封面保存路径:")
self.save_path_text = wx.TextCtrl(self.panel)
self.save_path_button = wx.Button(self.panel, label="选择路径")
self.save_path_button.Bind(wx.EVT_BUTTON, self.on_select_save_path)
# URL entry controls
url_label = wx.StaticText(self.panel, label="YouTube 视频 URL:")
self.url_text = wx.TextCtrl(self.panel)
add_url_button = wx.Button(self.panel, label="添加 URL")
add_url_button.Bind(wx.EVT_BUTTON, self.on_add_url_button)
# URL list control
url_list_label = wx.StaticText(self.panel, label="URL 列表:")
self.url_listbox = wx.ListBox(self.panel)
# Download button
download_button = wx.Button(self.panel, label="批量下载封面")
download_button.Bind(wx.EVT_BUTTON, self.on_download_button)
# Sizer
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(save_path_label, 0, wx.ALL, 5)
sizer.Add(self.save_path_text, 0, wx.ALL | wx.EXPAND, 5)
sizer.Add(self.save_path_button, 0, wx.ALL | wx.CENTER, 5)
sizer.Add(url_label, 0, wx.ALL, 5)
sizer.Add(self.url_text, 0, wx.ALL | wx.EXPAND, 5)
sizer.Add(add_url_button, 0, wx.ALL | wx.CENTER, 5)
sizer.Add(url_list_label, 0, wx.ALL, 5)
sizer.Add(self.url_listbox, 1, wx.ALL | wx.EXPAND, 5)
sizer.Add(download_button, 0, wx.ALL | wx.CENTER, 5)
self.panel.SetSizer(sizer)
def on_select_save_path(self, event):
dialog = wx.DirDialog(self.panel, "选择封面保存路径")
if dialog.ShowModal() == wx.ID_OK:
save_path = dialog.GetPath()
self.save_path_text.SetValue(save_path)
dialog.Destroy()
def on_add_url_button(self, event):
url = self.url_text.GetValue().strip()
if url:
self.url_listbox.Append(url)
self.url_text.Clear()
def on_download_button(self, event):
save_path = self.save_path_text.GetValue()
if not os.path.exists(save_path):
wx.MessageBox("保存路径不存在", "错误", wx.OK | wx.ICON_ERROR)
return
urls = self.url_listbox.GetStrings()
if not urls:
wx.MessageBox("URL 列表为空", "错误", wx.OK | wx.ICON_ERROR)
return
try:
# current_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")
for url in urls:
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
cover_url = soup.find("meta", property="og:image")["content"]
current_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + str(random.randint(100, 999))
filename = os.path.join(save_path, f"{current_time}.jpg")
with open(filename, "wb") as f:
f.write(requests.get(cover_url).content)
wx.MessageBox("封面已批量下载到指定路径", "成功", wx.OK | wx.ICON_INFORMATION)
except Exception as e:
wx.MessageBox(f"下载封面失败:{e}", "错误", wx.OK | wx.ICON_ERROR)
if __name__ == "__main__":
app = wx.App()
frame = DownloadCoverFrame(None, "YouTube 视频封面下载器")
frame.Show()
app.MainLoop()
|