diff options
| author | Devon Meunier <devon.meunier@gmail.com> | 2019-05-19 07:32:46 -0400 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2020-03-21 01:43:08 +0700 | 
| commit | 787c3604671283bd4945eefb87866d01fb973097 (patch) | |
| tree | d977dd8a7087fac92b5e99c13fc653f2b7347adc /youtube_dl/extractor/cbc.py | |
| parent | 73453430c11002a7193eaa9fb8cf5349fa326c93 (diff) | |
[cbc:watch] Add support for authentication
Diffstat (limited to 'youtube_dl/extractor/cbc.py')
| -rw-r--r-- | youtube_dl/extractor/cbc.py | 36 | 
1 files changed, 34 insertions, 2 deletions
diff --git a/youtube_dl/extractor/cbc.py b/youtube_dl/extractor/cbc.py index 751a3a8f2..b02cddbfd 100644 --- a/youtube_dl/extractor/cbc.py +++ b/youtube_dl/extractor/cbc.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals  import json  import re +from xml.sax.saxutils import escape  from .common import InfoExtractor  from ..compat import ( @@ -216,6 +217,29 @@ class CBCWatchBaseIE(InfoExtractor):          'clearleap': 'http://www.clearleap.com/namespace/clearleap/1.0/',      }      _GEO_COUNTRIES = ['CA'] +    _LOGIN_URL = 'https://api.loginradius.com/identity/v2/auth/login' +    _TOKEN_URL = 'https://cloud-api.loginradius.com/sso/jwt/api/token' +    _API_KEY = '3f4beddd-2061-49b0-ae80-6f1f2ed65b37' +    _NETRC_MACHINE = 'cbcwatch' + +    def _signature(self, email, password): +        data = json.dumps({ +            'email': email, +            'password': password, +        }).encode() +        headers = {'content-type': 'application/json'} +        query = {'apikey': self._API_KEY} +        resp = self._download_json(self._LOGIN_URL, None, data=data, headers=headers, query=query) +        access_token = resp['access_token'] + +        # token +        query = { +            'access_token': access_token, +            'apikey': self._API_KEY, +            'jwtapp': 'jwt', +        } +        resp = self._download_json(self._TOKEN_URL, None, headers=headers, query=query) +        return resp['signature']      def _call_api(self, path, video_id):          url = path if path.startswith('http') else self._API_BASE_URL + path @@ -249,13 +273,21 @@ class CBCWatchBaseIE(InfoExtractor):          return self._device_id and self._device_token      def _register_device(self): -        self._device_id = self._device_token = None          result = self._download_xml(              self._API_BASE_URL + 'device/register',              None, 'Acquiring device token',              data=b'<device><type>web</type></device>')          self._device_id = xpath_text(result, 'deviceId', fatal=True) -        self._device_token = xpath_text(result, 'deviceToken', fatal=True) +        anon_device_token = xpath_text(result, 'deviceToken', fatal=True) +        email, password = self._get_login_info() +        if email and password: +            signature = self._signature(email, password) +            data = '<login><token>{0}</token><device><deviceId>{1}</deviceId><type>web</type></device></login>'.format(escape(signature), escape(self._device_id)).encode() +            url = self._API_BASE_URL + 'device/login' +            result = self._download_xml(url, None, data=data, headers={'content-type': 'application/xml'}) +            self._device_token = xpath_text(result, 'token', fatal=True) +        else: +            self._device_token = anon_device_token          self._downloader.cache.store(              'cbcwatch', 'device', {                  'id': self._device_id,  | 
