@ -286,7 +286,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
elif len ( s ) == 87 :
return s [ 4 : 23 ] + s [ 86 ] + s [ 24 : 85 ]
elif len ( s ) == 86 :
return s [ 2: 63 ] + s [ 82 ] + s [ 64 : 82 ] + s [ 63 ]
return s [ 83: 85 ] + s [ 26 ] + s [ 79 : 46 : - 1 ] + s [ 85 ] + s [ 45 : 36 : - 1 ] + s [ 30 ] + s [ 35 : 30 : - 1 ] + s [ 46 ] + s [ 29 : 26 : - 1 ] + s [ 82 ] + s [ 25 : 1 : - 1 ]
elif len ( s ) == 85 :
return s [ 2 : 8 ] + s [ 0 ] + s [ 9 : 21 ] + s [ 65 ] + s [ 22 : 65 ] + s [ 84 ] + s [ 66 : 82 ] + s [ 21 ]
elif len ( s ) == 84 :
@ -303,6 +303,16 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
else :
raise ExtractorError ( u ' Unable to decrypt signature, key length %d not supported; retrying might work ' % ( len ( s ) ) )
def _decrypt_signature_age_gate ( self , s ) :
# The videos with age protection use another player, so the algorithms
# can be different.
if len ( s ) == 86 :
return s [ 2 : 63 ] + s [ 82 ] + s [ 64 : 82 ] + s [ 63 ]
else :
# Fallback to the other algortihms
self . _decrypt_signature ( s )
def _get_available_subtitles ( self , video_id ) :
self . report_video_subtitles_download ( video_id )
request = compat_urllib_request . Request ( ' http://video.google.com/timedtext?hl=en&type=list&v= %s ' % video_id )
@ -611,7 +621,11 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
parts_sizes = u ' . ' . join ( compat_str ( len ( part ) ) for part in s . split ( ' . ' ) )
self . to_screen ( u ' encrypted signature length %d ( %s ), itag %s , %s ' %
( len ( s ) , parts_sizes , url_data [ ' itag ' ] [ 0 ] , player ) )
signature = self . _decrypt_signature ( url_data [ ' s ' ] [ 0 ] )
encrypted_sig = url_data [ ' s ' ] [ 0 ]
if age_gate :
signature = self . _decrypt_signature_age_gate ( encrypted_sig )
else :
signature = self . _decrypt_signature ( encrypted_sig )
url + = ' &signature= ' + signature
if ' ratebypass ' not in url :
url + = ' &ratebypass=yes '