【问题标题】:How to use Progress bar in pytube?如何在 pytube 中使用进度条?
【发布时间】:2019-10-05 11:06:31
【问题描述】:

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

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()

【问题讨论】:

    标签: python-3.x pytube


    【解决方案1】:

    我正在使用进度条2

    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()
    

    【讨论】:

    • 你为什么要加 1,000,000?
    【解决方案2】:

    这是用于从 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)
    

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

    请参阅Showing progress in pytube,了解 pytube 内置 on_progress 函数的使用。

    【讨论】:

      【解决方案3】:

      你首先需要定义进度条功能,比如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%

      玩得开心!

      【讨论】:

      • NameError: name 'filesize' is not defined,我该如何解决这个错误?
      • filesize 是我们必须在函数之外设置的东西。这就是在函数中设置全局的原因。
      【解决方案4】:
      # 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()
      

      【讨论】:

        猜你喜欢
        • 2020-10-03
        • 2019-12-05
        • 1970-01-01
        • 2019-09-16
        • 1970-01-01
        • 2021-11-14
        • 2019-09-23
        • 1970-01-01
        相关资源
        最近更新 更多