0

我编写了一个小型 python 程序来从 youtube 下载视频。该函数将 URL 作为输入,然后下载它。

代码:

def download(i):
    global path
    global c
    global threads
    try:
        fh1 = open(path + "done.txt","a") 
        fh = open(path +"err.txt", "a")
        video = pafy.new(i)
        name = str(c) + '. ' + video.title
        c += 1
        try:
            for p in ('|', '?', '\\', '/', ':', '*', '<', '>', '\"'):
                 name = name.replace(p, '_')

            best = video.getbest(preftype="mp4")
            print("Downloading "+name+"...")
            best.download(quiet=False, filepath= path + name + '.' + best.extension)
            print("Done Downloading "+name)
            fh1.write("Done : " +name+ '\n')
            fh1.close()

best.download(quiet=False, filepath= path + name + '.' + best.extension)行显示剩余的下载百分比速度时间和其他一些东西,但我找不到正确的方法来获取那里显示的数据。我想将数据存储在某个变量中,以便可以在其他地方显示数据或将其写入某个文件中。

4

1 回答 1

1

pafy 文档指定该函数download()可以采用回调参数,为您提供有关下载状态的定期更新。这听起来正是您正在搜索的内容。

如果提供了一个回调函数,它将为每个下载的块重复调用。它必须是一个接受以下五个参数的函数:

  • 流中的总字节数,int
  • 下载的总字节数,int
  • 下载比率(0-1),浮动
  • 下载速率 (kbps),浮动
  • 以秒为单位的 ETA,浮动

该文档甚至包含一个回调示例:

import pafy

# callback function, this callback simply prints the bytes received,
# ratio downloaded and eta.
def mycb(total, recvd, ratio, rate, eta):
    print(recvd, ratio, eta)

p = pafy.new("cyMHZVT91Dw")
ba = p.getbestaudio()
filename = ba.download(quiet=True, callback=mycb)

如果您想向回调传递额外的信息,您可以使用可调用的类对象:

import pafy

# Callback class
class MyCallback:
    def __init__(self, callbackId):
        self.callbackId = callbackId

    def __call__(self, total, recvd, ratio, rate, eta):
        print("Downloader #{:d}: {:>7.3f} MB {:>6.1f} % {:>10.1f} kBps    ETA: {:>5.1f} s".format(self.callbackId, recvd/(1024*1024), ratio*100, rate, eta))

p = pafy.new("cyMHZVT91Dw")
ba = p.getbestaudio()
filename = ba.download(quiet=True, callback=MyCallback(42))
于 2019-07-21T15:34:32.923 回答