Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python YoutubeDL-下载完成后如何获取状态对象_Python_Python 3.x_Youtube Dl - Fatal编程技术网

Python YoutubeDL-下载完成后如何获取状态对象

Python YoutubeDL-下载完成后如何获取状态对象,python,python-3.x,youtube-dl,Python,Python 3.x,Youtube Dl,我试图从Youtube DL中的状态对象中获取信息,然后将其保存到数据库中。我有一个“song”对象,它的属性是“filename”,下载完成后我会保存它,甚至可能会不断更新数据库 我可以想出四种方法来做到这一点,但我一直无法让它们发挥作用 向my_hook函数发送一个db和song对象,然后在status==finished后将其全部保存在那里。问题是我无法向钩子传递额外的参数,除非我遗漏了什么 让my_hook函数返回d,然后保存它,问题是我认为我无法访问它将返回的(youtube dl源

我试图从Youtube DL中的状态对象中获取信息,然后将其保存到数据库中。我有一个“song”对象,它的属性是“filename”,下载完成后我会保存它,甚至可能会不断更新数据库

我可以想出四种方法来做到这一点,但我一直无法让它们发挥作用

  • 向my_hook函数发送一个db和song对象,然后在status==finished后将其全部保存在那里。问题是我无法向钩子传递额外的参数,除非我遗漏了什么
  • 让my_hook函数返回d,然后保存它,问题是我认为我无法访问它将返回的(youtube dl源代码)
  • 获取ydl.download([song.url])以返回我可以处理的状态对象,但我认为它不会这样做
  • 我不想这样做,但我可以输出一个.json文件并从那里获取它,或者根据我最初的口述猜测文件名:(
代码如下所示:

def my_hook(d):
    if d['status'] == 'finished':
        file_tuple = os.path.split(os.path.abspath(d['filename']))
        print("Done downloading {}".format(file_tuple[1]))
    if d['status'] == 'downloading':
        print(d['filename'], d['_percent_str'], d['_eta_str'])

class MyLogger(object):
    def debug(self, msg):
        pass

    def warning(self, msg):
        pass

    def error(self, msg):
        print(msg)


class Downloader(object):
    def get_opts(self):
        ydl_opts = {
            'format': 'bestaudio/best',
            'outtmpl': os.path.join(app.config['VIDEOS_FOLDER'], '%(id)s.%(ext)s'),
            'logger': MyLogger(),
            'progress_hooks': [my_hook],
        }
        return ydl_opts

    def download(self, song):
        ydl = youtube_dl.YoutubeDL(self.get_opts())
        ydl.download([song.url])
我在这里得到了答案:

基本上,我的一对多模型的歌曲文件到歌曲请求是错误的——重写这种关系允许我使用钩子到数据库更新