如何在 youtube-dl 中提高用户 select 质量?

How do I make users select quality in youtube-dl?

我正在构建一个简单的 GUI 应用程序(在 Tkinter 中),它使用 youtube-dl 下载 YouTube 视频。我知道如何让它下载最高分辨率,但我想包括一个下拉列表,允许用户选择他们想要下载视频的分辨率。我知道如何在 GUI 中制作实际列表,只是不知道如何让 youtube-dl 使用该分辨率(我只知道我可以使用 'format': 'best')。

这里用这个:

import youtube_dl as yt
from tkinter import *
from tkinter import Tk, font, ttk


def display_options(*event):

    hide()
    
    ydl_opts = {}
    resolutions = []

    url = link.get()
    
    valid = valid_link(url)  # check the validity of link
 
    if valid:
        with yt.YoutubeDL(ydl_opts) as ydl:
            meta = ydl.extract_info(url, download=False) 
            formats = meta.get('formats', meta) 
            vid_title = meta.get('title', meta) # gets the title

        title.config(text=f'Title: {vid_title}')
        title.place(x=220, y=70)

        for f in formats:
            resolutions.append(f['format']) #filter to only formats

        options['values'] = resolutions # sets combobox values to available resolutions

    else:
        error.config(text='Invalid link', fg='red')
        error.place(x=150, y=210)

def valid_link(link): # function to check validity of the link
   
    extractors = yt.extractor.gen_extractors()
    for e in extractors:
        if e.suitable(link) and e.IE_NAME != 'generic':
            return True
    return False


def download():
    hide()
    res = option_lst.get()

    if res !=  'resolution':
        res = int(res[:res.find('-')].strip())
        
        ydl_opts = {'format': f'{res}', 
                    'outtmpl': r'C:\yourPath\%(title)s.%(ext)s'}  # specify your download path here

        url = link.get()
        
        with yt.YoutubeDL(ydl_opts) as ydl: 
            ydl.download([url])

    else:
        error.config(text='Invalid resolution', fg='red')
        error.place(x=150, y=210)
    
def hide():
    title.place_forget()
    error.place_forget()


root = Tk()
root.geometry('700x250')
root.title('YouTube Downloader')

link = StringVar()
option_lst = StringVar()

link.trace('w', display_options)
option_lst.set('resolution')

link_here = Label(root, text="Paste Here", font=(30))
link_here.place(x=220,y=40)

title = Label(root, text='')
title.place(x=220, y=230)

error = Label(root, text='')
error.place(x=220, y=210)

options = ttk.Combobox(root, textvariable=option_lst, state="readonly") 
options.place(x=300, y=210)

pasted = Entry(root,width=60,textvariable=link)
pasted.place(x=80,y=120)

Button(root,text="Download Video", width=20, bg="black", fg="gray", command=download).place(x=250,y=170)

root.mainloop()

如果需要,您可以进一步改进。