def create_session_id(self): try: if control.setting('tmdb.username') == '' or control.setting('tmdb.password') == '': control.notification(title='default', message=32683, icon='ERROR') return url = self.auth_base_link + '/token/new?api_key=%s' % API_key result = requests.get(url).json() # token = result.get('request_token').encode('utf-8') token = result.get('request_token') url2 = self.auth_base_link + '/token/validate_with_login?api_key=%s' % API_key username = control.setting('tmdb.username') password = control.setting('tmdb.password') post2 = {"username": "******" % username, "password": "******" % password, "request_token": "%s" % token} result2 = requests.post(url2, data=post2).json() url3 = self.auth_base_link + '/session/new?api_key=%s' % API_key post3 = {"request_token": "%s" % token} result3 = requests.post(url3, data=post3).json() if result3.get('success') is True: session_id = result3.get('session_id') msg = '%s' % ('username ='******'[CR]password ='******'[CR]token = ' + token + '[CR]confirm?') if control.yesnoDialog(msg): control.setSetting('tmdb.session_id', session_id) control.notification(title='default', message=32679, icon='default') else: control.notification(title='default', message=32680, icon='ERROR') except: log_utils.error()
def send_query(): resp = None if with_auth: try: expires_at = control.setting('trakt.expires') if time.time() > expires_at: self.refresh_token() except: pass token = control.setting('trakt.token') if token: headers['Authorization'] = 'Bearer ' + token try: if data is not None: resp = requests.post(self.api_endpoint % path, json=data, headers=headers, timeout=timeout) else: resp = requests.get(self.api_endpoint % path, headers=headers, timeout=timeout) except requests.exceptions.RequestException as e: error_notification('Trakt Error', str(e)) except Exception as e: error_notification('', str(e)) return resp
def getTMDb(): tmdb = {'tmdb': {}} tmdb['tmdb']['api_key'] = control.setting('tmdb.api.key') tmdb['tmdb']['username'] = control.setting('tmdb.username') tmdb['tmdb']['password'] = control.setting('tmdb.password') tmdb['tmdb']['session_id'] = control.setting('tmdb.session_id') return tmdb
def getTrakt(): trakt = {'trakt': {}} trakt['trakt']['token'] = control.setting('trakt.token') trakt['trakt']['username'] = control.setting('trakt.username') trakt['trakt']['refresh'] = control.setting('trakt.refresh') trakt['trakt']['expires'] = control.setting('trakt.expires') return trakt
def getRD(): rd = {'realdebrid': {}} rd['realdebrid']['token'] = control.setting('realdebrid.token') rd['realdebrid']['username'] = control.setting('realdebrid.username') rd['realdebrid']['client_id'] = control.setting('realdebrid.client_id') rd['realdebrid']['refresh'] = control.setting('realdebrid.refresh') rd['realdebrid']['secret'] = control.setting('realdebrid.secret') return rd
def __init__(self): self.token = control.setting('realdebrid.token') self.client_ID = control.setting('realdebrid.client_id') if self.client_ID == '': self.client_ID = 'X245A4XAIBGVM' self.secret = control.setting('realdebrid.secret') self.device_code = '' self.auth_timeout = 0 self.auth_step = 0
def revoke_session_id(self): try: if control.setting('tmdb.session_id') == '': return url = self.auth_base_link + '/session?api_key=%s' % API_key post = {"session_id": "%s" % control.setting('tmdb.session_id')} result = requests.delete(url, data=post).json() if result.get('success') is True: control.setSetting('tmdb.session_id', '') control.notification(title='default', message=32681, icon='default') else: control.notification(title='default', message=32682, icon='ERROR') except: log_utils.error()
def __init__(self): self.token = control.setting('premiumize.token') self.headers = { 'User-Agent': 'My Accounts for Kodi', 'Authorization': 'Bearer %s' % self.token } self.server_notifications = False
def revoke(self): data = {"token": control.setting('trakt.token')} try: self.call("oauth/revoke", data=data, with_auth=False) except: pass control.setSetting('trakt.username', '') control.setSetting('trakt.expires', '') control.setSetting('trakt.token', '') control.setSetting('trakt.refresh', '') control.dialog.ok(control.lang(32315), control.lang(32314))
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 getTVDb(): tvdb = {'tvdb': {}} tvdb_key_list = [ '06cff30690f9b9622957044f2159ffae', '1D62F2F90030C444', '7R8SZZX90UA9YMBU'] api_key = tvdb_key_list[int(control.setting('tvdb.api.key'))] tvdb['tvdb']['api_key'] = api_key return tvdb
def getTVDb(): tvdb = {'tvdb': {}} # keys must be .decode('base64') by addon to use tvdb_key_list = [ 'MDZjZmYzMDY5MGY5Yjk2MjI5NTcwNDRmMjE1OWZmYWU=', 'MUQ2MkYyRjkwMDMwQzQ0NA==', 'N1I4U1paWDkwVUE5WU1CVQ==' ] api_key = tvdb_key_list[int(control.setting('tvdb.api.key'))] tvdb['tvdb']['api_key'] = api_key return tvdb
def log(msg, caller=None, level=LOGNOTICE): debug_enabled = control.setting('debug.enabled') == 'true' if not debug_enabled: return debug_location = control.setting('debug.location') try: if caller is not None and level != LOGERROR: func = inspect.currentframe().f_back.f_code line_number = inspect.currentframe().f_back.f_lineno caller = "%s.%s()" % (caller, func.co_name) msg = 'From func name: %s Line # :%s\n msg : %s' % ( caller, line_number, msg) if caller is not None and level == LOGERROR: msg = 'From func name: %s.%s() Line # :%s\n msg : %s' % ( caller[0], caller[1], caller[2], msg) try: msg = msg.encode('ascii', errors='ignore').decode('ascii', errors='ignore') except: pass try: if isinstance(msg, py_tools.text_type): msg = '%s (ENCODED)' % (py_tools.ensure_str(msg, errors='replace')) except: pass if debug_location == '1': log_file = control.joinPath(LOGPATH, 'myaccounts.log') if not control.existsPath(log_file): f = open(log_file, 'w') f.close() with open(log_file, 'a') as f: line = '[%s %s] %s: %s' % ( datetime.now().date(), str(datetime.now().time())[:8], DEBUGPREFIX % debug_list[level], msg) f.write(line.rstrip('\r\n') + '\n') else: xbmc.log('%s: %s' % (DEBUGPREFIX % debug_list[level], msg, level)) except Exception as e: xbmc.log('log.log() Logging Failure: %s' % (e), LOGERROR)
def revoke(self): data = {"token": control.setting('trakt.token')} try: self.call("oauth/revoke", data=data, with_auth=False) except: pass control.setSetting('trakt.username', '') control.setSetting('trakt.expires', '') control.setSetting('trakt.token', '') control.setSetting('trakt.refresh', '') control.notification(title='default', message=40009, icon=trakt_icon)
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 log(msg, caller=None, level=LOGNOTICE): debug_enabled = control.setting('debug.enabled') == 'true' debug_log = control.setting('debug.location') if not debug_enabled: return try: if caller is not None and level == LOGDEBUG: func = inspect.currentframe().f_back.f_code line_number = inspect.currentframe().f_back.f_lineno caller = "%s.%s()" % (caller, func.co_name) msg = 'From func name: %s Line # :%s\n msg : %s' % ( caller, line_number, msg) if caller is not None and level == LOGERROR: msg = 'From func name: %s.%s() Line # :%s\n msg : %s' % ( caller[0], caller[1], caller[2], msg) if isinstance(msg, unicode): msg = '%s (ENCODED)' % (msg.encode('utf-8')) if debug_log == '1': log_file = control.joinPath(LOGPATH, 'myaccounts.log') if not control.existsPath(log_file): f = open(log_file, 'w') f.close() with open(log_file, 'a') as f: line = '[%s %s] %s: %s' % (datetime.now().date(), str(datetime.now().time())[:8], DEBUGPREFIX, msg) f.write(line.rstrip('\r\n') + '\n') else: print('%s: %s' % (DEBUGPREFIX, msg)) except Exception as e: import traceback traceback.print_exc() try: xbmc.log('Logging Failure: %s' % (e), level) except: pass
def withinRangeCheck(self, debrid_provider, days_remaining): if days_remaining < 15: try: current_notification_range = int(control.setting('%s.notification.range' % debrid_provider)) except: current_notification_range = 5 for index, day_range in enumerate(self.duration): if day_range[0] > days_remaining > day_range[1] and current_notification_range != index: control.setSetting('%s.notification.range' % debrid_provider, str(index)) return True return False else: control.setSetting('%s.notification.range' % debrid_provider, '') return False
def refresh_token(self): 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) if response: control.setSetting('trakt.token', response["access_token"]) control.setSetting('trakt.refresh', response["refresh_token"])
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
def run(self): from datetime import datetime from myaccounts.modules import alldebrid from myaccounts.modules import premiumize from myaccounts.modules import realdebrid xbmc.log( '[ script.module.myaccounts ] Debrid Account Expiry Notification Service Starting...', LOGNOTICE) self.duration = [(15, 10), (11, 7), (8, 4), (5, 2), (3, 0)] if control.setting('alldebrid.username') != '' and control.setting( 'alldebrid.expiry.notice') == 'true': account_info = alldebrid.AllDebrid().account_info()['user'] if account_info: if not account_info['isSubscribed']: # log_utils.log('AD account_info = %s' % account_info, log_utils.LOGNOTICE) expires = datetime.fromtimestamp( account_info['premiumUntil']) days_remaining = (expires - datetime.today()).days # int if self.withinRangeCheck('alldebrid', days_remaining): control.notification( message='AllDebrid Account expires in %s days' % days_remaining, icon=control.joinPath(control.artPath(), 'alldebrid.png')) if control.setting('premiumize.username') != '' and control.setting( 'premiumize.expiry.notice') == 'true': account_info = premiumize.Premiumize().account_info() if account_info: # log_utils.log('PM account_info = %s' % account_info, log_utils.LOGNOTICE) expires = datetime.fromtimestamp(account_info['premium_until']) days_remaining = (expires - datetime.today()).days # int if self.withinRangeCheck('premiumize', days_remaining): control.notification( message='Premiumize.me Account expires in %s days' % days_remaining, icon=control.joinPath(control.artPath(), 'premiumize.png')) if control.setting('realdebrid.username') != '' and control.setting( 'realdebrid.expiry.notice') == 'true': account_info = realdebrid.RealDebrid().account_info() if account_info: import time # log_utils.log('RD account_info = %s' % account_info, log_utils.LOGNOTICE) FormatDateTime = "%Y-%m-%dT%H:%M:%S.%fZ" try: expires = datetime.strptime(account_info['expiration'], FormatDateTime) except: expires = datetime(*(time.strptime( account_info['expiration'], FormatDateTime)[0:6])) days_remaining = (expires - datetime.today()).days # int if self.withinRangeCheck('realdebrid', days_remaining): control.notification( message='Real-Debrid Account expires in %s days' % days_remaining, icon=control.joinPath(control.artPath(), 'realdebrid.png'))
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) if response: 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', traktExpires) self.token = traktToken
def getGDrive(): gdrive = {'gdrive': {}} gdrive['gdrive']['url'] = control.setting('gdrive.cloudflare_url') return gdrive
def __init__(self): self.api_endpoint = 'https://api-v2launch.trakt.tv/%s' self.client_id = '1ff09b52d009f286be2d9bdfc0314c688319cbf931040d5f8847e7694a01de42' self.client_secret = '0c5134e5d15b57653fefed29d813bfbd58d73d51fb9bcd6442b5065f30c4d4dc' self.expires_at = control.setting('trakt.expires') self.token = control.setting('trakt.token')
def getIMDb(): imdb = {'imdb': {}} imdb['imdb']['user'] = control.setting('imdb.user') return imdb
My Accounts ''' from myaccounts.modules import control from myaccounts.modules import log_utils class AddonCheckUpdate: 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 if control.setting('general.checkAddonUpdates') == 'true': AddonCheckUpdate().run() xbmc.log('[ script.module.myaccounts ] Addon update check complete', xbmc.LOGNOTICE)
def getEasyNews(): easyNews = {'easyNews': {}} easyNews['easyNews']['username'] = control.setting('easynews.username') easyNews['easyNews']['password'] = control.setting('easynews.password') return easyNews
def getOrro(): ororo = {'ororo': {}} ororo['ororo']['email'] = control.setting('ororo.email') ororo['ororo']['password'] = control.setting('ororo.password') return ororo
def getFanart_tv(): fanart = {'fanart_tv': {}} fanart['fanart_tv']['api_key'] = control.setting('fanart.tv.api.key') return fanart
def getAD(): ad = {'alldebrid': {}} ad['alldebrid']['token'] = control.setting('alldebrid.token') ad['alldebrid']['username'] = control.setting('alldebrid.username') return ad
def getPM(): pm = {'premiumize': {}} pm['premiumize']['token'] = control.setting('premiumize.token') pm['premiumize']['username'] = control.setting('premiumize.username') return pm