diff --git a/youtube_dl/InfoExtractors.py b/youtube_dl/InfoExtractors.py index 9df521d02..9349f708c 100644 --- a/youtube_dl/InfoExtractors.py +++ b/youtube_dl/InfoExtractors.py @@ -93,6 +93,66 @@ class InfoExtractor(object): """Real extraction process. Redefine in subclasses.""" pass + def _login(self): + if self._downloader is None: + return False + + username = None + password = None + downloader_params = self._downloader.params + + # Attempt to use provided username and password or .netrc data + if downloader_params.get('username', None) and \ + downloader_params.get('password', None): + username = downloader_params['username'] + password = downloader_params['password'] + elif downloader_params.get('usenetrc', False): + try: + info = netrc.netrc().authenticators(self._NETRC_MACHINE) + if info is not None: + username = info[0] + password = info[2] + else: + raise netrc.NetrcParseError('No authenticators for %s' % self._NETRC_MACHINE) + except (IOError, netrc.NetrcParseError), err: + self._downloader.to_stderr(u'WARNING: parsing .netrc: %s' % str(err)) + return False + + # Set language + if hasattr(self, "_LANG_URL"): + request = urllib2.Request(self._LANG_URL) + try: + self.report_lang() + urllib2.urlopen(request).read() + except (urllib2.URLError, httplib.HTTPException, socket.error), err: + self._downloader.to_stderr(u'WARNING: unable to set language: %s' % str(err)) + return False + + # No authentication to be performed + if username is None: + return False + + login_form = self._LOGIN_FORM + # Set login credentials + for k in login_form: + if login_form[k] == "username": + login_form[k] = username + elif login_form[k] == "password": + login_form[k] = password + + request = urllib2.Request(self._LOGIN_URL, urllib.urlencode(login_form)) + try: + self.report_login() + login_results = urllib2.urlopen(request).read() + if re.search(self._FAILED_LOGIN, login_results) is not None: + self._downloader.to_stderr(u'WARNING: unable to log in: bad username or password') + return + except (urllib2.URLError, httplib.HTTPException, socket.error), err: + self._downloader.to_stderr(u'WARNING: unable to log in: %s' % str(err)) + return False + + return request + class YoutubeIE(InfoExtractor): """Information extractor for youtube.com.""" @@ -119,9 +179,17 @@ class YoutubeIE(InfoExtractor): $""" _LANG_URL = r'http://www.youtube.com/?hl=en&persist_hl=1&gl=US&persist_gl=1&opt_out_ackd=1' _LOGIN_URL = 'https://www.youtube.com/signup?next=/&gl=US&hl=en' + _FAILED_LOGIN = r'(?i)