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

时间:2015-10-10 06:17:08

标签: python python-3.x youtube-dl

我基本上试图从看起来像是在Youtube-DL中挂钩的状态对象中获取信息,然后我试图将其保存到数据库中。我有一首歌'具有诸如" filename"等属性的对象;我在下载完成后尝试保存,甚至可能会不断更新数据库。

我有四种方法可以做到这一点,但我还没能让他们工作

  • 将my_hook函数发送给db和song对象,然后在status == finished后将其全部保存在那里。问题是我无法将其他参数传递给钩子,除非我遗漏了某些内容
  • 获取my_hook函数返回d然后保存,问题是我不认为我可以访问它会返回(youtube-dl source)
  • 获取ydl.download([song.url])以返回我可以处理的状态对象,但我认为它不会这样做
  • 我不想这样做,但是我可以输出一个.json文件并从那里获取它,或者只是简单地猜测我最初指示它的文件名:(< / LI>

代码如下所示:

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])

1 个答案:

答案 0 :(得分:1)

我在这里得到了答案:https://github.com/rg3/youtube-dl/issues/7120

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