|
|
@ -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'] |
|
|
|
|
|
|
|