如何在pytube中使用进度栏?

时间:2019-05-18 09:56:59

标签: python-3.x pytube

我想在代码中实现进度条,但是新旧的实现方式都不起作用。

How to add progress bar? 此修复程序在最新版本中无效。
这是最新的文档 https://pypi.org/project/pytube/

from pytube import YouTube
url="https://youtu.be/J5EXnh53A1k"
path=r'D://'
yt = YouTube(url)
yt.register_on_progress_callback(show_progress_bar)#by commenting this line code works fine but no progress bar is displyed
yt.streams.filter(file_extension='mp4').first().download(path)


def show_progress_bar(stream, _chunk, _file_handle, bytes_remaining):
  current = ((stream.filesize - bytes_remaining)/stream.filesize)
  percent = ('{0:.1f}').format(current*100)
  progress = int(50*current)
  status = '█' * progress + '-' * (50 - progress)
  sys.stdout.write(' ↳ |{bar}| {percent}%\r'.format(bar=status, percent=percent))
  sys.stdout.flush()

4 个答案:

答案 0 :(得分:1)

这里是用来从shell下载youtube视频和显示进度条的函数:

from pytube import YouTube
from pytube.cli import on_progress

fuchsia = '\033[38;2;255;00;255m'   #  color as hex #FF00FF
reset_color = '\033[39m'

# url is url of youtube video to download.
def download_youtube(url):

    """ Instantiates YouTube class and downloads selected video.  Uses Built-in
    pytube.cli function on_progress to show a DOS style progress bar. """
    yt = YouTube(url, on_progress_callback=on_progress)

    # following line displays title and number of times video has been viewed. 
    print(f'\n' + fuchsia + 'Downloading: ', yt.title, '~ viewed', yt.views, 
    'times.')

    # creates download and downloads to subdirectory called 'downloads'
    yt.streams.first().download('.\\downloads\\')

    # displays message verifying download is complete, and resets color scheme 
    # back to original color scheme.
    print(f'\nFinished downloading:  {yt.title}' + reset_color)

显示颜色已切换,因为默认进度条相当亮。如果之前下载过视频,则会显示“下载完成:”消息,但不会显示进度条。

有关使用 pytube 的内置 on_progress 函数的信息,请参阅此 Showing progress in pytube

答案 1 :(得分:1)

首先需要定义进度条函数,比如progress_function

def progress_function(chunk, file_handle, bytes_remaining):
    global filesize
    current = ((filesize - bytes_remaining)/filesize)
    percent = ('{0:.1f}').format(current*100)
    progress = int(50*current)
    status = '█' * progress + '-' * (50 - progress)
    sys.stdout.write(' ↳ |{bar}| {percent}%\r'.format(bar=status, percent=percent))
    sys.stdout.flush()

然后将上面定义的函数 progress_function 注册到 on_progress_callback 中,如下所示:

yt_obj = YouTube(<<youtube_video_url>>, on_progress_callback = progress_function)

其余代码如下:

yt_obj.streams.filter(progressive=True, file_extension='mp4').get_highest_resolution().download(output_path='/home/myusername/Videos', filename='MyVideo')

输出如下:

↳ |██████████████████████████████████----------- -----| 68.4%

玩得开心!!

答案 2 :(得分:0)

我正在使用progressbar2

def progress_Check(stream = None, chunk = None, file_handle = None, remaining = None):

        percent = file_size - remaining + 1000000   

        try: 
            # updates the progress bar                                   
            bar.update(round(percent/1000000,2))
        except: 
            # progress bar dont reach 100% so a little trick to make it 100    
            bar.update(round(file_size/1000000,2))

yt = YouTube(url, on_progress_callback=progress_Check)
yt = yt.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first().download()

答案 3 :(得分:-1)

# importing YouTube from pytube

import progressbar as progress
from pytube import YouTube


def progress(streams, chunk: bytes, bytes_remaining: int):
    contentsize = video.filesize
    size = contentsize - bytes_remaining

    print('\r' + '[Download progress]:[%s%s]%.2f%%;' % (
    '█' * int(size*20/contentsize), ' '*(20-int(size*20/contentsize)), float(size/contentsize*100)), end='')


url = 'https://www.youtube.com/watch?v=qOVAbKKSH10'
yt = YouTube(url, on_progress_callback=progress)
video = yt.streams.get_highest_resolution()
video.download()