程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

[python]B站视频下载器优化:下载/合并分开,断点下载,图标问题

hfteth 2025-07-28 16:37:40 技术文章 5 ℃

我们将进行以下优化:

  1. 将下载和合并分开,但同步进行:即每下载完一个视频和音频,就立即合并,而不是等所有下载完成再合并。
  2. 在合并时使用subprocess运行ffmpeg,并确保在后台运行(不显示窗口)。同时,检查ffmpeg是否存在,如果不存在则弹窗提醒。
  3. 去掉分辨率选择功能,默认选择最高画质。
  4. 修改界面,下方窗口只显示每一个视频的下载情况(如:第1个视频:下载完成,合并完成),而详细的日志记录在文件中,并提供打开日志目录的按钮。
  5. 实现断点下载功能:记录每个视频的下载状态(未开始、下载中、下载完成、合并完成),程序启动时检查并恢复。
  6. 解决exe图标问题:确保在打包时指定图标,并在代码中正确设置窗口图标。

具体步骤:

  1. 移除画质选择相关代码。
  2. 在下载线程中,每下载完一个视频和音频,立即合并,然后删除临时文件。
  3. 使用subprocess运行ffmpeg时,设置`creationflags=subprocess.CREATE_NO_WINDOW`(仅Windows)来隐藏窗口。同时,在运行ffmpeg之前检查是否存在,如果不存在则弹窗提醒并终止。
  4. 修改主界面,移除日志区域,改为一个列表控件(如QListWidget)来显示每个视频的状态(如:第1个视频:下载完成,合并完成)。
  5. 实现状态记录:
  • 使用一个JSON文件记录任务状态(保存目录下的`download_status.json`)。
  • 每个视频的状态包括:cid, title, 视频下载状态, 音频下载状态, 合并状态, 临时文件路径等。
  • 每次开始下载前,检查状态文件,跳过已完成的视频。
  • 每个步骤(视频下载完成、音频下载完成、合并完成)后更新状态并保存。

注意:由于断点续传需要记录状态,因此我们将每个视频的下载和合并视为一个独立任务,并记录其状态。

由于改动较大,我们将逐步调整代码。

首先,修改DownloadThread类:

  • 移除画质选择,固定使用最高画质。
  • 在下载每个视频前检查状态,如果已下载并合并则跳过。
  • 每完成一个步骤(视频下载、音频下载、合并)更新状态并保存到文件。
  • 合并操作放在下载音频完成后立即进行。

其次,修改主界面:

  • 去掉日志区域,添加一个QListWidget来显示每个视频的状态(一行一个)。
  • 添加一个“查看日志”的链接,点击后显示下载过程打印的信息。

但注意:我们之前是实时将日志输出到界面的QTextEdit,现在改为:

  • 在下载线程中,我们将日志同时输出到文件和控制台(通过信号更新界面状态列表)。
  • 同时,我们使用一个状态列表(列表控件)来显示每个视频的简要状态。

由于要求详细日志通过文件查看,我们可以:

  • 在保存目录下创建一个`logs`子目录,每次运行生成一个日志文件(以时间命名)。
  • 同时,在界面上我们只显示每个视频的当前状态(用列表控件,一行一个视频,显示标题和状态)。

考虑到时间,我们简化日志记录:将详细日志写入文件,同时将每个视频的状态更新通过信号发送到主界面,更新列表控件。

具体实现:

1. 状态记录文件(`download_status.json`)结构示例:

{
    "url": "原始URL",
    "save_dir": "保存目录",
    "tasks": [
        {
            "cid": 123,
            "title": "视频标题",
            "video_downloaded": true,
            "audio_downloaded": true,
            "merged": true,
            "output_file": "保存目录/1-标题.mp4"
        },
        ... 其他任务
    ]
}
  1. 每次启动时,如果状态文件存在且URL和保存目录匹配,则恢复状态。
  2. 下载过程中,每完成一步更新状态并保存。
  3. 在合并时,使用subprocess运行ffmpeg,并设置CREATE_NO_WINDOW标志(Windows)以避免弹出控制台窗口。同时捕获ffmpeg的错误。
  4. 检查ffmpeg是否存在:在程序启动时,尝试运行`ffmpeg -version`,如果返回错误,则弹窗提醒用户安装。

Tags:

最近发表
标签列表