YoutubeIE: Detect new Vevo style videos
The url_encoded_fmt_stream_map can be found in the video page, but the signature must be decrypted, we get it from the webpage instead of the `get_video_info` pages because we have only discover the algorithm for keys with both sub keys of size 43.
This commit is contained in:
parent
50d2376769
commit
77d0f05f71
1 changed files with 20 additions and 0 deletions
|
@ -724,6 +724,16 @@ class YoutubeIE(InfoExtractor):
|
||||||
# Decide which formats to download
|
# Decide which formats to download
|
||||||
req_format = self._downloader.params.get('format', None)
|
req_format = self._downloader.params.get('format', None)
|
||||||
|
|
||||||
|
try:
|
||||||
|
mobj = re.search(r';ytplayer.config = ({.*?});', video_webpage)
|
||||||
|
info = json.loads(mobj.group(1))
|
||||||
|
if 'dashmpd' in info['args']:
|
||||||
|
# Vevo videos with encrypted signatures
|
||||||
|
self.to_screen(u'Vevo video detected.')
|
||||||
|
video_info['url_encoded_fmt_stream_map'] = [info['args']['url_encoded_fmt_stream_map']]
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
if 'conn' in video_info and video_info['conn'][0].startswith('rtmp'):
|
if 'conn' in video_info and video_info['conn'][0].startswith('rtmp'):
|
||||||
self.report_rtmp_download()
|
self.report_rtmp_download()
|
||||||
video_url_list = [(None, video_info['conn'][0])]
|
video_url_list = [(None, video_info['conn'][0])]
|
||||||
|
@ -735,6 +745,16 @@ class YoutubeIE(InfoExtractor):
|
||||||
url = url_data['url'][0]
|
url = url_data['url'][0]
|
||||||
if 'sig' in url_data:
|
if 'sig' in url_data:
|
||||||
url += '&signature=' + url_data['sig'][0]
|
url += '&signature=' + url_data['sig'][0]
|
||||||
|
if 's' in url_data:
|
||||||
|
def k(s):
|
||||||
|
"""Decrypt the key the two subkeys must have a length of 43"""
|
||||||
|
(a,b) = s.split('.')
|
||||||
|
b = ''.join([b[:8],a[0],b[9:18],b[-4],b[19:39], b[18]])[0:40]
|
||||||
|
a = a[-40:]
|
||||||
|
s_dec = '.'.join((a,b))[::-1]
|
||||||
|
return s_dec
|
||||||
|
key = k(url_data['s'][0])
|
||||||
|
url += '&signature=' + key
|
||||||
if 'ratebypass' not in url:
|
if 'ratebypass' not in url:
|
||||||
url += '&ratebypass=yes'
|
url += '&ratebypass=yes'
|
||||||
url_map[url_data['itag'][0]] = url
|
url_map[url_data['itag'][0]] = url
|
||||||
|
|
Loading…
Reference in a new issue