[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,30 +209,48 @@ 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
result = self._download_xml(url, video_id, headers={ for _ in range(2):
'X-Clearleap-DeviceId': self._device_id, try:
'X-Clearleap-DeviceToken': self._device_token, result = self._download_xml(url, video_id, headers={
}) 'X-Clearleap-DeviceId': self._device_id,
'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():
device = self._downloader.cache.load('cbcwatch', 'device') or {} return
self._device_id, self._device_token = device.get('id'), device.get('token') device = self._downloader.cache.load('cbcwatch', 'device') or {}
if not self._device_id or not self._device_token: self._device_id, self._device_token = device.get('id'), device.get('token')
result = self._download_xml( if self._valid_device_token():
self._API_BASE_URL + 'device/register', return
None, data=b'<device><type>web</type></device>') self._register_device()
self._device_id = xpath_text(result, 'deviceId', fatal=True)
self._device_token = xpath_text(result, 'deviceToken', fatal=True) def _valid_device_token(self):
self._downloader.cache.store( return self._device_id and self._device_token
'cbcwatch', 'device', {
'id': self._device_id, def _register_device(self):
'token': self._device_token, 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)
self._downloader.cache.store(
'cbcwatch', 'device', {
'id': self._device_id,
'token': self._device_token,
})
def _parse_rss_feed(self, rss): def _parse_rss_feed(self, rss):
channel = xpath_element(rss, 'channel', fatal=True) channel = xpath_element(rss, 'channel', fatal=True)