[ie/youtube] Support excluding player_clients in extractor-arg (#10710)

Closes #10699
Authored by: bashonly
This commit is contained in:
bashonly 2024-08-12 04:12:46 -05:00 committed by GitHub
parent a065086640
commit 49f3741a82
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1339,6 +1339,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
short_client_name(client): client short_client_name(client): client
for client in ('android', 'android_creator', 'android_music') for client in ('android', 'android_creator', 'android_music')
} }
_DEFAULT_CLIENTS = ('ios', 'web_creator')
_GEO_BYPASS = False _GEO_BYPASS = False
@ -3744,17 +3745,19 @@ def _extract_player_response(self, client, video_id, master_ytcfg, player_ytcfg,
def _get_requested_clients(self, url, smuggled_data): def _get_requested_clients(self, url, smuggled_data):
requested_clients = [] requested_clients = []
broken_clients = [] broken_clients = []
default = ['ios', 'web_creator'] excluded_clients = []
allowed_clients = sorted( allowed_clients = sorted(
(client for client in INNERTUBE_CLIENTS if client[:1] != '_'), (client for client in INNERTUBE_CLIENTS if client[:1] != '_'),
key=lambda client: INNERTUBE_CLIENTS[client]['priority'], reverse=True) key=lambda client: INNERTUBE_CLIENTS[client]['priority'], reverse=True)
for client in self._configuration_arg('player_client'): for client in self._configuration_arg('player_client'):
if client == 'default': if client == 'default':
requested_clients.extend(default) requested_clients.extend(self._DEFAULT_CLIENTS)
elif client == 'all': elif client == 'all':
requested_clients.extend(allowed_clients) requested_clients.extend(allowed_clients)
elif client.startswith('-'):
excluded_clients.append(client[1:])
elif client not in allowed_clients: elif client not in allowed_clients:
self.report_warning(f'Skipping unsupported client {client}') self.report_warning(f'Skipping unsupported client "{client}"')
elif client in self._BROKEN_CLIENTS.values(): elif client in self._BROKEN_CLIENTS.values():
broken_clients.append(client) broken_clients.append(client)
else: else:
@ -3762,7 +3765,12 @@ def _get_requested_clients(self, url, smuggled_data):
# Force deprioritization of _BROKEN_CLIENTS for format de-duplication # Force deprioritization of _BROKEN_CLIENTS for format de-duplication
requested_clients.extend(broken_clients) requested_clients.extend(broken_clients)
if not requested_clients: if not requested_clients:
requested_clients = default requested_clients.extend(self._DEFAULT_CLIENTS)
for excluded_client in excluded_clients:
if excluded_client in requested_clients:
requested_clients.remove(excluded_client)
if not requested_clients:
raise ExtractorError('No player clients have been requested', expected=True)
if smuggled_data.get('is_music_url') or self.is_music_url(url): if smuggled_data.get('is_music_url') or self.is_music_url(url):
for requested_client in requested_clients: for requested_client in requested_clients: