[cbc:watch] Re-acquire device token when expired (closes #16160)

This commit is contained in:
Sergey M․ 2018-04-11 23:28:55 +07:00
parent d783aee56a
commit 64f03e5b4c
No known key found for this signature in database
GPG Key ID: 2C393E0F18A9236D

View File

@ -5,7 +5,10 @@ import json
import re import re
from .common import InfoExtractor from .common import InfoExtractor
from ..compat import compat_str from ..compat import (
compat_str,
compat_HTTPError,
)
from ..utils import ( from ..utils import (
js_to_json, js_to_json,
smuggle_url, smuggle_url,
@ -206,23 +209,41 @@ class CBCWatchBaseIE(InfoExtractor):
def _call_api(self, path, video_id): def _call_api(self, path, video_id):
url = path if path.startswith('http') else self._API_BASE_URL + path url = path if path.startswith('http') else self._API_BASE_URL + path
for _ in range(2):
try:
result = self._download_xml(url, video_id, headers={ result = self._download_xml(url, video_id, headers={
'X-Clearleap-DeviceId': self._device_id, 'X-Clearleap-DeviceId': self._device_id,
'X-Clearleap-DeviceToken': self._device_token, 'X-Clearleap-DeviceToken': self._device_token,
}) })
except ExtractorError as e:
if isinstance(e.cause, compat_HTTPError) and e.cause.code == 401:
# Device token has expired, re-acquiring device token
self._register_device()
continue
raise
error_message = xpath_text(result, 'userMessage') or xpath_text(result, 'systemMessage') error_message = xpath_text(result, 'userMessage') or xpath_text(result, 'systemMessage')
if error_message: if error_message:
raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message)) raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message))
return result return result
def _real_initialize(self): def _real_initialize(self):
if not self._device_id or not self._device_token: if self._valid_device_token():
return
device = self._downloader.cache.load('cbcwatch', 'device') or {} device = self._downloader.cache.load('cbcwatch', 'device') or {}
self._device_id, self._device_token = device.get('id'), device.get('token') self._device_id, self._device_token = device.get('id'), device.get('token')
if not self._device_id or not self._device_token: if self._valid_device_token():
return
self._register_device()
def _valid_device_token(self):
return self._device_id and self._device_token
def _register_device(self):
self._device_id = self._device_token = None
result = self._download_xml( result = self._download_xml(
self._API_BASE_URL + 'device/register', self._API_BASE_URL + 'device/register',
None, data=b'<device><type>web</type></device>') None, 'Acquiring device token',
data=b'<device><type>web</type></device>')
self._device_id = xpath_text(result, 'deviceId', fatal=True) self._device_id = xpath_text(result, 'deviceId', fatal=True)
self._device_token = xpath_text(result, 'deviceToken', fatal=True) self._device_token = xpath_text(result, 'deviceToken', fatal=True)
self._downloader.cache.store( self._downloader.cache.store(