如何从python中的youtube-dl获取信息?

时间:2014-05-18 23:41:22

标签: python youtube-dl

我正在API中为youtube-dl制作tkinter& python并且需要知道:

  • 如何实时获取youtube-dl的信息字典(速度,完成百分比,文件大小等)??

我试过了:

import subprocess
def execute(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)

    # Poll process for new output until finished
    while True:
        nextline = process.stdout.readline()
        if nextline == '' and process.poll() != None:
            break
        sys.stdout.write(nextline.decode('utf-8'))
        sys.stdout.flush()

    output = process.communicate()[0]
    exitCode = process.returncode

    if (exitCode == 0):
        return output
    else:
        raise ProcessException(command, exitCode, output)

execute("youtube-dl.exe www.youtube.com/watch?v=9bZkp7q19f0 -t")

来自this Question

但它必须等到完成下载才能给我信息;也许有一种从youtube-dl源代码获取信息的方法。

3 个答案:

答案 0 :(得分:18)

尝试这样的事情:

from youtube_dl import YoutubeDL
video = "http://www.youtube.com/watch?v=BaW_jenozKc"
with YoutubeDL(youtube_dl_opts) as ydl:
      info_dict = ydl.extract_info(video, download=False)
      video_url = info_dict.get("url", None)
      video_id = info_dict.get("id", None)
      video_title = info_dict.get('title', None)

你可能现在已经想到了这一点,但它可能对其他人有帮助。

答案 1 :(得分:5)

  1. 最好避免使用subprocess;你可以像往常一样直接使用模块python模块;参考:use youtube-dl module 这需要下载源代码,而不仅仅是将应用程序安装到系统。
  2. 继续使用subprocess;你应该添加以下参数:
  3.   

    详细程度/模拟选项:

    -q, --quiet              activates quiet mode
    
    -s, --simulate           do not download the video and do not write anything to disk
    
    --skip-download          do not download the video
    
    -g, --get-url            simulate, quiet but print URL
    
    -e, --get-title          simulate, quiet but print title
    
    --get-thumbnail          simulate, quiet but print thumbnail URL
    
    --get-description        simulate, quiet but print video description
    
    --get-filename           simulate, quiet but print output filename
    
    --get-format             simulate, quiet but print output format
    
    1. 代码;我在返回行中想到错误,你选择返回sys.output的最后一行,通过沟通返回;我建议这个简单的未经测试的例子:
    2.   

      def execute(命令):

          process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
      
          #Poll process for new output until it is finished
      
          while True:
      
              nextline = process.stdout.readline()
      
              if nextline == '' and process.poll() != None:
      
                   break
      
              yield nextline 
      

      我用过它:

      for i in execute("sudo apt-get update"):
          print i 
      

      在所有情况下,请不要预先更新您的版本。

答案 2 :(得分:3)

我知道这是一个老问题,但是youtube-dl带有钩子,您可以在其中轻松地实时提取此信息。

文档:

progress_hooks:    A list of functions that get called on download
                       progress, with a dictionary with the entries
                       * status: One of "downloading", "error", or "finished".
                                 Check this first and ignore unknown values.
                       If status is one of "downloading", or "finished", the
                       following properties may also be present:
                       * filename: The final filename (always present)
                       * tmpfilename: The filename we're currently writing to
                       * downloaded_bytes: Bytes on disk
                       * total_bytes: Size of the whole file, None if unknown
                       * total_bytes_estimate: Guess of the eventual file size,
                                               None if unavailable.
                       * elapsed: The number of seconds since download started.
                       * eta: The estimated time in seconds, None if unknown
                       * speed: The download speed in bytes/second, None if
                                unknown
                       * fragment_index: The counter of the currently
                                         downloaded video fragment.
                       * fragment_count: The number of fragments (= individual
                                         files that will be merged)
                       Progress hooks are guaranteed to be called at least once
                       (with status "finished") if the download is successful.

如何使用它:

def download_function(url):
    ydl_options = {
        ...
        "progress_hooks": [callable_hook],
        ...
    }
    with youtube_dl.YoutubeDL(ydl_options) as ydl:
        ydl.download([url])

def callable_hook(response):
    if response["status"] == "downloading":
        speed = response["speed"]
        downloaded_percent = (response["downloaded_bytes"]*100)/response["total_bytes"]
        ...