14

我正在&API中为 youtube-dl制作一个,并且需要知道:tkinterpython

  • 如何实时从 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")

这个问题

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

4

3 回答 3

34

尝试这样的事情:

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)

您现在可能已经弄清楚了,但它可能对其他人有所帮助。

于 2015-07-02T12:19:32.073 回答
8
  1. 最好避免使用subprocess; 您可以像往常一样直接使用该模块 python 模块;参考这个:使用 youtube-dl 模块 这需要下载源代码,而不仅仅是将应用程序安装到系统。
  2. 继续使用subprocess;您应该添加以下参数:

详细程度/模拟选项:

-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,由communicate返回;我建议这个简单的未经测试的例子:

def 执行(命令):

    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 

在任何情况下,都不要忘记更新您的版本。

于 2014-06-16T09:54:47.527 回答
4

我知道这是一个老问题,但是 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"]
        ...
于 2020-07-20T18:54:57.263 回答