diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
index d1d57eb47e..7c74ec905a 100644
--- a/yt_dlp/extractor/youtube.py
+++ b/yt_dlp/extractor/youtube.py
@@ -3702,17 +3702,17 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
             return pr_id
 
     def _extract_player_responses(self, clients, video_id, webpage, master_ytcfg, smuggled_data):
-        initial_pr = None
+        initial_pr = ignore_initial_response = None
         if webpage:
-            experiments = traverse_obj(master_ytcfg, (
-                'WEB_PLAYER_CONTEXT_CONFIGS', ..., 'serializedExperimentIds', {str}, {lambda x: x.split(',')}, ..., {str}))
-            if all(x in experiments for x in self._POTOKEN_EXPERIMENTS):
-                self.report_warning(
-                    'Webpage contains broken formats (poToken experiment detected). Ignoring initial player response')
-                master_ytcfg = self._get_default_ytcfg()
-            else:
-                initial_pr = self._search_json(
-                    self._YT_INITIAL_PLAYER_RESPONSE_RE, webpage, 'initial player response', video_id, fatal=False)
+            if 'web' in clients:
+                experiments = traverse_obj(master_ytcfg, (
+                    'WEB_PLAYER_CONTEXT_CONFIGS', ..., 'serializedExperimentIds', {lambda x: x.split(',')}, ...))
+                if all(x in experiments for x in self._POTOKEN_EXPERIMENTS):
+                    self.report_warning(
+                        'Webpage contains broken formats (poToken experiment detected). Ignoring initial player response')
+                    ignore_initial_response = True
+            initial_pr = self._search_json(
+                self._YT_INITIAL_PLAYER_RESPONSE_RE, webpage, 'initial player response', video_id, fatal=False)
 
         prs = []
         if initial_pr and not self._invalid_player_response(initial_pr, video_id):
@@ -3740,8 +3740,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
         skipped_clients = {}
         while clients:
             client, base_client, variant = _split_innertube_client(clients.pop())
-            player_ytcfg = master_ytcfg if client == 'web' else {}
-            if 'configs' not in self._configuration_arg('player_skip') and client != 'web':
+            player_ytcfg = {}
+            if client == 'web':
+                player_ytcfg = self._get_default_ytcfg() if ignore_initial_response else master_ytcfg
+            elif 'configs' not in self._configuration_arg('player_skip'):
                 player_ytcfg = self._download_ytcfg(client, video_id) or player_ytcfg
 
             player_url = player_url or self._extract_player_url(master_ytcfg, player_ytcfg, webpage=webpage)
@@ -3754,7 +3756,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
                 player_url = self._download_player_url(video_id)
                 tried_iframe_fallback = True
 
-            pr = initial_pr if client == 'web' and initial_pr else None
+            pr = initial_pr if client == 'web' and not ignore_initial_response else None
             for retry in self.RetryManager(fatal=False):
                 try:
                     pr = pr or self._extract_player_response(
@@ -3765,7 +3767,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
                     break
                 experiments = traverse_obj(pr, (
                     'responseContext', 'serviceTrackingParams', lambda _, v: v['service'] == 'GFEEDBACK',
-                    'params', lambda _, v: v['key'] == 'e', 'value', {lambda x: x.split(',')}, ..., {str}))
+                    'params', lambda _, v: v['key'] == 'e', 'value', {lambda x: x.split(',')}, ...))
                 if all(x in experiments for x in self._POTOKEN_EXPERIMENTS):
                     pr = None
                     retry.error = ExtractorError('API returned broken formats (poToken experiment detected)', expected=True)