projects
/
youtube-dl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use a dictionary for storing the subtitles
[youtube-dl]
/
youtube_dl
/
extractor
/
youtube.py
diff --git
a/youtube_dl/extractor/youtube.py
b/youtube_dl/extractor/youtube.py
index 2aac5dd2ec3efaa526508d81f8c87cf49c9d999d..78500b0f72586a1dfd5e581f014dc5a5c3ad6b30 100644
(file)
--- a/
youtube_dl/extractor/youtube.py
+++ b/
youtube_dl/extractor/youtube.py
@@
-190,7
+190,7
@@
class YoutubeIE(InfoExtractor):
elif len(s) == 86:
return s[2:63] + s[82] + s[64:82] + s[63]
elif len(s) == 85:
elif len(s) == 86:
return s[2:63] + s[82] + s[64:82] + s[63]
elif len(s) == 85:
- return s[
76] + s[82:76:-1] + s[83] + s[75:60:-1] + s[0] + s[59:50:-1] + s[1] + s[49:2:-
1]
+ return s[
2:8] + s[0] + s[9:21] + s[65] + s[22:65] + s[84] + s[66:82] + s[2
1]
elif len(s) == 84:
return s[83:36:-1] + s[2] + s[35:26:-1] + s[3] + s[25:3:-1] + s[26]
elif len(s) == 83:
elif len(s) == 84:
return s[83:36:-1] + s[2] + s[35:26:-1] + s[3] + s[25:3:-1] + s[26]
elif len(s) == 83:
@@
-209,11
+209,13
@@
class YoutubeIE(InfoExtractor):
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:
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._downloader.report_warning(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:
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)
+ self._downloader.report_warning(u'video doesn\'t have subtitles')
+ return {}
return sub_lang_list
def _list_available_subtitles(self, video_id):
return sub_lang_list
def _list_available_subtitles(self, video_id):
@@
-222,8
+224,7
@@
class YoutubeIE(InfoExtractor):
def _request_subtitle(self, sub_lang, sub_name, video_id, format):
"""
def _request_subtitle(self, sub_lang, sub_name, video_id, format):
"""
- Return tuple:
- (error_message, sub_lang, sub)
+ Return the subtitle as a string or None if they are not found
"""
self.report_video_subtitles_request(video_id, sub_lang, format)
params = compat_urllib_parse.urlencode({
"""
self.report_video_subtitles_request(video_id, sub_lang, format)
params = compat_urllib_parse.urlencode({
@@
-236,10
+237,12
@@
class YoutubeIE(InfoExtractor):
try:
sub = compat_urllib_request.urlopen(url).read().decode('utf-8')
except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err:
try:
sub = compat_urllib_request.urlopen(url).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, None)
+ self._downloader.report_warning(u'unable to download video subtitles for %s: %s' % (sub_lang, compat_str(err)))
+ return
if not sub:
if not sub:
- return (u'Did not fetch video subtitles', None, None)
- return (None, sub_lang, sub)
+ self._downloader.report_warning(u'Did not fetch video subtitles')
+ return
+ return sub
def _request_automatic_caption(self, video_id, webpage):
"""We need the webpage for getting the captions url, pass it as an
def _request_automatic_caption(self, video_id, webpage):
"""We need the webpage for getting the captions url, pass it as an
@@
-250,7
+253,8
@@
class YoutubeIE(InfoExtractor):
mobj = re.search(r';ytplayer.config = ({.*?});', webpage)
err_msg = u'Couldn\'t find automatic captions for "%s"' % sub_lang
if mobj is None:
mobj = re.search(r';ytplayer.config = ({.*?});', webpage)
err_msg = u'Couldn\'t find automatic captions for "%s"' % sub_lang
if mobj is None:
- return [(err_msg, None, None)]
+ self._downloader.report_warning(err_msg)
+ return {}
player_config = json.loads(mobj.group(1))
try:
args = player_config[u'args']
player_config = json.loads(mobj.group(1))
try:
args = player_config[u'args']
@@
-265,19
+269,20
@@
class YoutubeIE(InfoExtractor):
})
subtitles_url = caption_url + '&' + params
sub = self._download_webpage(subtitles_url, video_id, u'Downloading automatic captions')
})
subtitles_url = caption_url + '&' + params
sub = self._download_webpage(subtitles_url, video_id, u'Downloading automatic captions')
- return
[(None, sub_lang, sub)]
+ return
{sub_lang: sub}
except KeyError:
except KeyError:
- return [(err_msg, None, None)]
+ self._downloader.report_warning(err_msg)
+ return {}
def _extract_subtitle(self, video_id):
"""
def _extract_subtitle(self, video_id):
"""
- Return a
list with a tuple:
- [(error_message, sub_lang, sub)]
+ Return a
dictionary: {language: subtitles} or {} if the subtitles
+ couldn't be found
"""
sub_lang_list = self._get_available_subtitles(video_id)
sub_format = self._downloader.params.get('subtitlesformat')
"""
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
{}
if self._downloader.params.get('subtitleslang', False):
sub_lang = self._downloader.params.get('subtitleslang')
elif 'en' in sub_lang_list:
if self._downloader.params.get('subtitleslang', False):
sub_lang = self._downloader.params.get('subtitleslang')
elif 'en' in sub_lang_list:
@@
-285,20
+290,28
@@
class YoutubeIE(InfoExtractor):
else:
sub_lang = list(sub_lang_list.keys())[0]
if not sub_lang in sub_lang_list:
else:
sub_lang = list(sub_lang_list.keys())[0]
if not sub_lang in sub_lang_list:
- return [(u'no closed captions found in the specified language "%s"' % sub_lang, None, None)]
+ self._downloader.report_warning(u'no closed captions found in the specified language "%s"' % sub_lang)
+ return {}
subtitle = self._request_subtitle(sub_lang, sub_lang_list[sub_lang].encode('utf-8'), video_id, sub_format)
subtitle = self._request_subtitle(sub_lang, sub_lang_list[sub_lang].encode('utf-8'), video_id, sub_format)
- return [subtitle]
+ if subtitle:
+ self.to_screen('sub %s' % subtitle[:20])
+ return {sub_lang: subtitle}
+ else:
+ return {}
def _extract_all_subtitles(self, video_id):
def _extract_all_subtitles(self, video_id):
+ """
+ Return a dicitonary: {language: subtitles} or {} if the subtitles
+ couldn't be found
+ """
sub_lang_list = self._get_available_subtitles(video_id)
sub_format = self._downloader.params.get('subtitlesformat')
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)]
- subtitles = []
+ 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)
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)
- subtitles.append(subtitle)
+ if subtitle:
+ subtitles[sub_lang] = subtitle
return subtitles
def _print_formats(self, formats):
return subtitles
def _print_formats(self, formats):
@@
-523,23
+536,11
@@
class YoutubeIE(InfoExtractor):
if self._downloader.params.get('writesubtitles', False):
video_subtitles = self._extract_subtitle(video_id)
if self._downloader.params.get('writesubtitles', False):
video_subtitles = self._extract_subtitle(video_id)
- if video_subtitles:
- (sub_error, sub_lang, sub) = video_subtitles[0]
- if sub_error:
- self._downloader.report_warning(sub_error)
-
- if self._downloader.params.get('writeautomaticsub', False):
+ elif self._downloader.params.get('writeautomaticsub', False):
video_subtitles = self._request_automatic_caption(video_id, video_webpage)
video_subtitles = self._request_automatic_caption(video_id, video_webpage)
- (sub_error, sub_lang, sub) = video_subtitles[0]
- if sub_error:
- self._downloader.report_warning(sub_error)
if self._downloader.params.get('allsubtitles', False):
video_subtitles = self._extract_all_subtitles(video_id)
if self._downloader.params.get('allsubtitles', False):
video_subtitles = self._extract_all_subtitles(video_id)
- for video_subtitle in video_subtitles:
- (sub_error, sub_lang, sub) = video_subtitle
- if sub_error:
- self._downloader.report_warning(sub_error)
if self._downloader.params.get('listsubtitles', False):
self._list_available_subtitles(video_id)
if self._downloader.params.get('listsubtitles', False):
self._list_available_subtitles(video_id)