2015-10-10 72 views
2

我试图基本上得到什么似乎是一个状态对象的Youtube-DL中挂钩的信息,然后我试图保存它到数据库。我有一个包含“文件名”等属性的“歌曲”对​​象,我试图在下载完成后保存,甚至可能会不断更新数据库并取得进展。YoutubeDL - 如何获得下载完成后的状态对象

有四种方法我能想到的要做到这一点,但我没有能够让他们的工作

  • 发送my_hook功能的数据库和歌曲对象,然后将它保存所有在那里,一旦状态==完成。问题是我无法将其他参数传递给钩子,除非我失去了一些东西
  • 获取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]) 

回答