|
@@ -806,51 +806,54 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):
|
|
|
url_map = {}
|
|
|
for url_data_str in encoded_url_map.split(','):
|
|
|
url_data = compat_parse_qs(url_data_str)
|
|
|
- if 'itag' in url_data and 'url' in url_data:
|
|
|
- url = url_data['url'][0]
|
|
|
- if 'sig' in url_data:
|
|
|
- url += '&signature=' + url_data['sig'][0]
|
|
|
- elif 's' in url_data:
|
|
|
- encrypted_sig = url_data['s'][0]
|
|
|
-
|
|
|
- if not age_gate:
|
|
|
- jsplayer_url_json = self._search_regex(
|
|
|
- r'"assets":.+?"js":\s*("[^"]+")',
|
|
|
- video_webpage, u'JS player URL')
|
|
|
- player_url = json.loads(jsplayer_url_json)
|
|
|
+ if 'itag' not in url_data or 'url' not in url_data:
|
|
|
+ continue
|
|
|
+ format_id = url_data['itag'][0]
|
|
|
+ url = url_data['url'][0]
|
|
|
+
|
|
|
+ if 'sig' in url_data:
|
|
|
+ url += '&signature=' + url_data['sig'][0]
|
|
|
+ elif 's' in url_data:
|
|
|
+ encrypted_sig = url_data['s'][0]
|
|
|
+
|
|
|
+ if not age_gate:
|
|
|
+ jsplayer_url_json = self._search_regex(
|
|
|
+ r'"assets":.+?"js":\s*("[^"]+")',
|
|
|
+ video_webpage, u'JS player URL')
|
|
|
+ player_url = json.loads(jsplayer_url_json)
|
|
|
+ if player_url is None:
|
|
|
+ player_url_json = self._search_regex(
|
|
|
+ r'ytplayer\.config.*?"url"\s*:\s*("[^"]+")',
|
|
|
+ video_webpage, u'age gate player URL')
|
|
|
+ player_url = json.loads(player_url_json)
|
|
|
+
|
|
|
+ if self._downloader.params.get('verbose'):
|
|
|
if player_url is None:
|
|
|
- player_url_json = self._search_regex(
|
|
|
- r'ytplayer\.config.*?"url"\s*:\s*("[^"]+")',
|
|
|
- video_webpage, u'age gate player URL')
|
|
|
- player_url = json.loads(player_url_json)
|
|
|
-
|
|
|
- if self._downloader.params.get('verbose'):
|
|
|
- if player_url is None:
|
|
|
- player_version = 'unknown'
|
|
|
- player_desc = 'unknown'
|
|
|
+ player_version = 'unknown'
|
|
|
+ player_desc = 'unknown'
|
|
|
+ else:
|
|
|
+ if player_url.endswith('swf'):
|
|
|
+ player_version = self._search_regex(
|
|
|
+ r'-(.+?)(?:/watch_as3)?\.swf$', player_url,
|
|
|
+ u'flash player', fatal=False)
|
|
|
+ player_desc = 'flash player %s' % player_version
|
|
|
else:
|
|
|
- if player_url.endswith('swf'):
|
|
|
- player_version = self._search_regex(
|
|
|
- r'-(.+?)(?:/watch_as3)?\.swf$', player_url,
|
|
|
- u'flash player', fatal=False)
|
|
|
- player_desc = 'flash player %s' % player_version
|
|
|
- else:
|
|
|
- player_version = self._search_regex(
|
|
|
- r'html5player-([^/]+?)(?:/html5player)?\.js',
|
|
|
- player_url,
|
|
|
- 'html5 player', fatal=False)
|
|
|
- player_desc = u'html5 player %s' % player_version
|
|
|
-
|
|
|
- parts_sizes = u'.'.join(compat_str(len(part)) for part in encrypted_sig.split('.'))
|
|
|
- self.to_screen(u'encrypted signature length %d (%s), itag %s, %s' %
|
|
|
- (len(encrypted_sig), parts_sizes, url_data['itag'][0], player_desc))
|
|
|
-
|
|
|
- signature = self._decrypt_signature(
|
|
|
- encrypted_sig, video_id, player_url, age_gate)
|
|
|
- url += '&signature=' + signature
|
|
|
- if 'ratebypass' not in url:
|
|
|
- url += '&ratebypass=yes'
|
|
|
- url_map[url_data['itag'][0]] = url
|
|
|
+ player_version = self._search_regex(
|
|
|
+ r'html5player-([^/]+?)(?:/html5player)?\.js',
|
|
|
+ player_url,
|
|
|
+ 'html5 player', fatal=False)
|
|
|
+ player_desc = u'html5 player %s' % player_version
|
|
|
+
|
|
|
+ parts_sizes = u'.'.join(compat_str(len(part)) for part in encrypted_sig.split('.'))
|
|
|
+ self.to_screen(u'{%s} encrypted signature length %d (%s), itag %s, %s' %
|
|
|
+ (format_id, len(encrypted_sig), parts_sizes, url_data['itag'][0], player_desc))
|
|
|
+
|
|
|
+ signature = self._decrypt_signature(
|
|
|
+ encrypted_sig, video_id, player_url, age_gate)
|
|
|
+ url += '&signature=' + signature
|
|
|
+ if 'ratebypass' not in url:
|
|
|
+ url += '&ratebypass=yes'
|
|
|
+ url_map[format_id] = url
|
|
|
formats = _map_to_format_list(url_map)
|
|
|
elif video_info.get('hlsvp'):
|
|
|
manifest_url = video_info['hlsvp'][0]
|