def get_token(self): try: url = oauth_base_url + 'token' postData = { 'client_id': self.client_ID, 'client_secret': self.secret, 'code': self.device_code, 'grant_type': 'http://oauth.net/grant_type/device/1.0' } response = requests.post(url, data=postData).json() self.token = response['access_token'] control.sleep(1500) account_info = self.account_info() username = account_info['username'] control.setSetting('realdebrid.username', username) control.setSetting('realdebrid.client_id', self.client_ID) control.setSetting( 'realdebrid.secret', self.secret, ) control.setSetting('realdebrid.token', self.token) control.setSetting('realdebrid.refresh', response['refresh_token']) return True except Exception as e: log_utils.log('Real Debrid Authorization Failed: %s' % e, __name__, log_utils.LOGDEBUG) return False
def _post(self, url, data): original_url = url url = rest_base_url + url if self.token == '': log_utils.log('No Real Debrid Token Found', __name__, log_utils.LOGDEBUG) return None if '?' not in url: url += "?auth_token=%s" % self.token else: url += "&auth_token=%s" % self.token response = requests.post(url, data=data, timeout=15).text if 'bad_token' in response or 'Bad Request' in response: self.refresh_token() response = self._post(original_url, data) elif 'error' in response: response = json.loads(response) control.notification(title='default', message=response.get('error'), icon='default') return None try: return json.loads(response) except: return response
def get_device_token(self, device_codes): try: data = {"code": device_codes["device_code"], "client_id": self.client_id, "client_secret": self.client_secret} start = time.time() expires_in = device_codes['expires_in'] verification_url = control.lang(32513) % str(device_codes['verification_url']) user_code = control.lang(32514) % str(device_codes['user_code']) control.progressDialog.create(control.lang(32073), control.progress_line % (verification_url, user_code, '')) try: time_passed = 0 while not control.progressDialog.iscanceled() and time_passed < expires_in: try: response = self.call("oauth/device/token", data=data, with_auth=False, suppress_error_notification=True) except requests.HTTPError as e: log_utils.log('Request Error: %s' % str(e), __name__, log_utils.LOGDEBUG) if e.response.status_code != 400: raise e progress = int(100 * time_passed / expires_in) control.progressDialog.update(progress) control.sleep(max(device_codes['interval'], 1)*1000) else: if not response: continue else: return response time_passed = time.time() - start finally: control.progressDialog.close() return None except: log_utils.error()
def get_token(self): try: url = oauth_base_url + 'token' postData = {'client_id': self.client_ID, 'client_secret': self.secret, 'code': self.device_code, 'grant_type': 'http://oauth.net/grant_type/device/1.0'} response = requests.post(url, data=postData) # log_utils.log('Authorizing Real Debrid Result: | %s |' % response, level=log_utils.LOGDEBUG) if '[204]' in str(response): return False, str(response) if 'Temporarily Down For Maintenance' in response.text: control.notification(message='Real-Debrid Temporarily Down For Maintenance', icon=rd_icon) log_utils.log('Real-Debrid Temporarily Down For Maintenance', level=log_utils.LOGWARNING) return False, response.text else: response = response.json() if 'error' in str(response): log_utils.log('response=%s' % str(response), __name__) message = response.get('error') control.notification(message=message, icon=rd_icon) log_utils.log('Real-Debrid Error: %s' % message, level=log_utils.LOGWARNING) return False, response self.token = response['access_token'] control.sleep(500) account_info = self.account_info() username = account_info['username'] control.setSetting('realdebrid.username', username) control.setSetting('realdebrid.client_id', self.client_ID) control.setSetting('realdebrid.secret', self.secret,) control.setSetting('realdebrid.token', self.token) control.setSetting('realdebrid.refresh', response['refresh_token']) return True, None except: log_utils.error('Real Debrid Authorization Failed : ') return False, None
def _get(self, url, fail_check=False, token_ck=False): try: original_url = url url = rest_base_url + url if self.token == '': log_utils.log('No Real Debrid Token Found', __name__, log_utils.LOGDEBUG) return None # if not fail_check: # with fail_check=True new token does not get added if '?' not in url: url += "?auth_token=%s" % self.token else: url += "&auth_token=%s" % self.token response = requests.get(url, timeout=15).json() if 'bad_token' in str(response) or 'Bad Request' in str(response): if not fail_check: if self.refresh_token() and token_ck: return response = self._get(original_url, fail_check=True) return response except: log_utils.error() return None
def ensure_str(s, encoding='utf-8', errors='strict'): from myaccounts.modules import log_utils try: if not isinstance(s, (text_type, binary_type)): return log_utils.log("not expecting type '%s'" % type(s), __name__, log_utils.LOGDEBUG) if isPY2 and isinstance(s, text_type): s = s.encode(encoding, errors) elif isPY3 and isinstance(s, binary_type): s = s.decode(encoding, errors) return s except: log_utils.error() return s
def refresh_token(self): traktToken = None traktRefresh = None traktExpires = None data = { "client_id": self.client_id, "client_secret": self.client_secret, "redirect_uri": "urn:ietf:wg:oauth:2.0:oob", "grant_type": "refresh_token", "refresh_token": control.setting('trakt.refresh') } response = self.call("oauth/token", data=data, with_auth=False, return_str=True) try: code = str(response[1]) except: code = '' if code.startswith('5') or ( response and isinstance(response, py_tools.string_types) and '<html' in response ) or not response: # covers Maintenance html responses ["Bad Gateway", "We're sorry, but something went wrong (500)"]) log_utils.log('Temporary Trakt Server Problems', level=log_utils.LOGNOTICE) control.notification(title=32315, message=33676) return False elif response and code in ['423']: log_utils.log('Locked User Account - Contact Trakt Support: %s' % str(response[0]), level=log_utils.LOGWARNING) control.notification(title=32315, message=33675) return False if response and code not in ['401', '405']: try: response = response.json() except: log_utils.error() return False if 'error' in response and response['error'] == 'invalid_grant': log_utils.log('Please Re-Authorize your Trakt Account: %s' % response['error'], __name__, level=log_utils.LOGWARNING) control.notification(title=32315, message=33677) return False traktToken = response["access_token"] traktRefresh = response["refresh_token"] traktExpires = time.time() + 7776000 control.setSetting('trakt.token', traktToken) control.setSetting('trakt.refresh', traktRefresh) control.setSetting('trakt.expires', str(traktExpires)) self.token = traktToken
def run(self): log_utils.log('My Accounts checking available updates', log_utils.LOGNOTICE) try: import re import requests repo_xml = requests.get('https://raw.githubusercontent.com/a4k-openproject/repository.myaccounts/master/zips/addons.xml') if repo_xml.status_code != 200: log_utils.log('Could not connect to My Accounts repo XML, status: %s' % repo_xml.status_code, log_utils.LOGNOTICE) return repo_version = re.findall(r'<addon id=\"script.module.myaccounts\".*version=\"(\d*.\d*.\d*.\d*)\"', repo_xml.text)[0] local_version = control.addonVersion() if control.check_version_numbers(local_version, repo_version): while control.condVisibility('Library.IsScanningVideo'): control.sleep(10000) log_utils.log('A newer version of My Accounts is available. Installed Version: v%s, Repo Version: v%s' % (local_version, repo_version), log_utils.LOGNOTICE) control.notification(title = 'default', message = 'A new verison of My Accounts is available from the repository. Please consider updating to v%s' % repo_version, icon = 'default', time=5000, sound=False) except: log_utils.error() pass
def refresh_token(self): try: self.client_ID = control.setting('realdebrid.client_id') self.secret = control.setting('realdebrid.secret') self.device_code = control.setting('realdebrid.refresh') log_utils.log( 'Refreshing Expired Real Debrid Token: |%s|%s|' % (self.client_ID, self.device_code), __name__, log_utils.LOGDEBUG) if not self.get_token(): self.revoke() log_utils.log('Unable to Refresh Real Debrid Token', __name__, log_utils.LOGDEBUG) else: log_utils.log('Real Debrid Token Successfully Refreshed', __name__, log_utils.LOGDEBUG) return True except: log_utils.error() return False
def refresh_token(self): try: self.client_ID = control.setting('realdebrid.client_id') self.secret = control.setting('realdebrid.secret') self.device_code = control.setting('realdebrid.refresh') if not self.client_ID or not self.secret or not self.device_code: return False # avoid if previous refresh attempt revoked accnt, loops twice. log_utils.log('Refreshing Expired Real Debrid Token: | %s | %s |' % (self.client_ID, self.device_code), __name__, log_utils.LOGDEBUG) success, error = self.get_token() if not success: if not 'Temporarily Down For Maintenance' in error: if any(value == error.get('error_code') for value in [9, 12, 13, 14]): self.revoke() # empty all auth settings to force a re-auth on next use control.notification(message='Real-Debrid Auth revoked due to: %s' % error.get('error'), icon=rd_icon) log_utils.log('Unable to Refresh Real Debrid Token: %s' % error.get('error'), level=log_utils.LOGWARNING) return False else: log_utils.log('Real Debrid Token Successfully Refreshed', level=log_utils.LOGDEBUG) return True except: log_utils.error() return False