Introduced Trouble(Exception) for more elegant non-fatal errors handling

This commit is contained in:
Filippo Valsorda 2012-05-09 09:41:34 +00:00 committed by Filippo Valsorda
parent 3fe294e4ef
commit 0b8c922da9
2 changed files with 30 additions and 24 deletions

View file

@ -359,33 +359,32 @@ def _real_extract(self, url):
# closed captions # closed captions
video_subtitles = None video_subtitles = None
if self._downloader.params.get('writesubtitles', False): if self._downloader.params.get('writesubtitles', False):
self.report_video_subtitles_download(video_id)
request = urllib2.Request('http://video.google.com/timedtext?hl=en&type=list&v=%s' % video_id)
try: try:
srt_list = urllib2.urlopen(request).read() self.report_video_subtitles_download(video_id)
except (urllib2.URLError, httplib.HTTPException, socket.error), err: request = urllib2.Request('http://video.google.com/timedtext?hl=en&type=list&v=%s' % video_id)
self._downloader.trouble(u'WARNING: unable to download video subtitles: %s' % str(err)) try:
else: srt_list = urllib2.urlopen(request).read()
except (urllib2.URLError, httplib.HTTPException, socket.error), err:
raise Trouble(u'WARNING: unable to download video subtitles: %s' % str(err))
srt_lang_list = re.findall(r'lang_code="([\w\-]+)"', srt_list) srt_lang_list = re.findall(r'lang_code="([\w\-]+)"', srt_list)
if srt_lang_list: if not srt_lang_list:
if self._downloader.params.get('subtitleslang', False): raise Trouble(u'WARNING: video has no closed captions')
srt_lang = self._downloader.params.get('subtitleslang') if self._downloader.params.get('subtitleslang', False):
elif 'en' in srt_lang_list: srt_lang = self._downloader.params.get('subtitleslang')
srt_lang = 'en' elif 'en' in srt_lang_list:
else: srt_lang = 'en'
srt_lang = srt_lang_list[0]
if not srt_lang in srt_lang_list:
self._downloader.trouble(u'WARNING: no closed captions found in the specified language')
else:
request = urllib2.Request('http://video.google.com/timedtext?hl=en&lang=%s&v=%s' % (srt_lang, video_id))
try:
srt_xml = urllib2.urlopen(request).read()
except (urllib2.URLError, httplib.HTTPException, socket.error), err:
self._downloader.trouble(u'WARNING: unable to download video subtitles: %s' % str(err))
else:
video_subtitles = self._closed_captions_xml_to_srt(srt_xml.decode('utf-8'))
else: else:
self._downloader.trouble(u'WARNING: video has no closed captions') srt_lang = srt_lang_list[0]
if not srt_lang in srt_lang_list:
raise Trouble(u'WARNING: no closed captions found in the specified language')
request = urllib2.Request('http://video.google.com/timedtext?hl=en&lang=%s&v=%s' % (srt_lang, video_id))
try:
srt_xml = urllib2.urlopen(request).read()
except (urllib2.URLError, httplib.HTTPException, socket.error), err:
raise Trouble(u'WARNING: unable to download video subtitles: %s' % str(err))
video_subtitles = self._closed_captions_xml_to_srt(srt_xml.decode('utf-8'))
except Trouble as trouble:
self._downloader.trouble(trouble[0])
# token # token
video_token = urllib.unquote_plus(video_info['token'][0]) video_token = urllib.unquote_plus(video_info['token'][0])

View file

@ -290,6 +290,13 @@ def __init__(self, downloaded, expected):
self.expected = expected self.expected = expected
class Trouble(Exception):
"""Trouble helper exception
This is an exception to be handled with
FileDownloader.trouble
"""
class YoutubeDLHandler(urllib2.HTTPHandler): class YoutubeDLHandler(urllib2.HTTPHandler):
"""Handler for HTTP requests and responses. """Handler for HTTP requests and responses.