aboutsummaryrefslogtreecommitdiff
path: root/youtube_dl/extractor/youtube.py
diff options
context:
space:
mode:
authordirkf <fieldhouse@gmx.net>2022-08-25 12:14:59 +0100
committerdirkf <fieldhouse@gmx.net>2022-08-25 12:14:59 +0100
commit573b13410e5c2f939676116e2700ec8efd9cf97b (patch)
tree6446703cda9aa0847a89c9ec6caf07599668cb31 /youtube_dl/extractor/youtube.py
parent66e58dccc29de65cc95ee97915987d785b2b4b31 (diff)
downloadyoutube-dl-573b13410e5c2f939676116e2700ec8efd9cf97b.tar.xz
[YouTube] Improve error check for n-sig processing
Diffstat (limited to 'youtube_dl/extractor/youtube.py')
-rw-r--r--youtube_dl/extractor/youtube.py18
1 files changed, 12 insertions, 6 deletions
diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py
index 91a3b6058..3d12e2e4a 100644
--- a/youtube_dl/extractor/youtube.py
+++ b/youtube_dl/extractor/youtube.py
@@ -1500,7 +1500,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
return lambda s: jsi.extract_function_from_code(*func_code)([s])
def _n_descramble(self, n_param, player_url, video_id):
- """Compute the response to YT's "n" parameter challenge
+ """Compute the response to YT's "n" parameter challenge,
+ or None
Args:
n_param -- challenge string that is the value of the
@@ -1518,7 +1519,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
if player_id not in self._player_cache:
self._player_cache[player_id] = self._extract_n_function(video_id, player_url)
func = self._player_cache[player_id]
- self._player_cache[sig_id] = func(n_param)
+ ret = func(n_param)
+ if ret.startswith('enhanced_except_'):
+ raise ExtractorError('Unhandled exception in decode')
+ self._player_cache[sig_id] = ret
if self._downloader.params.get('verbose', False):
self._downloader.to_screen('[debug] [%s] %s' % (self.IE_NAME, 'Decrypted nsig {0} => {1}'.format(n_param, self._player_cache[sig_id])))
return self._player_cache[sig_id]
@@ -1539,10 +1543,12 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
continue
n_param = n_param[-1]
n_response = self._n_descramble(n_param, player_url, video_id)
- if n_response:
- qs['n'] = [n_response]
- fmt['url'] = compat_urlparse.urlunparse(
- parsed_fmt_url._replace(query=compat_urllib_parse_urlencode(qs, True)))
+ if n_response is None:
+ # give up if descrambling failed
+ break
+ qs['n'] = [n_response]
+ fmt['url'] = compat_urlparse.urlunparse(
+ parsed_fmt_url._replace(query=compat_urllib_parse_urlencode(qs, True)))
def _mark_watched(self, video_id, player_response):
playback_url = url_or_none(try_get(