Python 获取youtube_dl进度挂钩中下载视频的URL

Python 获取youtube_dl进度挂钩中下载视频的URL,python,youtube-dl,Python,Youtube Dl,如何获取使用youtube_dl下载的视频的URL 我可以使用进度挂钩获取下载的其他特性,如文件路径: def progress_hook(response): if response["status"] == "finished": file_name = response["filename"] ydl_opts = { 'progress_hooks': [progress_hook] } 我还

如何获取使用youtube_dl下载的视频的URL

我可以使用进度挂钩获取下载的其他特性,如文件路径:

def progress_hook(response):
    if response["status"] == "finished":
        file_name = response["filename"]

ydl_opts = {
    'progress_hooks': [progress_hook]
}

我还想获取文件来自的URL。我不知道该怎么做。类似于
url=response[“url”]
的东西会很好,但是有了进度挂钩。

因为似乎没有办法做到这一点,我重新构造了我的程序,一次只下载一个,所以对我来说下载的内容非常明确

要使用它,您需要创建一个实例,将要下载的URL列表传递给构造函数

然后,当您准备好时,可以对对象调用
start\u download\u process
。它将等待当前曲目完成并且
进度挂钩
完全完成后再下载另一个曲目

class YoutubeManager:
    def __init__(self, url_list):
        self.base_url = "https://www.youtube.com"
        self.current_download_url = ""
        self.url_list = url_list

        self.currently_downloading = False
        self.current_download_count = 0

        ydl_opts = {
            'format': 'bestaudio/best',
            'noplaylist': True,
            'continue_dl': True,
            'progress_hooks': [self.progress_hook],
            'postprocessors': [{
                'key': 'FFmpegExtractAudio',
                'preferredcodec': 'mp3',
                'preferredquality': '192', }]
        }

        self.youtube_dl_manager = youtube_dl.YoutubeDL(ydl_opts)
        

    def start_download_process(self):
        self.currently_downloading = True
        self.current_download_count += 1

        with self.youtube_dl_manager as youtube_dl_manager:
            self.current_download_url = self.url_list.pop()
            youtube_dl_manager.download([self.base_url + self.current_download_url])

    def continue_download_process(self):
        self.current_download_count += 1
        with self.youtube_dl_manager as youtube_dl_manager:
            self.current_download_url = self.url_list.pop()
            youtube_dl_manager.download([self.base_url + self.current_download_url])

    def progress_hook(self, response):
        if response["status"] == "finished":
            file_name = response["filename"]
            print("Downloaded " + file_name)

            # You can do something with self.current_download_url and file_name here

            if len(self.url_list) != 0:
                self.continue_download_process()
            else:
                self.currently_downloading = False

如果您只使用一个YoutubeDL对象,为什么不将URL设为模块级变量?好的,请您解释一下我如何做到这一点?@VukVojta我可能理解您现在所说的。您建议我保存传递给我的
YoutubeDL
对象的URL,以便稍后下载并引用。不幸的是,除非我重组我的程序,否则没有一个超简单的方法可以做到这一点。我希望找到一种方法来获取刚刚下载的任何文件的URL。但是,如果我必须对它进行重组,一次下载一个,我想我可以做到。从询问如何制作一个可变模块级到在5天内编写一个精简的python类,这本身就是一项成就,也是一个很好的例子,说明了我正在进行的工作。