From 36eec828383724d8196a66eecfa124c198d32bc3 Mon Sep 17 00:00:00 2001 From: JinRonin Date: Mon, 1 Jan 2018 09:29:44 +0100 Subject: [plugin.video.dazn] 1.0.6 --- plugin.video.dazn/resources/lib/client.py | 203 ++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 plugin.video.dazn/resources/lib/client.py (limited to 'plugin.video.dazn/resources/lib/client.py') diff --git a/plugin.video.dazn/resources/lib/client.py b/plugin.video.dazn/resources/lib/client.py new file mode 100644 index 0000000..b09521e --- /dev/null +++ b/plugin.video.dazn/resources/lib/client.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- + +import simple_requests as requests + +class Client: + + def __init__(self, plugin): + self.plugin = plugin + + self.DEVICE_ID = self.plugin.get_setting('device_id') + self.TOKEN = self.plugin.get_setting('token') + self.COUNTRY = self.plugin.get_setting('country') + self.LANGUAGE = self.plugin.get_setting('language') + self.POST_DATA = {} + self.ERRORS = 0 + + self.HEADERS = { + 'Content-Type': 'application/json', + 'Referer': self.plugin.api_base + } + + self.PARAMS = { + '$format': 'json' + } + + self.STARTUP = self.plugin.api_base + 'v2/Startup' + self.RAIL = self.plugin.api_base + 'v2/Rail' + self.RAILS = self.plugin.api_base + 'v3/Rails' + self.EPG = self.plugin.api_base + 'v1/Epg' + self.EVENT = self.plugin.api_base + 'v2/Event' + self.PLAYBACK = self.plugin.api_base + 'v1/Playback' + self.SIGNIN = self.plugin.api_base + 'v3/SignIn' + self.SIGNOUT = self.plugin.api_base + 'v1/SignOut' + self.REFRESH = self.plugin.api_base + 'v3/RefreshAccessToken' + self.PROFILE = self.plugin.api_base + 'v1/UserProfile' + + def content_data(self, url): + data = self.request(url) + if data.get('odata.error', None): + self.errorHandler(data) + return data + + def rails(self, id_, params=''): + self.PARAMS['groupId'] = id_ + self.PARAMS['params'] = params + return self.content_data(self.RAILS) + + def rail(self, id_, params=''): + self.PARAMS['id'] = id_ + self.PARAMS['params'] = params + return self.content_data(self.RAIL) + + def epg(self, params): + self.PARAMS['date'] = params + return self.content_data(self.EPG) + + def event(self, id_): + self.PARAMS['Id'] = id_ + return self.content_data(self.EVENT) + + def playback_data(self, id_): + self.POST_DATA = { + 'AssetId': id_, + 'Format': 'MPEG-DASH', + 'PlayerId': 'DAZN-' + self.DEVICE_ID, + 'Secure': 'true', + 'PlayReadyInitiator': 'false', + 'BadManifests': [], + 'LanguageCode': self.LANGUAGE, + } + return self.request(self.PLAYBACK) + + def playback(self, id_): + data = self.playback_data(id_) + if data.get('odata.error', None): + self.errorHandler(data) + if self.TOKEN: + data = self.playback_data(id_) + return data + + def userProfile(self): + data = self.request(self.PROFILE) + if data.get('odata.error', None): + self.errorHandler(data) + else: + self.plugin.set_setting('viewer_id', data['ViewerId']) + + def setToken(self, auth, result): + self.plugin.log('[{0}] signin: {1}'.format(self.plugin.addon_id, result)) + if auth and result == 'SignedIn': + self.TOKEN = auth['Token'] + else: + if result == 'HardOffer': + self.plugin.dialog_ok(30161) + self.signOut() + self.plugin.set_setting('token', self.TOKEN) + + def signIn(self): + credentials = self.plugin.get_credentials() + if credentials: + self.POST_DATA = { + 'Email': credentials['email'], + 'Password': credentials['password'], + 'DeviceId': self.DEVICE_ID, + 'Platform': 'web' + } + data = self.request(self.SIGNIN) + if data.get('odata.error', None): + self.errorHandler(data) + else: + self.setToken(data['AuthToken'], data.get('Result', 'SignInError')) + self.userProfile() + else: + self.plugin.dialog_ok(30004) + + def signOut(self): + self.POST_DATA = { + 'DeviceId': self.DEVICE_ID + } + r = self.request(self.SIGNOUT) + self.TOKEN = '' + self.plugin.set_setting('token', self.TOKEN) + + def refreshToken(self): + self.POST_DATA = { + 'DeviceId': self.DEVICE_ID + } + data = self.request(self.REFRESH) + if data.get('odata.error', None): + self.signOut() + self.errorHandler(data) + else: + self.setToken(data['AuthToken'], data.get('Result', 'RefreshAccessTokenError')) + + def startUp(self, device_id=''): + kodi_language = self.plugin.get_language() + if device_id != '': + self.DEVICE_ID = device_id + self.POST_DATA = { + 'LandingPageKey': 'generic', + 'Languages': '{0}, {1}'.format(kodi_language, self.LANGUAGE), + 'Platform': 'web', + 'Manufacturer': '', + 'PromoCode': '' + } + data = self.request(self.STARTUP) + region = data.get('Region', {}) + if region.get('isAllowed', False): + self.COUNTRY = region['Country'] + self.LANGUAGE = region['Language'] + languages = data['SupportedLanguages'] + for i in languages: + if i == kodi_language: + self.LANGUAGE = i + break + self.plugin.set_setting('language', self.LANGUAGE) + self.plugin.set_setting('country', self.COUNTRY) + if self.TOKEN: + self.refreshToken() + else: + self.signIn() + else: + self.TOKEN = '' + self.plugin.dialog_ok(30101) + + def request(self, url): + self.HEADERS['Authorization'] = 'Bearer ' + self.TOKEN + self.PARAMS['LanguageCode'] = self.LANGUAGE + self.PARAMS['Country'] = self.COUNTRY + + if self.POST_DATA: + r = requests.post(url, headers=self.HEADERS, data=self.POST_DATA, params=self.PARAMS) + self.POST_DATA = {} + else: + r = requests.get(url, headers=self.HEADERS, params=self.PARAMS) + + if r.headers.get('content-type', '').startswith('application/json'): + return r.json() + else: + if not r.status_code == 204: + self.plugin.log('[{0}] error: {1} ({2}, {3})'.format(self.plugin.addon_id, url, str(r.status_code), r.headers.get('content-type', ''))) + return {} + + def errorHandler(self, data): + self.ERRORS += 1 + msg = data['odata.error']['message']['value'] + code = str(data['odata.error']['code']) + self.plugin.log('[{0}] version: {1} country: {2} language: {3}'.format(self.plugin.addon_id, self.plugin.addon_version, self.COUNTRY, self.LANGUAGE)) + self.plugin.log('[{0}] error: {1} ({2})'.format(self.plugin.addon_id, msg, code)) + if code == '10000' and self.ERRORS < 3: + self.refreshToken() + elif (code == '401' or code == '10033') and self.ERRORS < 3: + self.signIn() + elif code == '7': + self.plugin.dialog_ok(30107) + elif code == '3001': + self.startUp() + elif code == '10006': + self.plugin.dialog_ok(30101) + elif code == '10008': + self.plugin.dialog_ok(30108) + elif code == '10049': + self.plugin.dialog_ok(30151) -- cgit v1.2.3