
最近又重新写了一个 哔哩哔哩下载器,至于放弃 之前那个 的原因在 README 中写的很清楚的了,在此就不再多说了。
界面仍然是用 Qt 写的,毕竟方便,然后转为 py,与之前相比多了点东西,可以下载图片和收藏,其实下载图片是之前写过的一个,在 这里,就是将那个库中的功能整合到这个下载器中。
其实用 Python 来写的话很简单,所以 Github 上有很多这样的项目,为什么要重新写一个,是因为有的界面比较辣眼睛,或者不符合我的审美。
我用 Qt 画界面的时候,更多是使用原生 UI,没有使用 QSS 来增加样式,这就是我的设计原则:
1 | 简约但不简单 |
所以重新写了一个,写起来也很快,因为视频的下载链接就在请求的 HTML 中,每个分 p 就是一个 HTML 请求,格式如下:
1 | f'https://www.bilibili.com/video/av{aid}?p={page}' |
用正则表达式就可以将下载链接提取出来
1 | '"order":(.*?),"length":(.*?),"size":(.*?),.*?"url":"(.*?)"' |
每一个分 p 视频有可能多个切片,上面的表达式提取出来的第一个参数就是切片的序号,第二个就是时间,第三个是大小,最后一个就是切片链接。
为了加快速度,使用多线程来获取视频链接,每个线程就是一个分 p 视频的 get 请求。
然后使用 QT 中的 信号、槽 机制来动态更新数据,每个线程获取、解析数据完毕之后就发信号,然后这个信号会被主线程捕获,对应一个更新视频表(vtable)的槽函数。
还有就是下载视频,每次更新视频表之后会保存视频链接(为了省空间仅保存下载链接),选择视频表的行点击下载就会将对应行的链接传给下载视频的线程以下载,若是多切片则会使用 ffmpeg 来合并视频。
获取图片、收藏类似,都是使用多线程获取下载链接,然后保存链接,最后选中表格的行点击下载。
部分功能演示如下: