def wrapper(*args, **kwargs): try: result = func(*args, **kwargs) return result except ResourceUnavailableException as error: log_utils.log('Connection failed |{0}|'.format(error.message), log_utils.LOGERROR) kodi.notify(i18n('connection_failed'), error.message, duration=7000, sound=False) except SubRequired as error: log_utils.log('Requires subscription to |{0}|'.format(error.message), log_utils.LOGDEBUG) kodi.notify(kodi.get_name(), i18n('subscription_required') % error.message, duration=5000, sound=False) except NotFound as error: log_utils.log('Not found |{0}|'.format(error.message), log_utils.LOGDEBUG) kodi.notify(kodi.get_name(), i18n('none_found') % error.message.lower(), duration=5000, sound=False) except PlaybackFailed as error: log_utils.log('Playback Failed |{0}|'.format(error.message), log_utils.LOGDEBUG) kodi.notify(kodi.get_name(), i18n('playback_failed'), duration=5000, sound=False) except TwitchException as error: _error = '' try: _message = error.message _error = _message['error'] message = '[{0}] {1}'.format(_message['status'], _message['message']) except: message = error.message log_utils.log('Error |{0}| |{1}|'.format(_error, message.strip()), log_utils.LOGERROR) kodi.notify(_error if _error else i18n('error'), message.strip(), duration=7000, sound=False)
def onPlayBackStarted(self): twitch_host_matches = ['jtvnw.', 'ttvnw.', 'twitch.tv'] is_playing = self.window.getProperty(key=self.player_keys['twitch_playing']) == 'True' seek_time = self.window.getProperty(key=self.seek_keys['seek_time']) if is_playing: is_playing = any(host_match in self.getPlayingFile() for host_match in twitch_host_matches) log_utils.log('Player: |onPlayBackStarted| isTwitch |{0}| SeekTime |{1}|'.format(is_playing, seek_time), log_utils.LOGDEBUG) if not is_playing: self.reset() else: if seek_time: seek_time = float(seek_time) self.seekTime(seek_time)
def onPlayBackStarted(self): twitch_host_matches = ['jtvnw.', 'ttvnw.', 'twitch.tv'] is_playing = self.window.getProperty(key=self.player_keys['twitch_playing']) == 'True' seek_time = self.window.getProperty(key=self.seek_keys['seek_time']) if is_playing: is_playing = any(host_match in self.getPlayingFile() for host_match in twitch_host_matches) log_utils.log('Player: |onPlayBackStarted| isTwitch |{0}| SeekTime |{1}|'.format(is_playing, seek_time), log_utils.LOGDEBUG) if not is_playing: self.reset() else: if seek_time: seek_time = float(seek_time) self.seekTime(seek_time)
def wrapper(*args, **kwargs): try: result = func(*args, **kwargs) return result except ResourceUnavailableException as error: log_utils.log('Connection failed |{0}|'.format(error.message), log_utils.LOGERROR) kodi.notify(i18n('connection_failed'), error.message, duration=7000, sound=False) except SubRequired as error: log_utils.log( 'Requires subscription to |{0}|'.format(error.message), log_utils.LOGDEBUG) kodi.notify(kodi.get_name(), i18n('subscription_required') % error.message, duration=5000, sound=False) except NotFound as error: log_utils.log('Not found |{0}|'.format(error.message), log_utils.LOGDEBUG) kodi.notify(kodi.get_name(), i18n('none_found') % error.message.lower(), duration=5000, sound=False) except PlaybackFailed as error: log_utils.log('Playback Failed |{0}|'.format(error.message), log_utils.LOGDEBUG) kodi.notify(kodi.get_name(), i18n('playback_failed'), duration=5000, sound=False) except TwitchException as error: _error = '' try: _message = error.message _error = _message['error'] message = '[{0}] {1}'.format(_message['status'], _message['message']) except: message = error.message log_utils.log('Error |{0}| |{1}|'.format(_error, message.strip()), log_utils.LOGERROR) kodi.notify(_error if _error else i18n('error'), message.strip(), duration=7000, sound=False)
def googl_url(url): post_url = 'https://www.googleapis.com/urlshortener/v1/url?key=%s' % b64decode(__key) data = {'longUrl': url} headers = {'content-type': 'application/json'} request = requests.post(post_url, data=json.dumps(data), headers=headers) json_data = request.json() if 'id' in json_data: return json_data['id'] else: if 'error' in json_data: if 'errors' in json_data['error']: errors = '' for err in json_data['error']['errors']: errors += '%s |%s| ' % (err['message'], err['reason']) log_utils.log('Error: %s' % errors, log_utils.LOGERROR) else: log_utils.log('Error: %s |%s|' % (json_data['error']['code'], json_data['error']['message']), log_utils.LOGERROR) return None
def wrapper(*args, **kwargs): try: result = func(*args, **kwargs) logging_result = copy.deepcopy(result) try: if u'email' in logging_result: logging_result[u'email'] = '*****@*****.**' if u'token' in logging_result: if u'client_id' in logging_result[u'token']: logging_result[u'token'][u'client_id'] = logging_result[u'token'][u'client_id'][:4] + \ ('*' * (len(logging_result[u'token'][u'client_id']) - 8)) + \ logging_result[u'token'][u'client_id'][(len(logging_result[u'token'][u'client_id']) - 4):] logging_result = json.dumps(logging_result, indent=4) except: pass log_utils.log(logging_result, log_utils.LOGDEBUG) return result except: raise
def wrapper(*args, **kwargs): try: result = func(*args, **kwargs) logging_result = copy.deepcopy(result) try: if u'email' in logging_result: logging_result[u'email'] = '*****@*****.**' if u'token' in logging_result: if u'client_id' in logging_result[u'token']: logging_result[u'token'][u'client_id'] = logging_result[u'token'][u'client_id'][:4] + \ ('*' * (len(logging_result[u'token'][u'client_id']) - 8)) + \ logging_result[u'token'][u'client_id'][(len(logging_result[u'token'][u'client_id']) - 4):] logging_result = json.dumps(logging_result, indent=4) except: pass log_utils.log(logging_result, log_utils.LOGDEBUG) return result except: raise
def googl_url(url): post_url = 'https://www.googleapis.com/urlshortener/v1/url?key=%s' % b64decode( __key) data = {'longUrl': url} headers = {'content-type': 'application/json'} request = requests.post(post_url, data=json.dumps(data), headers=headers) json_data = request.json() if 'id' in json_data: return json_data['id'] else: if 'error' in json_data: if 'errors' in json_data['error']: errors = '' for err in json_data['error']['errors']: errors += '%s |%s| ' % (err['message'], err['reason']) log_utils.log('Error: %s' % errors, log_utils.LOGERROR) else: log_utils.log( 'Error: %s |%s|' % (json_data['error']['code'], json_data['error']['message']), log_utils.LOGERROR) return None
def valid_token(self, client_id, token, scopes): # client_id, token used for unique caching only token_check = self.root() while True: if not token_check['token']['valid']: result = kodi.Dialog().ok(heading=i18n('oauth_token'), line1=i18n('invalid_token'), line2=i18n('get_new_oauth_token') % (i18n('settings'), i18n('login'), i18n('get_oauth_token'))) log_utils.log('Error: Current OAuth token is invalid.', log_utils.LOGERROR) return False else: if token_check['token']['client_id'] == self.client_id: if token_check['token']['authorization']: token_scopes = token_check['token']['authorization']['scopes'] missing_scopes = [value for value in scopes if value not in token_scopes] if len(missing_scopes) > 0: result = kodi.Dialog().ok(heading=i18n('oauth_token'), line1=i18n('missing_scopes') % missing_scopes, line2=i18n('get_new_oauth_token') % (i18n('settings'), i18n('login'), i18n('get_oauth_token'))) log_utils.log('Error: Current OAuth token is missing required scopes |%s|' % missing_scopes, log_utils.LOGERROR) return False else: return True else: return False else: matches_default = token_check['token']['client_id'] == utils.get_client_id(default=True) message = 'Token created using default Client-ID |%s|' % str(matches_default) log_utils.log('Error: OAuth Client-ID mismatch: %s' % message, log_utils.LOGERROR) if matches_default: result = kodi.Dialog().ok(heading=i18n('oauth_token'), line1=i18n('client_id_mismatch'), line2=i18n('ok_to_resolve')) utils.clear_client_id() self.client_id = utils.get_client_id(default=True) self.queries.CLIENT_ID = self.client_id self.client = oauth.MobileClient(self.client_id) else: result = kodi.Dialog().ok(heading=i18n('oauth_token'), line1=i18n('client_id_mismatch'), line2=i18n('get_new_oauth_token') % (i18n('settings'), i18n('login'), i18n('get_oauth_token'))) return False
def onPlayBackEnded(self): is_playing = self.window.getProperty( key=self.player_keys['twitch_playing']) == 'True' log_utils.log( 'Player: |onPlayBackEnded| isTwitch |{0}|'.format(is_playing), log_utils.LOGDEBUG) need_reset = True if is_playing: reconnect = kodi.get_setting('live_reconnect') == 'true' if reconnect: live_channel = self.window.getProperty( self.reconnect_keys['stream']) if live_channel: channel_id, name, display_name = live_channel.split(',') retries = 0 max_retries = 5 while not monitor.abortRequested(): if monitor.waitForAbort(5): break break if monitor.abortRequested(): dialog = None else: dialog = kodi.ProgressDialog( kodi.get_name(), line1=utils.i18n('attempt_reconnect') % display_name, line2=utils.i18n('attempt_number') % (retries + 1), line3=utils.i18n('retry_seconds') % 60) if dialog: need_reset = False with dialog: while (not monitor.abortRequested()) and ( retries < max_retries) and ( not dialog.is_canceled()): wait_time = 0.0 abort = False while wait_time <= 120.0: if monitor.waitForAbort( 0.5) or dialog.is_canceled(): abort = True break wait_time += 1.0 if (wait_time % 2) == 0: percent = int( ((wait_time / 120) * 100)) dialog.update( percent=percent, line3=utils.i18n('retry_seconds') % ((120.0 - wait_time) / 2)) if abort: break retries += 1 try: try: cache.reset_cache() except: pass twitch = api.Twitch() quality = utils.get_default_quality( 'stream', channel_id) if quality: quality = quality[channel_id][ 'quality'] videos = twitch.get_live(name) result = twitch.get_channel_stream( channel_id)[Keys.STREAM] item_dict = converter.stream_to_playitem( result) video = converter.get_video_for_quality( videos, ask=False, quality=quality) if video: log_utils.log( 'Attempting playback using quality |%s| @ |%s|' % (video['name'], video['url']), log_utils.LOGDEBUG) item_dict['path'] = video['url'] playback_item = kodi.create_item( item_dict, add=False) stream_name = result[Keys.CHANNEL][Keys.DISPLAY_NAME] \ if result[Keys.CHANNEL][Keys.DISPLAY_NAME] else result[Keys.CHANNEL][Keys.NAME] self.window.setProperty( self.reconnect_keys['stream'], '{0},{1},{2}'.format( channel_id, name, stream_name)) self.play(item_dict['path'], playback_item) if utils.irc_enabled( ) and twitch.access_token: username = twitch.get_username() if username: utils.exec_irc_script( username, name) break except: log_utils.log( 'Player: |Reconnection| Failed attempt |{0}|' .format(retries), log_utils.LOGERROR) dialog.update( 0, line2=utils.i18n('attempt_number') % (retries + 1), line3=utils.i18n('retry_seconds') % 60) if dialog.is_canceled(): self.reset() if need_reset: self.reset()
def onPlayBackStopped(self): log_utils.log('Player: |onPlayBackStopped|', log_utils.LOGDEBUG) self.reset()
def __init__(self, *args, **kwargs): log_utils.log('Player: Start', log_utils.LOGDEBUG) self.reset()
def valid_token(self, client_id, token, scopes): # client_id, token used for unique caching only token_check = self.root() while True: if not token_check['token']['valid']: result = kodi.Dialog().ok( heading=i18n('oauth_token'), line1=i18n('invalid_token'), line2=i18n('get_new_oauth_token') % (i18n('settings'), i18n('login'), i18n('get_oauth_token'))) log_utils.log('Error: Current OAuth token is invalid.', log_utils.LOGERROR) return False else: if token_check['token']['client_id'] == self.client_id: if token_check['token']['authorization']: token_scopes = token_check['token']['authorization'][ 'scopes'] missing_scopes = [ value for value in scopes if value not in token_scopes ] if len(missing_scopes) > 0: result = kodi.Dialog().ok( heading=i18n('oauth_token'), line1=i18n('missing_scopes') % missing_scopes, line2=i18n('get_new_oauth_token') % (i18n('settings'), i18n('login'), i18n('get_oauth_token'))) log_utils.log( 'Error: Current OAuth token is missing required scopes |%s|' % missing_scopes, log_utils.LOGERROR) return False else: return True else: return False else: matches_default = token_check['token'][ 'client_id'] == utils.get_client_id(default=True) message = 'Token created using default Client-ID |%s|' % str( matches_default) log_utils.log( 'Error: OAuth Client-ID mismatch: %s' % message, log_utils.LOGERROR) if matches_default: result = kodi.Dialog().ok( heading=i18n('oauth_token'), line1=i18n('client_id_mismatch'), line2=i18n('ok_to_resolve')) utils.clear_client_id() self.client_id = utils.get_client_id(default=True) self.queries.CLIENT_ID = self.client_id self.client = oauth.MobileClient(self.client_id) else: result = kodi.Dialog().ok( heading=i18n('oauth_token'), line1=i18n('client_id_mismatch'), line2=i18n('get_new_oauth_token') % (i18n('settings'), i18n('login'), i18n('get_oauth_token'))) return False
def onPlayBackEnded(self): is_playing = self.window.getProperty(key=self.player_keys['twitch_playing']) == 'True' log_utils.log('Player: |onPlayBackEnded| isTwitch |{0}|'.format(is_playing), log_utils.LOGDEBUG) need_reset = True if is_playing: reconnect = kodi.get_setting('live_reconnect') == 'true' if reconnect: live_channel = self.window.getProperty(self.reconnect_keys['stream']) if live_channel: channel_id, name, display_name, quality = live_channel.split(',') retries = 0 max_retries = 5 while not monitor.abortRequested(): if monitor.waitForAbort(5): break break if monitor.abortRequested(): dialog = None else: dialog = kodi.ProgressDialog(kodi.get_name(), line1=utils.i18n('attempt_reconnect') % display_name, line2=utils.i18n('attempt_number') % (retries + 1), line3=utils.i18n('retry_seconds') % 60) if dialog: need_reset = False with dialog: while (not monitor.abortRequested()) and (retries < max_retries) and (not dialog.is_canceled()): wait_time = 0.0 abort = False while wait_time <= 120.0: if monitor.waitForAbort(0.5) or dialog.is_canceled(): abort = True break wait_time += 1.0 if (wait_time % 2) == 0: percent = int(((wait_time / 120) * 100)) dialog.update(percent=percent, line3=utils.i18n('retry_seconds') % ((120.0 - wait_time) / 2)) if abort: break retries += 1 try: try: cache.reset_cache() except: pass twitch = api.Twitch() videos = twitch.get_live(name) result = twitch.get_channel_stream(channel_id)[Keys.STREAM] item_dict = converter.stream_to_playitem(result) video = converter.get_video_for_quality(videos, ask=False, quality=quality) if video: log_utils.log('Attempting playback using quality |%s| @ |%s|' % (video['name'], video['url']), log_utils.LOGDEBUG) item_dict['path'] = video['url'] playback_item = kodi.create_item(item_dict, add=False) stream_name = result[Keys.CHANNEL][Keys.DISPLAY_NAME] \ if result[Keys.CHANNEL][Keys.DISPLAY_NAME] else result[Keys.CHANNEL][Keys.NAME] self.window.setProperty(self.reconnect_keys['stream'], '{0},{1},{2}'.format(channel_id, name, stream_name)) self.play(item_dict['path'], playback_item) if utils.irc_enabled() and twitch.access_token: username = twitch.get_username() if username: utils.exec_irc_script(username, name) break except: log_utils.log('Player: |Reconnection| Failed attempt |{0}|'.format(retries), log_utils.LOGERROR) dialog.update(0, line2=utils.i18n('attempt_number') % (retries + 1), line3=utils.i18n('retry_seconds') % 60) if dialog.is_canceled(): self.reset() if need_reset: self.reset()
def onPlayBackStopped(self): log_utils.log('Player: |onPlayBackStopped|', log_utils.LOGDEBUG) self.reset()
def __init__(self, *args, **kwargs): log_utils.log('Player: Start', log_utils.LOGDEBUG) self.reset()