diff options
Diffstat (limited to 'youtube_dl/extractor/packtpub.py')
| -rw-r--r-- | youtube_dl/extractor/packtpub.py | 39 | 
1 files changed, 36 insertions, 3 deletions
| diff --git a/youtube_dl/extractor/packtpub.py b/youtube_dl/extractor/packtpub.py index 881f3bcc7..bb668c999 100644 --- a/youtube_dl/extractor/packtpub.py +++ b/youtube_dl/extractor/packtpub.py @@ -3,7 +3,10 @@ from __future__ import unicode_literals  import re  from .common import InfoExtractor -from ..compat import compat_str +from ..compat import ( +    compat_str, +    compat_HTTPError, +)  from ..utils import (      clean_html,      ExtractorError, @@ -11,6 +14,7 @@ from ..utils import (      strip_or_none,      unified_timestamp,      urljoin, +    urlencode_postdata,  ) @@ -34,6 +38,32 @@ class PacktPubIE(PacktPubBaseIE):              'upload_date': '20170331',          },      } +    _NETRC_MACHINE = 'packtpub' +    _TOKEN = None + +    def _real_initialize(self): +        (username, password) = self._get_login_info() +        if username is None: +            return +        webpage = self._download_webpage(self._PACKT_BASE, None) +        login_form = self._form_hidden_inputs( +            'packt-user-login-form', webpage) +        login_form.update({ +            'email': username, +            'password': password, +        }) +        self._download_webpage( +            self._PACKT_BASE, None, 'Logging in as %s' % username, +            data=urlencode_postdata(login_form)) +        try: +            self._TOKEN = self._download_json( +                '%s/users/tokens/sessions' % self._MAPT_REST, None, +                'Downloading Authorization Token')['data']['token'] +        except ExtractorError as e: +            if isinstance(e.cause, compat_HTTPError) and e.cause.code in (401, 404): +                message = self._parse_json(e.cause.read().decode(), None)['message'] +                raise ExtractorError(message, expected=True) +            raise      def _handle_error(self, response):          if response.get('status') != 'success': @@ -51,14 +81,17 @@ class PacktPubIE(PacktPubBaseIE):          course_id, chapter_id, video_id = mobj.group(              'course_id', 'chapter_id', 'id') +        headers = {} +        if self._TOKEN: +            headers['Authorization'] = self._TOKEN          video = self._download_json(              '%s/users/me/products/%s/chapters/%s/sections/%s'              % (self._MAPT_REST, course_id, chapter_id, video_id), video_id, -            'Downloading JSON video')['data'] +            'Downloading JSON video', headers=headers)['data']          content = video.get('content')          if not content: -            raise ExtractorError('This video is locked', expected=True) +            self.raise_login_required('This video is locked')          video_url = content['file'] | 
