如何在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])
关键逻辑说明
- 进度回调钩子:
download_hook函数会被YouTube-DL在下载过程中频繁调用,传入包含status、downloaded_bytes、total_bytes等关键进度数据的字典。 - Rich进度条管理:首次触发下载时创建对应视频的进度条任务,后续持续更新已下载字节数;下载完成后标记任务结束。
- 日志冲突规避:通过
quiet=True关闭YouTube-DL自带的进度日志,仅保留Rich的美观进度条和关键操作日志。
批量下载适配
如果是批量处理文本文件中的视频ID,只需循环调用load函数即可,Rich进度条会自动同时展示多个下载任务的进度状态。
内容的提问来源于stack exchange,提问作者Nathaniel Zerai
相关产品推荐
相关产品推荐

