You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在youtube-dl日志中集成Rich库的下载进度条?

用Rich实现YouTube-DL下载进度条替换日志输出

完全可以实现,核心是利用YouTube-DL的progress_hooks回调拦截下载进度数据,结合Rich的Progress组件渲染美观的进度条,同时可以屏蔽原有的下载进度日志避免重复输出。以下是修改后的完整代码:

from __future__ import unicode_literals
from rich.logging import RichHandler
from rich.progress import Progress, BarColumn, TextColumn, DownloadColumn, TransferSpeedColumn, TimeRemainingColumn
import logging
import youtube_dl

# 配置Rich日志(调整级别为INFO,避免DEBUG级别的冗余进度日志)
logging.basicConfig(
    level=logging.INFO,
    format="%(message)s",
    datefmt="[%X]",
    handlers=[RichHandler(rich_tracebacks=True, markup=True)]
)
log = logging.getLogger('rich')

# 初始化Rich进度条,自定义显示样式
progress = Progress(
    TextColumn("[bold blue]{task.description}", justify="right"),
    BarColumn(bar_width=None),
    "[progress.percentage]{task.percentage:>3.1f}%",
    "•",
    DownloadColumn(),
    "•",
    TransferSpeedColumn(),
    "•",
    TimeRemainingColumn(),
)

def download_hook(progress_data):
    """YouTube-DL进度回调函数,用于更新Rich进度条"""
    if progress_data['status'] == 'downloading':
        # 首次触发时创建进度条任务
        if not hasattr(progress_data, 'task_id'):
            filename = progress_data['filename'].split('/')[-1]
            task_id = progress.add_task(f"[green]下载: {filename}", total=progress_data['total_bytes'])
            progress_data['task_id'] = task_id
        # 更新已下载进度
        progress.update(progress_data['task_id'], completed=progress_data['downloaded_bytes'])
    elif progress_data['status'] == 'finished':
        # 下载完成后标记任务结束并输出日志
        if hasattr(progress_data, 'task_id'):
            progress.update(progress_data['task_id'], completed=progress_data['total_bytes'])
            progress.stop_task(progress_data['task_id'])
        log.info(f"✅ 下载完成:{progress_data['filename']}")

def load(video_id):
    address = f'http://www.youtube.com/watch?v={video_id}'
    ydl_opts = {
        'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'wav',
            'preferredquality': '192'
        }],
        'outtmpl': 'audio/%(id)s.wav',
        "logger": log,
        "progress_hooks": [download_hook],  # 绑定进度回调
        "quiet": True,  # 关闭YouTube-DL自带的进度输出,避免与Rich进度条冲突
        "no_warnings": True,
    }
    # 启动进度条上下文,执行下载
    with progress:
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            ydl.download([address])

关键逻辑说明

  1. 进度回调钩子:download_hook函数会被YouTube-DL在下载过程中频繁调用,传入包含status、downloaded_bytes、total_bytes等关键进度数据的字典。
  2. Rich进度条管理:首次触发下载时创建对应视频的进度条任务,后续持续更新已下载字节数;下载完成后标记任务结束。
  3. 日志冲突规避:通过quiet=True关闭YouTube-DL自带的进度日志,仅保留Rich的美观进度条和关键操作日志。

批量下载适配

如果是批量处理文本文件中的视频ID,只需循环调用load函数即可,Rich进度条会自动同时展示多个下载任务的进度状态。

内容的提问来源于stack exchange,提问作者Nathaniel Zerai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:10:46