From 577dae1dfa96434c483a96c945b4bd955859fad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9raud=20Le=20Falher?= Date: Sat, 10 Aug 2013 02:12:06 +0200 Subject: [PATCH 1/2] fix #1213 by returning an empty dictionary if there is no subtitle. --- youtube_dl/extractor/youtube.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index 3a8edbdc2..79d4498c4 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -287,6 +287,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor): }, }, ] + _subtitle_error_message = u'' @classmethod @@ -375,12 +376,12 @@ class YoutubeIE(YoutubeBaseInfoExtractor): try: sub_list = compat_urllib_request.urlopen(request).read().decode('utf-8') except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: - return (u'unable to download video subtitles: %s' % compat_str(err), None) + self._subtitle_error_message = u'unable to download video subtitles: %s' % compat_str(err) + return {} sub_lang_list = re.findall(r'name="([^"]*)"[^>]+lang_code="([\w\-]+)"', sub_list) - sub_lang_list = dict((l[1], l[0]) for l in sub_lang_list) - if not sub_lang_list: - return (u'video doesn\'t have subtitles', None) - return sub_lang_list + if len(sub_lang_list) == 0: + self._subtitle_error_message = u'video doesn\'t have subtitles' + return dict((l[1], l[0]) for l in sub_lang_list) def _list_available_subtitles(self, video_id): sub_lang_list = self._get_available_subtitles(video_id) @@ -442,8 +443,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor): """ sub_lang_list = self._get_available_subtitles(video_id) sub_format = self._downloader.params.get('subtitlesformat') - if isinstance(sub_lang_list,tuple): #There was some error, it didn't get the available subtitles - return [(sub_lang_list[0], None, None)] + if not sub_lang_list: #There was some error, it didn't get the available subtitles + return [(self._subtitle_error_message, None, None)] if self._downloader.params.get('subtitleslang', False): sub_lang = self._downloader.params.get('subtitleslang') elif 'en' in sub_lang_list: @@ -459,8 +460,9 @@ class YoutubeIE(YoutubeBaseInfoExtractor): def _extract_all_subtitles(self, video_id): sub_lang_list = self._get_available_subtitles(video_id) sub_format = self._downloader.params.get('subtitlesformat') - if isinstance(sub_lang_list,tuple): #There was some error, it didn't get the available subtitles - return [(sub_lang_list[0], None, None)] + if not sub_lang_list: #There was some error, it didn't get the available subtitles + print(self._subtitle_error_message) + return [(self._subtitle_error_message, None, None)] subtitles = [] for sub_lang in sub_lang_list: subtitle = self._request_subtitle(sub_lang, sub_lang_list[sub_lang].encode('utf-8'), video_id, sub_format) From 9c4aa5354a7778bcd029571369bc3f5288c9b4f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9raud=20Le=20Falher?= Date: Sat, 10 Aug 2013 10:17:45 +0200 Subject: [PATCH 2/2] replace member variable by a special dictionary key. --- youtube_dl/extractor/youtube.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index 79d4498c4..fa47321fe 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -287,7 +287,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor): }, }, ] - _subtitle_error_message = u'' @classmethod @@ -376,11 +375,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor): try: sub_list = compat_urllib_request.urlopen(request).read().decode('utf-8') except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: - self._subtitle_error_message = u'unable to download video subtitles: %s' % compat_str(err) - return {} + return {'error': u'unable to download video subtitles: %s' % compat_str(err)} sub_lang_list = re.findall(r'name="([^"]*)"[^>]+lang_code="([\w\-]+)"', sub_list) if len(sub_lang_list) == 0: - self._subtitle_error_message = u'video doesn\'t have subtitles' + return {'error': u'video doesn\'t have subtitles'} return dict((l[1], l[0]) for l in sub_lang_list) def _list_available_subtitles(self, video_id): @@ -443,8 +441,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor): """ sub_lang_list = self._get_available_subtitles(video_id) sub_format = self._downloader.params.get('subtitlesformat') - if not sub_lang_list: #There was some error, it didn't get the available subtitles - return [(self._subtitle_error_message, None, None)] + if 'error' in sub_lang_list: #There was some error, it didn't get the available subtitles + return [(sub_lang_list['error'], None, None)] if self._downloader.params.get('subtitleslang', False): sub_lang = self._downloader.params.get('subtitleslang') elif 'en' in sub_lang_list: @@ -460,9 +458,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor): def _extract_all_subtitles(self, video_id): sub_lang_list = self._get_available_subtitles(video_id) sub_format = self._downloader.params.get('subtitlesformat') - if not sub_lang_list: #There was some error, it didn't get the available subtitles - print(self._subtitle_error_message) - return [(self._subtitle_error_message, None, None)] + if 'error' in sub_lang_list: #There was some error, it didn't get the available subtitles + return [(sub_lang_list['error'], None, None)] subtitles = [] for sub_lang in sub_lang_list: subtitle = self._request_subtitle(sub_lang, sub_lang_list[sub_lang].encode('utf-8'), video_id, sub_format)