Skip to content

Commit 3429507

Browse files
authored
Merge pull request #103 from ScottSloan/dev
Update v1.61.0
2 parents 82c688a + e278f81 commit 3429507

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+3705
-2910
lines changed

.gitignore

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ download
1313
video.json
1414
bangumi.json
1515
live.json
16-
download.json
17-
download2.json
18-
download3.json
16+
download*.json
1917
ffmpeg.exe
2018
build.bat
2119
test.py
@@ -34,4 +32,5 @@ cz.toml
3432
# uv
3533
uv.toml
3634

37-
.DS_Store
35+
.DS_Store
36+
example.md

CHANGELOG.md

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,20 @@
1-
## 1.60.1 (2025-03-22)
1+
## 1.61.0 (2025-04-18)
22
### 新增
3-
* 支持编辑框三击全选 (#77)
4-
* 支持自定义下载文件名
5-
* 支持截取视频/音频片段 (#78)
6-
* 支持独立设置下载出错重试和自动重启下载选项
7-
* 支持用户登录状态检测
8-
* 下载页面调整为"正在下载"和"下载完成"两个分页
3+
* 支持查看当前视频的大小,编码,码率等信息
4+
* 支持单独下载视频弹幕、字幕和封面
5+
* 支持监听剪切板,自动解析视频 (#108)
6+
* 支持更多自定义字段(发布时间,分区等)
7+
* 支持下载完成后进行文件 MD5 校验,避免合成失败
8+
* 支持修改自动添加的序号类型 (#112)
99

1010
### 优化
11-
* 优化页面布局细节
12-
* 优化下载模块,避免文件写入冲突
13-
* 优化出错重试逻辑 (#81)
14-
* 优化重名文件覆盖逻辑 (#84)
15-
* 优化主页链接框显示效果,支持一键清空
16-
* 优化读取大量断点续传文件时的启动速度
17-
* 优化剧集列表自动勾选逻辑 (#90)
18-
* 优化弹幕、字幕和封面文件下载体验
11+
* 优化对话框创建逻辑,避免重复创建消耗额外内存 (#104)
12+
* 优化界面在不同缩放倍数下的显示效果
13+
* 优化 webview 加载逻辑,避免无法打开登录窗口 (#115)
14+
* 优化重复下载提示
15+
* 优化工具条提示
1916

2017
### 修复
21-
* 修复异常显示下载完成的情况 (#82)
22-
* 修复部分情况下载失败的问题 (#66)
23-
* 修复下载后音视频残缺的问题 (#87)
24-
* 修复部分情况下无法下载弹幕、字幕和封面文件的问题 (#89)
25-
* 修复下载选项窗口取消自动弹出无效的问题
26-
* 修复 bili_ticket 不会自动刷新而导致接口返回请求频繁的问题
27-
* 修复分 P 视频下载后为同一个视频的问题 (#95)
28-
29-
### 贡献者
30-
* 对输入控件添加三击全选支持 by @IvanHanloth in #80
18+
* 修复视频只能下载 H.264 编码的问题 (#101)
19+
* 修复合集中的分 P 视频无法下载的问题 (#102)
20+
* 修复高缩放倍数下二维码显示不完整的问题 (#105)

README.md

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,33 +25,26 @@ Bili23 Downloader 是一款跨平台的 B 站视频下载工具,支持 Windows
2525
有关本程序的使用说明,请参考[项目文档](https://bili23.scott-sloan.cn/doc/waht-is-bili23-downloader.html)
2626

2727
## 更新日志
28-
### 1.60.1 (2025-03-22)
28+
### 1.61.0 (2025-04-18)
2929
#### 新增
30-
* 支持编辑框三击全选
31-
* 支持自定义下载文件名
32-
* 支持截取视频/音频片段
33-
* 支持独立设置下载出错重试和自动重启下载选项
34-
* 支持用户登录状态检测
35-
* 下载页面调整为"正在下载"和"下载完成"两个分页
30+
* 支持查看当前视频的大小,编码,码率等信息
31+
* 支持监听剪切板,自动解析视频
32+
* 支持单独下载视频弹幕、字幕和封面
33+
* 支持更多自定义字段(发布时间,分区等)
34+
* 支持下载完成后进行文件 MD5 校验,避免合成失败
35+
* 支持修改自动添加的序号类型
3636

3737
#### 优化
38-
* 优化页面布局细节
39-
* 优化下载模块,文件避免写入冲突
40-
* 优化出错重试逻辑
41-
* 优化重名文件覆盖逻辑
42-
* 优化主页链接框显示效果,支持一键清空
43-
* 优化读取大量断点续传文件时的启动速度
44-
* 优化剧集列表自动勾选逻辑
45-
* 优化弹幕、字幕和封面文件下载体验
38+
* 优化对话框创建逻辑,避免重复创建消耗额外内存
39+
* 优化界面在不同缩放倍数下的显示效果
40+
* 优化 webview 加载逻辑,避免无法打开登录窗口
41+
* 优化重复下载提示
42+
* 优化工具条提示
4643

4744
#### 修复
48-
* 修复异常显示下载完成的情况
49-
* 修复部分情况下载失败的问题
50-
* 修复下载后音视频残缺的问题
51-
* 修复部分情况下无法下载弹幕、字幕和封面文件的问题
52-
* 修复下载选项窗口取消自动弹出无效的问题
53-
* 修复 bili_ticket 不会自动刷新而导致接口返回请求频繁的问题
54-
* 修复分 P 视频下载后为同一个视频的问题 (#95)
45+
* 修复视频只能下载 H.264 编码的问题
46+
* 修复合集中的分 P 视频无法下载的问题
47+
* 修复高缩放倍数下二维码显示不完整的问题
5548

5649
## 免责声明
5750
本项目仅供个人学习与研究用途,任何通过本项目下载的内容仅限于个人使用,用户自行承担使用本项目可能带来的所有风险。

src/GUI.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from utils.tool_v2 import UniversalTool
55
from utils.auth.cookie import CookieUtils
66

7-
from gui.main import MainWindow
7+
from gui.main_v2 import MainWindow
88

99
class APP(wx.App):
1010
def __init__(self):

src/gui/component/action_button.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def init_UI(self):
2525

2626
hbox = wx.BoxSizer(wx.HORIZONTAL)
2727
hbox.AddSpacer(self.FromDIP(33))
28-
hbox.Add(self.icon, 0, wx.ALL | wx.ALIGN_CENTER, 10)
29-
hbox.Add(self.lab, 0, wx.ALL & (~wx.LEFT) | wx.ALIGN_CENTER, 10)
28+
hbox.Add(self.icon, 0, wx.ALL | wx.ALIGN_CENTER, self.FromDIP(6))
29+
hbox.Add(self.lab, 0, wx.ALL & (~wx.LEFT) | wx.ALIGN_CENTER, self.FromDIP(6))
3030
hbox.AddSpacer(self.FromDIP(33))
3131

3232
vbox = wx.BoxSizer(wx.VERTICAL)

src/gui/component/bitmap_button.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import wx
22

33
from utils.config import Config
4+
from utils.common.enums import Platform
45

56
class BitmapButton(wx.BitmapButton):
67
def __init__(self, parent, bitmap):
78
def get_bitmap_button_style():
8-
match Config.Sys.platform:
9-
case "windows":
9+
match Platform(Config.Sys.platform):
10+
case Platform.Windows:
1011
return 0
1112

12-
case "linux" | "darwin":
13+
case Platform.Linux | Platform.macOS:
1314
return wx.NO_BORDER
1415

1516
wx.BitmapButton.__init__(self, parent, -1, bitmap = bitmap, size = parent.FromDIP((24, 24)), style = get_bitmap_button_style())

src/gui/component/button.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import wx
2+
3+
from utils.config import Config
4+
from utils.common.enums import Platform
5+
6+
class Button(wx.Button):
7+
def __init__(self, parent, label: str, size: tuple, set_variant: bool = False):
8+
wx.Button.__init__(self, parent, -1, label, size = size)
9+
10+
if Config.Sys.platform == Platform.macOS.value and set_variant:
11+
self.SetWindowVariant(wx.WINDOW_VARIANT_LARGE)

src/gui/component/dialog.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,28 @@
11
import wx
22

33
from utils.config import Config
4+
from utils.common.enums import Platform
45

56
class Dialog(wx.Dialog):
67
def __init__(self, parent, title):
78
wx.Dialog.__init__(self, parent, -1, title)
9+
10+
self.Bind(wx.EVT_CLOSE, self.onCloseEVT)
811

912
def get_scaled_size(self, size: tuple):
10-
match Config.Sys.platform:
11-
case "windows":
13+
match Platform(Config.Sys.platform):
14+
case Platform.Windows:
1215
return self.FromDIP(size)
1316

14-
case "linux" | "darwin":
17+
case Platform.Linux | Platform.macOS:
1518
return wx.DefaultSize
1619

1720
def set_dark_mode(self):
1821
if not Config.Sys.dark_mode:
1922
self.SetBackgroundColour("white")
23+
24+
def onCloseEVT(self, event: wx.CloseEvent):
25+
if event.CanVeto():
26+
event.Skip()
27+
else:
28+
self.Destroy()

src/gui/component/download_item_v3.py

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
from io import BytesIO
44
from typing import Callable
55

6-
from utils.common.icon_v2 import IconManager, IconType
6+
from utils.common.icon_v3 import Icon, IconID
77
from utils.common.data_type import DownloadTaskInfo, TaskPanelCallback, DownloaderCallback, MergeCallback, ExtraCallback
8-
from utils.common.enums import DownloadOption, DownloadStatus, ParseType
8+
from utils.common.enums import DownloadOption, DownloadStatus, ParseType, Platform
99
from utils.common.map import video_quality_map, audio_quality_map, video_codec_map, extra_map, get_mapping_key_by_value
1010
from utils.common.cache import DataCache
1111
from utils.common.thread import Thread
1212
from utils.common.exception import GlobalExceptionInfo
13+
from utils.common.file_name import FileNameManager
1314

1415
from utils.module.ffmpeg import FFmpeg
1516
from utils.module.downloader_v2 import Downloader
16-
from utils.common.file_name import FileNameManager
1717

1818
from utils.parse.download import DownloadParser
1919
from utils.parse.extra import ExtraParser
@@ -41,7 +41,7 @@ def init_UI(self):
4141

4242
hbox = wx.BoxSizer(wx.HORIZONTAL)
4343
hbox.AddStretchSpacer()
44-
hbox.Add(self.empty_lab, 0, wx.ALL, 10)
44+
hbox.Add(self.empty_lab, 0, wx.ALL, self.FromDIP(6))
4545
hbox.AddStretchSpacer()
4646

4747
vbox = wx.BoxSizer(wx.VERTICAL)
@@ -73,7 +73,7 @@ def init_UI(self):
7373

7474
hbox = wx.BoxSizer(wx.HORIZONTAL)
7575
hbox.AddStretchSpacer()
76-
hbox.Add(self.more_lab, 0, wx.ALL, 10)
76+
hbox.Add(self.more_lab, 0, wx.ALL, self.FromDIP(6))
7777
hbox.AddStretchSpacer()
7878

7979
vbox = wx.BoxSizer(wx.VERTICAL)
@@ -107,17 +107,15 @@ def __init__(self, parent, info: DownloadTaskInfo, callback: TaskPanelCallback,
107107

108108
def init_UI(self):
109109
def get_progress_bar_size():
110-
match Config.Sys.platform:
111-
case "windows" | "darwin":
110+
match Platform(Config.Sys.platform):
111+
case Platform.Windows | Platform.macOS:
112112
return self.FromDIP((196, 16))
113113

114-
case "linux":
114+
case Platform.Linux:
115115
return self.FromDIP((196, 4))
116116

117117
self.set_dark_mode()
118118

119-
self.icon_manager = IconManager(self)
120-
121119
self.cover_bmp = wx.StaticBitmap(self, -1, size = self.FromDIP((112, 63)))
122120
self.cover_bmp.SetCursor(wx.Cursor(wx.CURSOR_HAND))
123121
self.cover_bmp.SetToolTip("查看封面")
@@ -152,16 +150,16 @@ def get_progress_bar_size():
152150
speed_hbox.Add(self.speed_lab, 0, wx.ALL & (~wx.TOP) & (~wx.BOTTOM) | wx.ALIGN_CENTER, 10)
153151

154152
progress_bar_vbox = wx.BoxSizer(wx.VERTICAL)
155-
progress_bar_vbox.AddSpacer(self.FromDIP(10 if Config.Sys.platform != "linux" else 20))
153+
progress_bar_vbox.AddSpacer(self.FromDIP(10 if Config.Sys.platform != Platform.Linux.value else 20))
156154
progress_bar_vbox.Add(progress_bar_hbox, 0, wx.EXPAND)
157155
progress_bar_vbox.AddStretchSpacer()
158156
progress_bar_vbox.Add(speed_hbox, 0, wx.EXPAND)
159157
progress_bar_vbox.AddSpacer(self.FromDIP(8))
160158

161-
self.pause_btn = BitmapButton(self, self.icon_manager.get_icon_bitmap(IconType.RESUME_ICON))
159+
self.pause_btn = BitmapButton(self, Icon.get_icon_bitmap(IconID.RESUME_ICON))
162160
self.pause_btn.SetToolTip("开始下载")
163161

164-
self.stop_btn = BitmapButton(self, self.icon_manager.get_icon_bitmap(IconType.DELETE_ICON))
162+
self.stop_btn = BitmapButton(self, Icon.get_icon_bitmap(IconID.DELETE_ICON))
165163
self.stop_btn.SetToolTip("取消下载")
166164

167165
panel_hbox = wx.BoxSizer(wx.HORIZONTAL)
@@ -171,7 +169,7 @@ def get_progress_bar_size():
171169
panel_hbox.Add(progress_bar_vbox, 0, wx.EXPAND)
172170
panel_hbox.Add(self.pause_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
173171
panel_hbox.Add(self.stop_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
174-
panel_hbox.AddSpacer(10)
172+
panel_hbox.AddSpacer(self.FromDIP(6))
175173

176174
bottom_border = wx.StaticLine(self, -1, style = wx.LI_HORIZONTAL)
177175

@@ -197,7 +195,7 @@ def init_utils(self):
197195

198196
self.file_tool = DownloadFileTool(self.task_info.id)
199197

200-
self.ffmpeg = FFmpeg()
198+
self.ffmpeg = FFmpeg(self)
201199
self.ffmpeg.set_task_info(self.task_info)
202200

203201
self.show_task_info()
@@ -415,14 +413,10 @@ def onSaveSuffix():
415413

416414
self.file_tool.update_task_info_kwargs(**kwargs)
417415

418-
def onGetFullFileName():
419-
return self.full_file_name
420-
421416
callback = MergeCallback()
422417
callback.onSuccess = self.onMergeSuccess
423418
callback.onError = self.onMergeError
424419
callback.onSaveSuffix = onSaveSuffix
425-
callback.onGetFullFileName = onGetFullFileName
426420

427421
return callback
428422

@@ -539,25 +533,25 @@ def set_download_status(self, status: int):
539533
def set_button_icon(status: int):
540534
match DownloadStatus(status):
541535
case DownloadStatus.Waiting:
542-
self.pause_btn.SetBitmap(self.icon_manager.get_icon_bitmap(IconType.RESUME_ICON))
536+
self.pause_btn.SetBitmap(Icon.get_icon_bitmap(IconID.RESUME_ICON))
543537

544538
self.pause_btn.SetToolTip("开始下载")
545539
self.speed_lab.SetLabel("等待下载...")
546540

547541
case DownloadStatus.Downloading:
548-
self.pause_btn.SetBitmap(self.icon_manager.get_icon_bitmap(IconType.PAUSE_ICON))
542+
self.pause_btn.SetBitmap(Icon.get_icon_bitmap(IconID.PAUSE_ICON))
549543

550544
self.pause_btn.SetToolTip("暂停下载")
551545
self.speed_lab.SetLabel("正在获取下载链接...")
552546

553547
case DownloadStatus.Pause:
554-
self.pause_btn.SetBitmap(self.icon_manager.get_icon_bitmap(IconType.RESUME_ICON))
548+
self.pause_btn.SetBitmap(Icon.get_icon_bitmap(IconID.RESUME_ICON))
555549

556550
self.pause_btn.SetToolTip("继续下载")
557551
self.speed_lab.SetLabel("暂停中...")
558552

559553
case DownloadStatus.Merging:
560-
self.pause_btn.SetBitmap(self.icon_manager.get_icon_bitmap(IconType.PAUSE_ICON))
554+
self.pause_btn.SetBitmap(Icon.get_icon_bitmap(IconID.PAUSE_ICON))
561555

562556
if self.task_info.download_option == DownloadOption.OnlyAudio.value:
563557
lab = "正在转换音频..."
@@ -571,14 +565,14 @@ def set_button_icon(status: int):
571565
self.stop_btn.Enable(False)
572566

573567
case DownloadStatus.Complete:
574-
self.pause_btn.SetBitmap(self.icon_manager.get_icon_bitmap(IconType.FOLDER_ICON))
568+
self.pause_btn.SetBitmap(Icon.get_icon_bitmap(IconID.FOLDER_ICON))
575569

576570
self.pause_btn.SetToolTip("打开文件所在位置")
577571
self.speed_lab.SetLabel("下载完成")
578572
self.stop_btn.SetToolTip("清除记录")
579573

580574
case DownloadStatus.MergeError:
581-
self.pause_btn.SetBitmap(self.icon_manager.get_icon_bitmap(IconType.RETRY_ICON))
575+
self.pause_btn.SetBitmap(Icon.get_icon_bitmap(IconID.RETRY_ICON))
582576

583577
self.pause_btn.SetToolTip("重试")
584578
self.pause_btn.Enable(True)
@@ -597,7 +591,7 @@ def set_button_icon(status: int):
597591
self.speed_lab.SetLabel(f"{lab}失败")
598592

599593
case DownloadStatus.DownloadError:
600-
self.pause_btn.SetBitmap(self.icon_manager.get_icon_bitmap(IconType.RETRY_ICON))
594+
self.pause_btn.SetBitmap(Icon.get_icon_bitmap(IconID.RETRY_ICON))
601595

602596
self.pause_btn.SetToolTip("重试")
603597
self.pause_btn.Enable(True)

src/gui/component/frame.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
import wx
22

3-
from utils.common.icon_v2 import IconManager, IconType
3+
from utils.common.icon_v3 import Icon, IconID
4+
from utils.common.enums import Platform
45
from utils.config import Config
56

67
class Frame(wx.Frame):
78
def __init__(self, parent, title, style = wx.DEFAULT_FRAME_STYLE):
89
wx.Frame.__init__(self, parent, -1, title, style = style)
910

10-
icon_manager = IconManager(self)
11-
12-
self.SetIcon(wx.Icon(icon_manager.get_icon_bitmap(IconType.APP_ICON_SMALL)))
11+
self.SetIcon(wx.Icon(Icon.get_icon_bitmap(IconID.APP_ICON_SMALL)))
1312

1413
def get_scaled_size(self, size: tuple):
15-
match Config.Sys.platform:
16-
case "windows":
14+
match Platform(Config.Sys.platform):
15+
case Platform.Windows:
1716
return self.FromDIP(size)
1817

19-
case "linux" | "darwin":
18+
case Platform.Linux | Platform.macOS:
2019
return wx.DefaultSize

0 commit comments

Comments
 (0)