diff options
| author | Sergey M․ <dstftw@gmail.com> | 2014-12-06 21:24:20 +0600 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2014-12-06 21:24:20 +0600 | 
| commit | 04d02a9d57c834d3044871ce7dcc90932e686e46 (patch) | |
| tree | b9d055040974c80b5fc3ca5f327d5e78453aee06 | |
| parent | b82f815f373818ba99ee43660e9255e8f4ecac62 (diff) | |
[twitch] Add login support (#3986)
| -rw-r--r-- | youtube_dl/extractor/twitch.py | 42 | 
1 files changed, 42 insertions, 0 deletions
| diff --git a/youtube_dl/extractor/twitch.py b/youtube_dl/extractor/twitch.py index 36aa1ad6e..397d167e8 100644 --- a/youtube_dl/extractor/twitch.py +++ b/youtube_dl/extractor/twitch.py @@ -1,3 +1,4 @@ +# coding: utf-8  from __future__ import unicode_literals  import itertools @@ -5,6 +6,8 @@ import re  from .common import InfoExtractor  from ..utils import ( +    compat_urllib_parse, +    compat_urllib_request,      ExtractorError,      parse_iso8601,  ) @@ -24,6 +27,7 @@ class TwitchIE(InfoExtractor):          """      _PAGE_LIMIT = 100      _API_BASE = 'https://api.twitch.tv' +    _LOGIN_URL = 'https://secure.twitch.tv/user/login'      _TESTS = [{          'url': 'http://www.twitch.tv/riotgames/b/577357806',          'info_dict': { @@ -109,6 +113,44 @@ class TwitchIE(InfoExtractor):              'view_count': info['views'],          } +    def _real_initialize(self): +        self._login() + +    def _login(self): +        (username, password) = self._get_login_info() +        if username is None: +            return + +        login_page = self._download_webpage( +            self._LOGIN_URL, None, 'Downloading login page') + +        authenticity_token = self._search_regex( +            r'<input name="authenticity_token" type="hidden" value="([^"]+)"', +            login_page, 'authenticity token') + +        login_form = { +            'utf8': '✓'.encode('utf-8'), +            'authenticity_token': authenticity_token, +            'redirect_on_login': '', +            'embed_form': 'false', +            'mp_source_action': '', +            'follow': '', +            'user[login]': username, +            'user[password]': password, +        } + +        request = compat_urllib_request.Request( +            self._LOGIN_URL, compat_urllib_parse.urlencode(login_form).encode('utf-8')) +        request.add_header('Referer', self._LOGIN_URL) +        response = self._download_webpage( +            request, None, 'Logging in as %s' % username) + +        m = re.search( +            r"id=([\"'])login_error_message\1[^>]*>(?P<msg>[^<]+)", response) +        if m: +            raise ExtractorError( +                'Unable to login: %s' % m.group('msg').strip(), expected=True) +      def _real_extract(self, url):          mobj = re.match(self._VALID_URL, url)          if mobj.group('chapterid'): | 
