diff --git a/youtube_dl/extractor/twitch.py b/youtube_dl/extractor/twitch.py index 8c87f6dd3..7058eb9f7 100644 --- a/youtube_dl/extractor/twitch.py +++ b/youtube_dl/extractor/twitch.py @@ -40,6 +40,7 @@ class TwitchBaseIE(InfoExtractor): _LOGIN_POST_URL = 'https://passport.twitch.tv/login' _CLIENT_ID = 'kimne78kx3ncx6brgo4mv6wki5h1ko' _NETRC_MACHINE = 'twitch' + _AUTHY_ERROR_CODE = 3011 def _handle_error(self, response): if not isinstance(response, dict): @@ -92,7 +93,19 @@ class TwitchBaseIE(InfoExtractor): post_url, None, note, data=json.dumps(form).encode(), headers=headers, expected_status=400) error = response.get('error_description') or response.get('error_code') - if error: + + if response.get('error_code') == self._AUTHY_ERROR_CODE: + # Authy code request + tfa_token = self._get_tfa_info('two-factor authentication token') + response = self._download_json( + post_url, None, note, data=json.dumps({ + 'username': username, + 'password': password, + 'client_id': self._CLIENT_ID, + 'authy_token': tfa_token, + 'remember_2fa': 'true', + }).encode(), headers=headers, expected_status=400) + else: fail(error) if 'Authenticated successfully' in response.get('message', ''): @@ -123,14 +136,6 @@ class TwitchBaseIE(InfoExtractor): if not redirect_page: return - if re.search(r'(?i)