-1

我有一个可以工作的 pytube 脚本,但在创建进度条的额外代码应该去哪里有点挣扎。

#! usr/bin/python3

import sys
from pytube import YouTube

if len(sys.argv) < 2:
    print('Argument 1 must be the YouTube URL. Argument 2 must be a location to save it.')

yt = YouTube(sys.argv[1])

print()
print("Knocking on YouTube's Door....")
print(f'Downloading: {yt.title}')
print()

yt = YouTube(sys.argv[1]).streams.first().download(sys.argv[2])

print('Download Complete!')
4

2 回答 2

0

我设法制作了一个漂亮而简单的进度功能,只用了几行代码:

def progress_func(stream, chunk, bytes_remaining):
    curr = stream.filesize - bytes_remaining
    done = int(50 * curr / stream.filesize)
    sys.stdout.write("\r[{}{}] ".format('=' * done, ' ' * (50-done)) )
    sys.stdout.flush()

然后在创建YouTube对象的时候使用这个函数

YouTube(url, on_progress_callback=progress_func)

这样,我们会得到一个类似于下图的进度条,填满

[===================================               ]
于 2021-05-19T10:12:38.943 回答
0

您应该调用register_on_progress_callback(func)您的 YouTube 对象,其中func是一个函数,它采用、 和stream作为chunk参数。对于您的代码,它将是:file_handlebytes_remaining

def on_progress(stream, chunk, file_handle, bytes_remaining):
    total_size = stream.filesize
    bytes_downloaded = total_size - bytes_remaining 
    percentage_of_completion = bytes_downloaded / total_size * 100

yt.register_on_progress_callback(on_progress)

然后你必须使用percentage_of_completion变量来绘制进度条,但这有点超出了这个问题的范围。on_progress每次下载块时都会调用记住函数。我希望现在你能做出你想要的。

于 2019-04-17T21:17:12.660 回答