mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-03 22:57:08 -05:00 
			
		
		
		
	[packtpub] add support for authentication(closes #12622)
This commit is contained in:
		@@ -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']
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user