def use_inputstream_adaptive(): if kodi.get_setting('video_quality_ia') == 'true' or kodi.get_setting('video_quality') == '3': if kodi.get_setting('video_support_ia_builtin') == 'true': return True elif kodi.get_setting('video_support_ia_addon') == 'true': use_ia = kodi.get_setting('video_quality_ia') == 'true' or kodi.get_setting('video_quality') == '3' if not use_ia: return False ia_enabled = kodi.addon_enabled('inputstream.adaptive') if ia_enabled is False: if kodi.Dialog().yesno(kodi.get_name(), i18n('adaptive_is_disabled')): ia_enabled = kodi.set_addon_enabled('inputstream.adaptive') if ia_enabled: ia_min_version = '2.0.10' ia_version = kodi.Addon('inputstream.adaptive').getAddonInfo('version') ia_enabled = loose_version(ia_version) >= loose_version(ia_min_version) if not ia_enabled: result = kodi.Dialog().ok(kodi.get_name(), i18n('adaptive_version_check') % ia_min_version) if not ia_enabled: kodi.set_setting('video_quality_ia', 'false') kodi.set_setting('video_quality', '0') return False else: return True else: kodi.set_setting('video_quality_ia', 'false') kodi.set_setting('video_quality', '0') return False else: return False
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 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 get_oauth_token(token_only=True, required=False): oauth_token = kodi.get_setting('oauth_token') if not oauth_token or not oauth_token.strip(): if not required: return '' kodi.notify(kodi.get_name(), i18n('token_required'), sound=False) kodi.show_settings() oauth_token = kodi.get_setting('oauth_token') stripped_token = oauth_token.strip() if oauth_token != stripped_token: oauth_token = stripped_token kodi.set_setting('oauth_token', oauth_token) if oauth_token: if token_only: idx = oauth_token.find(':') if idx >= 0: oauth_token = oauth_token[idx + 1:] else: if not oauth_token.lower().startswith('oauth:'): idx = oauth_token.find(':') if idx >= 0: oauth_token = oauth_token[idx + 1:] oauth_token = 'oauth:{0}'.format(oauth_token) return oauth_token.decode('utf-8')
def get_oauth_token(token_only=True, required=False): oauth_token = kodi.get_setting('oauth_token') if not oauth_token or not oauth_token.strip(): if not required: return '' kodi.notify(kodi.get_name(), i18n('token_required'), sound=False) kodi.show_settings() oauth_token = kodi.get_setting('oauth_token') stripped_token = oauth_token.strip() if oauth_token != stripped_token: oauth_token = stripped_token kodi.set_setting('oauth_token', oauth_token) if oauth_token: if token_only: idx = oauth_token.find(':') if idx >= 0: oauth_token = oauth_token[idx + 1:] else: if not oauth_token.lower().startswith('oauth:'): idx = oauth_token.find(':') if idx >= 0: oauth_token = oauth_token[idx + 1:] oauth_token = 'oauth:{0}'.format(oauth_token) return oauth_token.decode('utf-8')
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 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()