mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-11-04 00:25:15 +00:00 
			
		
		
		
	@@ -131,6 +131,8 @@ INNERTUBE_CLIENTS = {
 | 
				
			|||||||
        },
 | 
					        },
 | 
				
			||||||
        'INNERTUBE_CONTEXT_CLIENT_NAME': 21,
 | 
					        'INNERTUBE_CONTEXT_CLIENT_NAME': 21,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    # ios has HLS live streams
 | 
				
			||||||
 | 
					    # See: https://github.com/TeamNewPipe/NewPipeExtractor/issues/680
 | 
				
			||||||
    'ios': {
 | 
					    'ios': {
 | 
				
			||||||
        'INNERTUBE_API_KEY': 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8',
 | 
					        'INNERTUBE_API_KEY': 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8',
 | 
				
			||||||
        'INNERTUBE_CONTEXT': {
 | 
					        'INNERTUBE_CONTEXT': {
 | 
				
			||||||
@@ -162,6 +164,8 @@ INNERTUBE_CLIENTS = {
 | 
				
			|||||||
        },
 | 
					        },
 | 
				
			||||||
        'INNERTUBE_CONTEXT_CLIENT_NAME': 26
 | 
					        'INNERTUBE_CONTEXT_CLIENT_NAME': 26
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    # mweb has 'ultralow' formats
 | 
				
			||||||
 | 
					    # See: https://github.com/yt-dlp/yt-dlp/pull/557
 | 
				
			||||||
    'mweb': {
 | 
					    'mweb': {
 | 
				
			||||||
        'INNERTUBE_API_KEY': 'AIzaSyDCU8hByM-4DrUqRUYnGn-3llEO78bcxq8',
 | 
					        'INNERTUBE_API_KEY': 'AIzaSyDCU8hByM-4DrUqRUYnGn-3llEO78bcxq8',
 | 
				
			||||||
        'INNERTUBE_CONTEXT': {
 | 
					        'INNERTUBE_CONTEXT': {
 | 
				
			||||||
@@ -205,23 +209,28 @@ build_innertube_clients()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class YoutubeBaseInfoExtractor(InfoExtractor):
 | 
					class YoutubeBaseInfoExtractor(InfoExtractor):
 | 
				
			||||||
    """Provide base functions for Youtube extractors"""
 | 
					    """Provide base functions for Youtube extractors"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _RESERVED_NAMES = (
 | 
				
			||||||
 | 
					        r'channel|c|user|playlist|watch|w|v|embed|e|watch_popup|'
 | 
				
			||||||
 | 
					        r'shorts|movies|results|shared|hashtag|trending|feed|feeds|'
 | 
				
			||||||
 | 
					        r'browse|oembed|get_video_info|iframe_api|s/player|'
 | 
				
			||||||
 | 
					        r'storefront|oops|index|account|reporthistory|t/terms|about|upload|signin|logout')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _PLAYLIST_ID_RE = r'(?:(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}|RDMM|WL|LL|LM)'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _NETRC_MACHINE = 'youtube'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # If True it will raise an error if no login info is provided
 | 
				
			||||||
 | 
					    _LOGIN_REQUIRED = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    r'''  # Unused since login is broken
 | 
				
			||||||
    _LOGIN_URL = 'https://accounts.google.com/ServiceLogin'
 | 
					    _LOGIN_URL = 'https://accounts.google.com/ServiceLogin'
 | 
				
			||||||
    _TWOFACTOR_URL = 'https://accounts.google.com/signin/challenge'
 | 
					    _TWOFACTOR_URL = 'https://accounts.google.com/signin/challenge'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _LOOKUP_URL = 'https://accounts.google.com/_/signin/sl/lookup'
 | 
					    _LOOKUP_URL = 'https://accounts.google.com/_/signin/sl/lookup'
 | 
				
			||||||
    _CHALLENGE_URL = 'https://accounts.google.com/_/signin/sl/challenge'
 | 
					    _CHALLENGE_URL = 'https://accounts.google.com/_/signin/sl/challenge'
 | 
				
			||||||
    _TFA_URL = 'https://accounts.google.com/_/signin/challenge?hl=en&TL={0}'
 | 
					    _TFA_URL = 'https://accounts.google.com/_/signin/challenge?hl=en&TL={0}'
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
    _RESERVED_NAMES = (
 | 
					 | 
				
			||||||
        r'channel|c|user|browse|playlist|watch|w|v|embed|e|watch_popup|shorts|'
 | 
					 | 
				
			||||||
        r'movies|results|shared|hashtag|trending|feed|feeds|oembed|get_video_info|'
 | 
					 | 
				
			||||||
        r'storefront|oops|index|account|reporthistory|t/terms|about|upload|signin|logout')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _NETRC_MACHINE = 'youtube'
 | 
					 | 
				
			||||||
    # If True it will raise an error if no login info is provided
 | 
					 | 
				
			||||||
    _LOGIN_REQUIRED = False
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    _PLAYLIST_ID_RE = r'(?:(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}|RDMM|WL|LL|LM)'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _login(self):
 | 
					    def _login(self):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@@ -460,10 +469,9 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
 | 
				
			|||||||
        return _func(ytcfg) or _func(self._get_default_ytcfg(default_client))
 | 
					        return _func(ytcfg) or _func(self._get_default_ytcfg(default_client))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _extract_client_name(self, ytcfg, default_client='web'):
 | 
					    def _extract_client_name(self, ytcfg, default_client='web'):
 | 
				
			||||||
        return (
 | 
					        return self._ytcfg_get_safe(
 | 
				
			||||||
            try_get(ytcfg, lambda x: x['INNERTUBE_CLIENT_NAME'], compat_str)
 | 
					            ytcfg, (lambda x: x['INNERTUBE_CLIENT_NAME'],
 | 
				
			||||||
            or self._ytcfg_get_safe(
 | 
					                    lambda x: x['INNERTUBE_CONTEXT']['client']['clientName']), compat_str, default_client)
 | 
				
			||||||
                ytcfg, lambda x: x['INNERTUBE_CONTEXT']['client']['clientName'], compat_str, default_client))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def _extract_session_index(*data):
 | 
					    def _extract_session_index(*data):
 | 
				
			||||||
@@ -473,10 +481,9 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
 | 
				
			|||||||
                return session_index
 | 
					                return session_index
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _extract_client_version(self, ytcfg, default_client='web'):
 | 
					    def _extract_client_version(self, ytcfg, default_client='web'):
 | 
				
			||||||
        return (
 | 
					        return self._ytcfg_get_safe(
 | 
				
			||||||
            try_get(ytcfg, lambda x: x['INNERTUBE_CLIENT_VERSION'], compat_str)
 | 
					            ytcfg, (lambda x: x['INNERTUBE_CLIENT_VERSION'],
 | 
				
			||||||
            or self._ytcfg_get_safe(
 | 
					                    lambda x: x['INNERTUBE_CONTEXT']['client']['clientVersion']), compat_str, default_client)
 | 
				
			||||||
                ytcfg, lambda x: x['INNERTUBE_CONTEXT']['client']['clientVersion'], compat_str, default_client))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _extract_api_key(self, ytcfg=None, default_client='web'):
 | 
					    def _extract_api_key(self, ytcfg=None, default_client='web'):
 | 
				
			||||||
        return self._ytcfg_get_safe(ytcfg, lambda x: x['INNERTUBE_API_KEY'], compat_str, default_client)
 | 
					        return self._ytcfg_get_safe(ytcfg, lambda x: x['INNERTUBE_API_KEY'], compat_str, default_client)
 | 
				
			||||||
@@ -1181,7 +1188,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
 | 
				
			|||||||
            'info_dict': {
 | 
					            'info_dict': {
 | 
				
			||||||
                'id': 'Tq92D6wQ1mg',
 | 
					                'id': 'Tq92D6wQ1mg',
 | 
				
			||||||
                'title': '[MMD] Adios - EVERGLOW [+Motion DL]',
 | 
					                'title': '[MMD] Adios - EVERGLOW [+Motion DL]',
 | 
				
			||||||
                'ext': 'mp4','upload_date': '20191227',
 | 
					                'ext': 'mp4',
 | 
				
			||||||
 | 
					                'upload_date': '20191227',
 | 
				
			||||||
                'uploader_id': 'UC1yoRdFoFJaCY-AGfD9W0wQ',
 | 
					                'uploader_id': 'UC1yoRdFoFJaCY-AGfD9W0wQ',
 | 
				
			||||||
                'uploader': 'Projekt Melody',
 | 
					                'uploader': 'Projekt Melody',
 | 
				
			||||||
                'description': 'md5:17eccca93a786d51bc67646756894066',
 | 
					                'description': 'md5:17eccca93a786d51bc67646756894066',
 | 
				
			||||||
@@ -2741,8 +2749,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
 | 
				
			|||||||
        for f in formats:
 | 
					        for f in formats:
 | 
				
			||||||
            if '&c=WEB&' in f['url'] and '&ratebypass=yes&' not in f['url']:  # throttled
 | 
					            if '&c=WEB&' in f['url'] and '&ratebypass=yes&' not in f['url']:  # throttled
 | 
				
			||||||
                f['source_preference'] = -10
 | 
					                f['source_preference'] = -10
 | 
				
			||||||
                note = f.get('format_note')
 | 
					                # TODO: this method is not reliable
 | 
				
			||||||
                f['format_note'] = f'{note} (throttled)' if note else '(throttled)'
 | 
					                f['format_note'] = format_field(f, 'format_note', '%s ') + '(maybe throttled)'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Source is given priority since formats that throttle are given lower source_preference
 | 
					        # Source is given priority since formats that throttle are given lower source_preference
 | 
				
			||||||
        # When throttling issue is fully fixed, remove this
 | 
					        # When throttling issue is fully fixed, remove this
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user