当youtubeDL无法下载视频时,继续下载后续视频

时间:2016-02-04 10:13:22

标签: python-2.7 exception-handling youtube-dl

我正在尝试开发一个python脚本来下载使用youtube-dl模块从csv文件输入的一堆youtube视频。单个视频的下载失败时脚本停止。我需要脚本继续下载下一个视频而忽略无法下载的视频。有人可以帮我解决如何在python中处理这个问题吗?

2 个答案:

答案 0 :(得分:4)

如果您使用的是youtube-dl命令,则可以使用--ignore-errors flag

如果您使用python中的youtube_dl模块,则必须使用ignoreerrors parameter

from __future__ import unicode_literals
import youtube_dl

ydl_opts = {'ignoreerrors': True}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['<URL>'])

答案 1 :(得分:0)

我意识到这是一个老问题,但问题出现了,我找到了一个简单的解决方案。

我认为这里的问题是youtube_dl正在捕获任何出现的错误,然后通过它自己的内部消息输出例程报告它们,因此异常在它到达调用代码之前被“消耗”。这可能适用于命令行实用程序,但在本机python代码中使用它时会产生障碍。幸运的是,youtube_dl的开发人员为我们提供了一种拦截错误消息并处理它们的方法,而无需使用youtube_dl内部。不幸的是,他们对这两个解释和示例都非常清楚,但是如果你查看自述文件的“开发者说明”,就会有一个自定义记录器类的例子。

稍加修改后,我们可以使用此类存储错误消息(或警告,或其他),然后检查它们,而不是使用try / except块:

class MyLogger(object):

def __init__(self):
    self._message_queue = []

def debug(self, msg):
    print('[DEBUG]' + msg)

def warning(self, msg):
    pass

def error(self, msg):
    self._message_queue.append(msg)
    print(msg)

def get_message(self):
    return None if not len(self._message_queue) else \
           self._message_queue.pop()

导入记录器类,实例化它,并将其作为参数传递给youtube_dl的选项字符串。

import mylogger
...
loggr = mylogger.MyLogger()
...
ydl_opts = { 'logger': loggr }

现在,当根据出现错误采取行动时,您可以检查记录器对象中的消息队列,看看是否有事情要做:

possible_error = loggr.get_message()
if possible_error is None:
    #do normal code
else:
    #check the content of the error string and do something with it.

希望这有助于某人。