summary refs log tree commit diff
diff options
context:
space:
mode:
authorDevon Meunier <devon.meunier@gmail.com>2019-05-19 07:32:46 -0400
committerSergey M․ <dstftw@gmail.com>2020-03-21 01:43:08 +0700
commit787c3604671283bd4945eefb87866d01fb973097 (patch)
treed977dd8a7087fac92b5e99c13fc653f2b7347adc
parent73453430c11002a7193eaa9fb8cf5349fa326c93 (diff)
downloadyoutube-dl-787c3604671283bd4945eefb87866d01fb973097.tar.gz
youtube-dl-787c3604671283bd4945eefb87866d01fb973097.tar.xz
youtube-dl-787c3604671283bd4945eefb87866d01fb973097.zip
[cbc:watch] Add support for authentication
-rw-r--r--youtube_dl/extractor/cbc.py36
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,