如何使用pytube取消和暂停下载?

问题描述

我正在使用python,tkinter和pytube开发GUI YouTube Video Downloader程序,现在我想知道如何取消下载并暂停它,然后使用pytube取消暂停。

解决方法

下面是一个示例:

  • 使用pytube.request.stream()获得一个可迭代
  • 使用next()逐块获取视频
import tkinter as tk
import threading
from pytube import YouTube,request

is_paused = is_cancelled = False

def download_video(url):
    global is_paused,is_cancelled
    download_button['state'] ='disabled'
    pause_button['state'] ='normal'
    cancel_button['state'] ='normal'
    try:
        progress['text'] = 'Connecting ...'
        yt = YouTube(url)
        stream = yt.streams.first()
        filesize = stream.filesize  # get the video size
        with open('sample.mp4','wb') as f:
            is_paused = is_cancelled = False
            stream = request.stream(stream.url) # get an iterable stream
            downloaded = 0
            while True:
                if is_cancelled:
                    progress['text'] = 'Download cancelled'
                    break
                if is_paused:
                    continue
                chunk = next(stream,None) # get next chunk of video
                if chunk:
                    f.write(chunk)
                    downloaded += len(chunk)
                    progress['text'] = f'Downloaded {downloaded} / {filesize}'
                else:
                    # no more data
                    progress['text'] = 'Download completed'
                    break
        print('done')
    except Exception as e:
        print(e)
    download_button['state'] ='normal'
    pause_button['state'] ='disabled'
    cancel_button['state'] ='disabled'

def start_download():
    threading.Thread(target=download_video,args=(url_entry.get(),),daemon=True).start()

def toggle_download():
    global is_paused
    is_paused = not is_paused
    pause_button['text'] = 'Resume' if is_paused else 'Pause'

def cancel_download():
    global is_cancelled
    is_cancelled = True

root = tk.Tk()
root.title("YouTube Downloader")

tk.Label(root,text='URL:').grid(row=0,column=0,sticky='e')
url_entry = tk.Entry(root,width=60)
url_entry.grid(row=0,column=1,columnspan=2,padx=10,pady=10)

download_button = tk.Button(root,text='Download',width=20,command=start_download)
download_button.grid(row=1,column=2,sticky='e',pady=(0,10))

pause_button = tk.Button(root,text='Pause',width=10,command=toggle_download,state='disabled')
pause_button.grid(row=2,column=0)

progress = tk.Label(root)
progress.grid(row=2,sticky='w')

cancel_button = tk.Button(root,text='Cancel',command=cancel_download,state='disabled')
cancel_button.grid(row=2,sticky='e')

root.mainloop()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...