[youtube] Make get_video_info processing more robust (closes #29333)
authorSergey M․ <dstftw@gmail.com>
Sun, 20 Jun 2021 18:35:21 +0000 (01:35 +0700)
committerSergey M․ <dstftw@gmail.com>
Sun, 20 Jun 2021 18:35:21 +0000 (01:35 +0700)
youtube_dl/extractor/youtube.py

index e68214008da5b8ef7da493fc209ad8147953fd05..dc4bd4a77f94aa40a4a894b3cb65a6547fbb2741 100644 (file)
@@ -1504,22 +1504,25 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
 
         playability_status = player_response.get('playabilityStatus') or {}
         if playability_status.get('reason') == 'Sign in to confirm your age':
-            pr = self._parse_json(try_get(compat_parse_qs(
-                self._download_webpage(
-                    base_url + 'get_video_info', video_id,
-                    'Refetching age-gated info webpage',
-                    'unable to download video info webpage', query={
-                        'video_id': video_id,
-                        'eurl': 'https://youtube.googleapis.com/v/' + video_id,
-                        'html5': 1,
-                        # See https://github.com/ytdl-org/youtube-dl/issues/29333#issuecomment-864049544
-                        'c': 'TVHTML5',
-                        'cver': '6.20180913',
-                    }, fatal=False)),
-                lambda x: x['player_response'][0],
-                compat_str) or '{}', video_id)
-            if pr:
-                player_response = pr
+            video_info = self._download_webpage(
+                base_url + 'get_video_info', video_id,
+                'Refetching age-gated info webpage',
+                'unable to download video info webpage', query={
+                    'video_id': video_id,
+                    'eurl': 'https://youtube.googleapis.com/v/' + video_id,
+                    'html5': 1,
+                    # See https://github.com/ytdl-org/youtube-dl/issues/29333#issuecomment-864049544
+                    'c': 'TVHTML5',
+                    'cver': '6.20180913',
+                }, fatal=False)
+            if video_info:
+                pr = self._parse_json(
+                    try_get(
+                        compat_parse_qs(video_info),
+                        lambda x: x['player_response'][0], compat_str) or '{}',
+                    video_id, fatal=False)
+                if pr and isinstance(pr, dict):
+                    player_response = pr
 
         trailer_video_id = try_get(
             playability_status,