diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 3b2bda0e75..ac2f594623 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -422,6 +422,14 @@ class InfoExtractor(object): _GEO_IP_BLOCKS = None _WORKING = True + _LOGIN_HINTS = { + 'any': 'Use --cookies, --username and --password or --netrc to provide account credentials', + 'cookies': ( + 'Use --cookies for the authentication. ' + 'See https://github.com/ytdl-org/youtube-dl#how-do-i-pass-cookies-to-youtube-dl for how to pass cookies'), + 'password': 'Use --username and --password or --netrc to provide account credentials', + } + def __init__(self, downloader=None): """Constructor. Receives an optional downloader.""" self._ready = False @@ -978,12 +986,11 @@ class InfoExtractor(object): self.to_screen('Logging in') def raise_login_required( - self, msg='This video is only available for registered users', metadata_available=False): + self, msg='This video is only available for registered users', + metadata_available=False, method='any'): if metadata_available and self.get_param('ignore_no_formats_error'): self.report_warning(msg) - raise ExtractorError( - '%s. Use --cookies, --username and --password or --netrc to provide account credentials' % msg, - expected=True) + raise ExtractorError('%s. %s' % (msg, self._LOGIN_HINTS[method]), expected=True) def raise_geo_restricted( self, msg='This video is not available from your location due to geo restriction', diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py index 5e836f8831..3f021c281e 100644 --- a/yt_dlp/extractor/youtube.py +++ b/yt_dlp/extractor/youtube.py @@ -85,7 +85,20 @@ class YoutubeBaseInfoExtractor(InfoExtractor): If _LOGIN_REQUIRED is set and no authentication was provided, an error is raised. """ + + def warn(message): + self.report_warning(message) + + # username+password login is broken + if self._LOGIN_REQUIRED and self.get_param('cookiefile') is None: + self.raise_login_required( + 'Login details are needed to download this content', method='cookies') username, password = self._get_login_info() + if username: + warn('Logging in using username and password is broken. %s' % self._LOGIN_HINTS['cookies']) + return + # Everything below this is broken! + # No authentication to be performed if username is None: if self._LOGIN_REQUIRED and self.get_param('cookiefile') is None: @@ -126,9 +139,6 @@ class YoutubeBaseInfoExtractor(InfoExtractor): 'Google-Accounts-XSRF': 1, }) - def warn(message): - self.report_warning(message) - lookup_req = [ username, None, [], None, 'US', None, None, 2, False, True, @@ -4018,9 +4028,6 @@ class YoutubeFeedsInfoExtractor(YoutubeTabIE): def IE_NAME(self): return 'youtube:%s' % self._FEED_NAME - def _real_initialize(self): - self._login() - def _real_extract(self, url): return self.url_result( 'https://www.youtube.com/feed/%s' % self._FEED_NAME,