def chooseServer(): """ Lets user choose from list of PMS """ log.info("Choosing PMS server requested, starting") import initialsetup setup = initialsetup.InitialSetup() server = setup.pick_pms(showDialog=True) if server is None: log.error('We did not connect to a new PMS, aborting') plex_command('SUSPEND_USER_CLIENT', 'False') plex_command('SUSPEND_LIBRARY_THREAD', 'False') return log.info("User chose server %s" % server['name']) setup.write_pms_to_settings(server) if not __LogOut(): return from utils import wipe_database # Wipe Kodi and Plex database as well as playlists and video nodes wipe_database() # Log in again __LogIn() log.info("Choosing new PMS complete") # '<PMS> connected' dialog('notification', lang(29999), '%s %s' % (server['name'], lang(39220)), icon='{plex}', time=3000, sound=False)
def togglePlexTV(): if settings('plexToken'): log.info('Reseting plex.tv credentials in settings') settings('plexLogin', value="") settings('plexToken', value=""), settings('plexid', value="") settings('plexHomeSize', value="1") settings('plexAvatar', value="") settings('plex_status', value="Not logged in to plex.tv") window('plex_token', clear=True) window('plex_username', clear=True) else: log.info('Login to plex.tv') import initialsetup initialsetup.InitialSetup().PlexTVSignIn() dialog('notification', lang(29999), lang(39221), icon='{plex}', time=3000, sound=False)
def togglePlexTV(): if settings('plexToken'): log.info('Reseting plex.tv credentials in settings') settings('plexLogin', value="") settings('plexToken', value="") settings('plexid', value="") settings('plexHomeSize', value="1") settings('plexAvatar', value="") settings('plex_status', value=lang(39226)) window('plex_token', clear=True) plex_command('PLEX_TOKEN', '') plex_command('PLEX_USERNAME', '') else: log.info('Login to plex.tv') import initialsetup initialsetup.InitialSetup().plex_tv_sign_in() dialog('notification', lang(29999), lang(39221), icon='{plex}', time=3000, sound=False)
def chooseServer(): """ Lets user choose from list of PMS """ log.info("Choosing PMS server requested, starting") import initialsetup setup = initialsetup.InitialSetup() server = setup.PickPMS(showDialog=True) if server is None: log.error('We did not connect to a new PMS, aborting') plex_command('SUSPEND_USER_CLIENT', 'False') plex_command('SUSPEND_LIBRARY_THREAD', 'False') return log.info("User chose server %s" % server['name']) setup.WritePMStoSettings(server) if not __LogOut(): return from utils import deletePlaylists, deleteNodes # First remove playlists deletePlaylists() # Remove video nodes deleteNodes() # Log in again __LogIn() log.info("Choosing new PMS complete") # '<PMS> connected' dialog('notification', lang(29999), '%s %s' % (server['name'], lang(39220)), icon='{plex}', time=3000, sound=False)
def ServiceEntryPoint(self): log = self.logMsg window = utils.window lang = utils.language # Important: Threads depending on abortRequest will not trigger # if profile switch happens more than once. monitor = self.monitor kodiProfile = xbmc.translatePath("special://profile") # Server auto-detect initialsetup.InitialSetup().setup() # Initialize important threads user = userclient.UserClient() ws = wsc.WebSocket_Client() library = librarysync.LibrarySync() kplayer = player.Player() # Sync and progress report lastProgressUpdate = datetime.today() while not monitor.abortRequested(): if window('emby_kodiProfile') != kodiProfile: # Profile change happened, terminate this thread and others log( "Kodi profile was: %s and changed to: %s. Terminating old Emby thread." % (kodiProfile, utils.window('emby_kodiProfile')), 1) break # Before proceeding, need to make sure: # 1. Server is online # 2. User is set # 3. User has access to the server if window('emby_online') == "true": # Emby server is online # Verify if user is set and has access to the server if (user.currUser is not None) and user.HasAccess: # If an item is playing if xbmc.Player().isPlaying(): try: # Update and report progress playtime = xbmc.Player().getTime() totalTime = xbmc.Player().getTotalTime() currentFile = kplayer.currentFile # Update positionticks if kplayer.played_info.get( currentFile) is not None: kplayer.played_info[currentFile][ 'currentPosition'] = playtime td = datetime.today() - lastProgressUpdate secDiff = td.seconds # Report progress to Emby server if (secDiff > 3): kplayer.reportPlayback() lastProgressUpdate = datetime.today() elif window('emby_command') == "true": # Received a remote control command that # requires updating immediately window('emby_command', clear=True) kplayer.reportPlayback() lastProgressUpdate = datetime.today() except Exception as e: log( "Exception in Playback Monitor Service: %s" % e, 1) pass else: # Start up events self.warn_auth = True if utils.settings( 'connectMsg') == "true" and self.welcome_msg: # Reset authentication warnings self.welcome_msg = False # Get additional users additionalUsers = user.AdditionalUser if additionalUsers: add = ", %s" % ", ".join(additionalUsers) else: add = "" xbmcgui.Dialog().notification( heading="Emby for Kodi", message=("%s %s%s!" % (lang(33000), user.currUser.decode('utf-8'), add.decode('utf-8'))), icon= "special://home/addons/plugin.video.emby/icon.png", time=2000, sound=False) # Start monitoring kodi events if not self.kodimonitor_running: self.kodimonitor_running = kodimonitor.KodiMonitor( ) # Start the Websocket Client if not self.websocket_running: self.websocket_running = True ws.start() # Start the syncing thread if not self.library_running: self.library_running = True library.start() else: if (user.currUser is None) and self.warn_auth: # Alert user is not authenticated and suppress future warning self.warn_auth = False log("Not authenticated yet.", 1) # User access is restricted. # Keep verifying until access is granted # unless server goes offline or Kodi is shut down. while user.HasAccess == False: # Verify access with an API call user.hasAccess() if window('emby_online') != "true": # Server went offline break if monitor.waitForAbort(5): # Abort was requested while waiting. We should exit break else: # Wait until Emby server is online # or Kodi is shut down. while not monitor.abortRequested(): if user.getServer() == False: # No server info set in add-on settings pass elif user.getPublicUsers() == False: # Server is offline. # Alert the user and suppress future warning if self.server_online: log("Server is offline.", 1) window('emby_online', value="false") xbmcgui.Dialog().notification( heading=lang(33001), message="%s %s" % (self.addonName, lang(33002)), icon= "special://home/addons/plugin.video.emby/icon.png", sound=False) self.server_online = False else: # Server is online if not self.server_online: # Server was offline when Kodi started. # Wait for server to be fully established. if monitor.waitForAbort(5): # Abort was requested while waiting. break # Alert the user that server is online. xbmcgui.Dialog().notification( heading="Emby for Kodi", message=lang(33003), icon= "special://home/addons/plugin.video.emby/icon.png", time=2000, sound=False) self.server_online = True log("Server is online and ready.", 1) window('emby_online', value="true") # Start the userclient thread if not self.userclient_running: self.userclient_running = True user.start() break if monitor.waitForAbort(1): # Abort was requested while waiting. break if monitor.waitForAbort(1): # Abort was requested while waiting. We should exit break ##### Emby thread is terminating. ##### if self.userclient_running: user.stopClient() if self.library_running: library.stopThread() if self.websocket_running: ws.stopClient() log("======== STOP %s ========" % self.addonName, 0)
def ServiceEntryPoint(self): # Important: Threads depending on abortRequest will not trigger # if profile switch happens more than once. __stop_PKC = self.__stop_PKC monitor = self.monitor kodiProfile = v.KODI_PROFILE # Server auto-detect initialsetup.InitialSetup().setup() # Detect playback start early on self.command_pipeline = Monitor_Window() self.command_pipeline.start() # Initialize important threads, handing over self for callback purposes self.user = UserClient() self.ws = PMS_Websocket() self.alexa = Alexa_Websocket() self.library = LibrarySync() self.plexCompanion = PlexCompanion() self.specialMonitor = SpecialMonitor() self.playback_starter = Playback_Starter() self.playqueue = PlayqueueMonitor() if settings('enableTextureCache') == "true": self.image_cache_thread = Image_Cache_Thread() welcome_msg = True counter = 0 while not __stop_PKC(): if window('plex_kodiProfile') != kodiProfile: # Profile change happened, terminate this thread and others LOG.info( "Kodi profile was: %s and changed to: %s. " "Terminating old PlexKodiConnect thread.", kodiProfile, window('plex_kodiProfile')) break # Before proceeding, need to make sure: # 1. Server is online # 2. User is set # 3. User has access to the server if window('plex_online') == "true": # Plex server is online # Verify if user is set and has access to the server if (self.user.currUser is not None) and self.user.HasAccess: if not self.kodimonitor_running: # Start up events self.warn_auth = True if welcome_msg is True: # Reset authentication warnings welcome_msg = False dialog('notification', lang(29999), "%s %s" % (lang(33000), self.user.currUser), icon='{plex}', time=2000, sound=False) # Start monitoring kodi events self.kodimonitor_running = KodiMonitor() self.specialMonitor.start() # Start the Websocket Client if not self.ws_running: self.ws_running = True self.ws.start() # Start the Alexa thread if (not self.alexa_running and settings('enable_alexa') == 'true'): self.alexa_running = True self.alexa.start() # Start the syncing thread if not self.library_running: self.library_running = True self.library.start() # Start the Plex Companion thread if not self.plexCompanion_running: self.plexCompanion_running = True self.plexCompanion.start() if not self.playback_starter_running: self.playback_starter_running = True self.playback_starter.start() self.playqueue.start() if (not self.image_cache_thread_running and settings('enableTextureCache') == "true"): self.image_cache_thread_running = True self.image_cache_thread.start() else: if (self.user.currUser is None) and self.warn_auth: # Alert user is not authenticated and suppress future # warning self.warn_auth = False LOG.warn("Not authenticated yet.") # User access is restricted. # Keep verifying until access is granted # unless server goes offline or Kodi is shut down. while self.user.HasAccess is False: # Verify access with an API call self.user.hasAccess() if window('plex_online') != "true": # Server went offline break if monitor.waitForAbort(3): # Abort was requested while waiting. We should exit break else: # Wait until Plex server is online # or Kodi is shut down. while not self.__stop_PKC(): server = self.user.getServer() if server is False: # No server info set in add-on settings pass elif check_connection(server, verifySSL=True) is False: # Server is offline or cannot be reached # Alert the user and suppress future warning if self.server_online: self.server_online = False window('plex_online', value="false") # Suspend threads state.SUSPEND_LIBRARY_THREAD = True LOG.error("Plex Media Server went offline") if settings('show_pms_offline') == 'true': dialog('notification', lang(33001), "%s %s" % (lang(29999), lang(33002)), icon='{plex}', sound=False) counter += 1 # Periodically check if the IP changed, e.g. per minute if counter > 20: counter = 0 setup = initialsetup.InitialSetup() tmp = setup.pick_pms() if tmp is not None: setup.write_pms_to_settings(tmp) else: # Server is online counter = 0 if not self.server_online: # Server was offline when Kodi started. # Wait for server to be fully established. if monitor.waitForAbort(5): # Abort was requested while waiting. break self.server_online = True # Alert the user that server is online. if (welcome_msg is False and settings('show_pms_offline') == 'true'): dialog('notification', lang(29999), lang(33003), icon='{plex}', time=5000, sound=False) LOG.info("Server %s is online and ready.", server) window('plex_online', value="true") if state.AUTHENTICATED: # Server got offline when we were authenticated. # Hence resume threads state.SUSPEND_LIBRARY_THREAD = False # Start the userclient thread if not self.user_running: self.user_running = True self.user.start() break if monitor.waitForAbort(3): # Abort was requested while waiting. break if monitor.waitForAbort(0.05): # Abort was requested while waiting. We should exit break # Terminating PlexKodiConnect # Tell all threads to terminate (e.g. several lib sync threads) state.STOP_PKC = True window('plex_service_started', clear=True) LOG.info("======== STOP %s ========", v.ADDON_NAME)
def ServiceEntryPoint(self): # Important: Threads depending on abortRequest will not trigger # if profile switch happens more than once. monitor = self.monitor kodiProfile = xbmc.translatePath("special://profile") # Server auto-detect initialsetup.InitialSetup().setup() # Queue for background sync queue = Queue.Queue() connectMsg = True if settings('connectMsg') == 'true' else False # Initialize important threads user = userclient.UserClient() ws = wsc.WebSocket(queue) library = librarysync.LibrarySync(queue) plx = PlexAPI.PlexAPI() counter = 0 while not monitor.abortRequested(): if window('plex_kodiProfile') != kodiProfile: # Profile change happened, terminate this thread and others log.warn("Kodi profile was: %s and changed to: %s. " "Terminating old PlexKodiConnect thread." % (kodiProfile, window('plex_kodiProfile'))) break # Before proceeding, need to make sure: # 1. Server is online # 2. User is set # 3. User has access to the server if window('plex_online') == "true": # Plex server is online # Verify if user is set and has access to the server if (user.currUser is not None) and user.HasAccess: if not self.kodimonitor_running: # Start up events self.warn_auth = True if connectMsg and self.welcome_msg: # Reset authentication warnings self.welcome_msg = False xbmcgui.Dialog().notification( heading=addonName, message="%s %s" % (lang(33000), user.currUser), icon= "special://home/addons/plugin.video.plexkodiconnect/icon.png", time=2000, sound=False) # Start monitoring kodi events self.kodimonitor_running = kodimonitor.KodiMonitor() # Start the Websocket Client if not self.websocket_running: self.websocket_running = True ws.start() # Start the syncing thread if not self.library_running: self.library_running = True library.start() # Start the Plex Companion thread if not self.plexCompanion_running: self.plexCompanion_running = True plexCompanion = PlexCompanion.PlexCompanion() plexCompanion.start() else: if (user.currUser is None) and self.warn_auth: # Alert user is not authenticated and suppress future warning self.warn_auth = False log.warn("Not authenticated yet.") # User access is restricted. # Keep verifying until access is granted # unless server goes offline or Kodi is shut down. while user.HasAccess == False: # Verify access with an API call user.hasAccess() if window('plex_online') != "true": # Server went offline break if monitor.waitForAbort(5): # Abort was requested while waiting. We should exit break xbmc.sleep(50) else: # Wait until Plex server is online # or Kodi is shut down. while not monitor.abortRequested(): server = user.getServer() if server is False: # No server info set in add-on settings pass elif plx.CheckConnection(server, verifySSL=True) is False: # Server is offline or cannot be reached # Alert the user and suppress future warning if self.server_online: log.error("Server is offline.") window('plex_online', value="false") # Suspend threads window('suspend_LibraryThread', value='true') xbmcgui.Dialog().notification( heading=lang(33001), message="%s %s" % (addonName, lang(33002)), icon="special://home/addons/plugin.video." "plexkodiconnect/icon.png", sound=False) self.server_online = False counter += 1 # Periodically check if the IP changed, e.g. per minute if counter > 30: counter = 0 setup = initialsetup.InitialSetup() tmp = setup.PickPMS() if tmp is not None: setup.WritePMStoSettings(tmp) else: # Server is online counter = 0 if not self.server_online: # Server was offline when Kodi started. # Wait for server to be fully established. if monitor.waitForAbort(5): # Abort was requested while waiting. break # Alert the user that server is online. xbmcgui.Dialog().notification( heading=addonName, message=lang(33003), icon="special://home/addons/plugin.video." "plexkodiconnect/icon.png", time=5000, sound=False) self.server_online = True log.warn("Server %s is online and ready." % server) window('plex_online', value="true") if window('plex_authenticated') == 'true': # Server got offline when we were authenticated. # Hence resume threads window('suspend_LibraryThread', clear=True) # Start the userclient thread if not self.userclient_running: self.userclient_running = True user.start() break if monitor.waitForAbort(2): # Abort was requested while waiting. break if monitor.waitForAbort(0.05): # Abort was requested while waiting. We should exit break # Terminating PlexKodiConnect # Tell all threads to terminate (e.g. several lib sync threads) window('plex_terminateNow', value='true') try: plexCompanion.stopThread() except: log.warn('plexCompanion already shut down') try: library.stopThread() except: log.warn('Library sync already shut down') try: ws.stopThread() except: log.warn('Websocket client already shut down') try: user.stopThread() except: log.warn('User client already shut down') try: downloadutils.DownloadUtils().stopSession() except: pass log.warn("======== STOP %s ========" % addonName)
def ServiceEntryPoint(self): # Important: Threads depending on abortRequest will not trigger # if profile switch happens more than once. monitor = self.monitor kodiProfile = v.KODI_PROFILE # Detect playback start early on self.monitor_kodi_play = Monitor_Kodi_Play(self) self.monitor_kodi_play.start() # Server auto-detect initialsetup.InitialSetup().setup() # Initialize important threads, handing over self for callback purposes self.user = UserClient(self) self.ws = WebSocket(self) self.library = LibrarySync(self) self.plexCompanion = PlexCompanion(self) self.playqueue = Playqueue(self) self.playback_starter = Playback_Starter(self) if settings('enableTextureCache') == "true": self.image_cache_thread = Image_Cache_Thread() plx = PlexAPI.PlexAPI() welcome_msg = True counter = 0 while not monitor.abortRequested(): if window('plex_kodiProfile') != kodiProfile: # Profile change happened, terminate this thread and others log.warn("Kodi profile was: %s and changed to: %s. " "Terminating old PlexKodiConnect thread." % (kodiProfile, window('plex_kodiProfile'))) break # Before proceeding, need to make sure: # 1. Server is online # 2. User is set # 3. User has access to the server if window('plex_online') == "true": # Plex server is online # Verify if user is set and has access to the server if (self.user.currUser is not None) and self.user.HasAccess: if not self.kodimonitor_running: # Start up events self.warn_auth = True if welcome_msg is True: # Reset authentication warnings welcome_msg = False dialog('notification', lang(29999), "%s %s" % (lang(33000), self.user.currUser), icon='{plex}', time=2000, sound=False) # Start monitoring kodi events self.kodimonitor_running = KodiMonitor(self) # Start playqueue client if not self.playqueue_running: self.playqueue_running = True self.playqueue.start() # Start the Websocket Client if not self.ws_running: self.ws_running = True self.ws.start() # Start the syncing thread if not self.library_running: self.library_running = True self.library.start() # Start the Plex Companion thread if not self.plexCompanion_running: self.plexCompanion_running = True self.plexCompanion.start() if not self.playback_starter_running: self.playback_starter_running = True self.playback_starter.start() if (not self.image_cache_thread_running and settings('enableTextureCache') == "true"): self.image_cache_thread_running = True self.image_cache_thread.start() else: if (self.user.currUser is None) and self.warn_auth: # Alert user is not authenticated and suppress future # warning self.warn_auth = False log.warn("Not authenticated yet.") # User access is restricted. # Keep verifying until access is granted # unless server goes offline or Kodi is shut down. while self.user.HasAccess is False: # Verify access with an API call self.user.hasAccess() if window('plex_online') != "true": # Server went offline break if monitor.waitForAbort(5): # Abort was requested while waiting. We should exit break sleep(50) else: # Wait until Plex server is online # or Kodi is shut down. while not monitor.abortRequested(): server = self.user.getServer() if server is False: # No server info set in add-on settings pass elif plx.CheckConnection(server, verifySSL=True) is False: # Server is offline or cannot be reached # Alert the user and suppress future warning if self.server_online: self.server_online = False window('plex_online', value="false") # Suspend threads window('suspend_LibraryThread', value='true') log.error("Plex Media Server went offline") if settings('show_pms_offline') == 'true': dialog('notification', lang(33001), "%s %s" % (lang(29999), lang(33002)), icon='{plex}', sound=False) counter += 1 # Periodically check if the IP changed, e.g. per minute if counter > 20: counter = 0 setup = initialsetup.InitialSetup() tmp = setup.PickPMS() if tmp is not None: setup.WritePMStoSettings(tmp) else: # Server is online counter = 0 if not self.server_online: # Server was offline when Kodi started. # Wait for server to be fully established. if monitor.waitForAbort(5): # Abort was requested while waiting. break self.server_online = True # Alert the user that server is online. if (welcome_msg is False and settings('show_pms_offline') == 'true'): dialog('notification', lang(29999), lang(33003), icon='{plex}', time=5000, sound=False) log.info("Server %s is online and ready." % server) window('plex_online', value="true") if window('plex_authenticated') == 'true': # Server got offline when we were authenticated. # Hence resume threads window('suspend_LibraryThread', clear=True) # Start the userclient thread if not self.user_running: self.user_running = True self.user.start() break if monitor.waitForAbort(3): # Abort was requested while waiting. break if monitor.waitForAbort(0.05): # Abort was requested while waiting. We should exit break # Terminating PlexKodiConnect # Tell all threads to terminate (e.g. several lib sync threads) window('plex_terminateNow', value='true') try: self.plexCompanion.stopThread() except: log.warn('plexCompanion already shut down') try: self.library.stopThread() except: log.warn('Library sync already shut down') try: self.ws.stopThread() except: log.warn('Websocket client already shut down') try: self.user.stopThread() except: log.warn('User client already shut down') try: downloadutils.DownloadUtils().stopSession() except: pass log.warn("======== STOP %s ========" % v.ADDON_NAME)
def service_entry_point(self): # Important: Threads depending on abortRequest will not trigger # if profile switch happens more than once. self.monitor = kodimonitor.KodiMonitor() self.kodi_player = player.Player() kodi_profile = xbmc.translatePath('special://profile') # Server auto-detect initialsetup.InitialSetup().setup() # Initialize important threads self.userclient_thread = userclient.UserClient() user_client = self.userclient_thread self.websocket_thread = wsc.WebSocketClient() self.library_thread = librarysync.LibrarySync() while not self.monitor.abortRequested(): if window('emby_kodiProfile') != kodi_profile: # Profile change happened, terminate this thread and others log.info( "Kodi profile was: %s and changed to: %s. Terminating old Emby thread.", kodi_profile, window('emby_kodiProfile')) exc = Exception("Kodi profile changed detected") exc.quiet = True raise exc # Before proceeding, need to make sure: # 1. Server is online # 2. User is set # 3. User has access to the server if window('emby_online') == "true": # Emby server is online # Verify if user is set and has access to the server if user_client.get_user( ) is not None and user_client.get_access(): # If an item is playing if self.kodi_player.isPlaying(): # ping metrics server to keep sessions alive while playing # ping every 5 min timeSinceLastPing = time.time() - self.lastMetricPing if (timeSinceLastPing > 300): self.lastMetricPing = time.time() ga = GoogleAnalytics() ga.sendEventData("PlayAction", "PlayPing") self._report_progress() elif not self.startup: self.startup = self._startup() if not self.websocket_running: # Start the Websocket Client self.websocket_running = True self.websocket_thread.start() if not self.library_running: # Start the syncing thread self.library_running = True self.library_thread.start() else: if (user_client.get_user() is None) and self.warn_auth: # Alert user is not authenticated and suppress future warning self.warn_auth = False log.info("Not authenticated yet.") # User access is restricted. # Keep verifying until access is granted # unless server goes offline or Kodi is shut down. self._access_check() else: # Wait until Emby server is online # or Kodi is shut down. self._server_online_check() if self.monitor.waitForAbort(1): # Abort was requested while waiting. We should exit break ##### Emby thread is terminating. ##### self.shutdown()
def ServiceEntryPoint(self): log = self.logMsg window = utils.window lang = utils.language # Important: Threads depending on abortRequest will not trigger # if profile switch happens more than once. monitor = self.monitor kodiProfile = xbmc.translatePath("special://profile") # Server auto-detect initialsetup.InitialSetup().setup() # Queue for background sync queue = Queue.Queue(maxsize=200) connectMsg = True if utils.settings('connectMsg') == 'true' else False # Initialize important threads user = userclient.UserClient() ws = wsc.WebSocket(queue) library = librarysync.LibrarySync(queue) kplayer = player.Player() xplayer = xbmc.Player() plx = PlexAPI.PlexAPI() # Sync and progress report lastProgressUpdate = datetime.today() while not monitor.abortRequested(): if window('emby_kodiProfile') != kodiProfile: # Profile change happened, terminate this thread and others log( "Kodi profile was: %s and changed to: %s. Terminating old Emby thread." % (kodiProfile, utils.window('emby_kodiProfile')), 1) break # Before proceeding, need to make sure: # 1. Server is online # 2. User is set # 3. User has access to the server if window('emby_online') == "true": # Emby server is online # Verify if user is set and has access to the server if (user.currUser is not None) and user.HasAccess: # If an item is playing if xplayer.isPlaying(): try: # Update and report progress playtime = xplayer.getTime() totalTime = xplayer.getTotalTime() currentFile = kplayer.currentFile # Update positionticks if kplayer.played_info.get( currentFile) is not None: kplayer.played_info[currentFile][ 'currentPosition'] = playtime td = datetime.today() - lastProgressUpdate secDiff = td.seconds # Report progress to Emby server if (secDiff > 3): kplayer.reportPlayback() lastProgressUpdate = datetime.today() elif window('emby_command') == "true": # Received a remote control command that # requires updating immediately window('emby_command', clear=True) kplayer.reportPlayback() lastProgressUpdate = datetime.today() except Exception as e: log( "Exception in Playback Monitor Service: %s" % e, 1) pass else: # Start up events self.warn_auth = True if connectMsg and self.welcome_msg: # Reset authentication warnings self.welcome_msg = False xbmcgui.Dialog().notification( heading=self.addonName, message="%s %s" % (lang(33000), user.currUser), icon= "special://home/addons/plugin.video.plexkodiconnect/icon.png", time=2000, sound=False) # Start monitoring kodi events if not self.kodimonitor_running: self.kodimonitor_running = kodimonitor.KodiMonitor( ) # Start the Websocket Client if not self.websocket_running: self.websocket_running = True ws.start() # Start the syncing thread if not self.library_running: self.library_running = True library.start() # Start the Plex Companion thread if not self.plexCompanion_running and \ self.runPlexCompanion == "true": self.plexCompanion_running = True plexCompanion = PlexCompanion.PlexCompanion() plexCompanion.start() else: if (user.currUser is None) and self.warn_auth: # Alert user is not authenticated and suppress future warning self.warn_auth = False log("Not authenticated yet.", 1) # User access is restricted. # Keep verifying until access is granted # unless server goes offline or Kodi is shut down. while user.HasAccess == False: # Verify access with an API call user.hasAccess() if window('emby_online') != "true": # Server went offline break if monitor.waitForAbort(5): # Abort was requested while waiting. We should exit break xbmc.sleep(50) else: # Wait until Emby server is online # or Kodi is shut down. while not monitor.abortRequested(): server = user.getServer() if server is False: # No server info set in add-on settings pass elif plx.CheckConnection(server, verifySSL=True) is False: # Server is offline or cannot be reached # Alert the user and suppress future warning if self.server_online: log("Server is offline.", 1) window('emby_online', value="false") # Suspend threads window('suspend_LibraryThread', value='true') xbmcgui.Dialog().notification( heading=lang(33001), message="%s %s" % (self.addonName, lang(33002)), icon="special://home/addons/plugin.video." "plexkodiconnect/icon.png", sound=False) self.server_online = False else: # Server is online if not self.server_online: # Server was offline when Kodi started. # Wait for server to be fully established. if monitor.waitForAbort(5): # Abort was requested while waiting. break # Alert the user that server is online. xbmcgui.Dialog().notification( heading=self.addonName, message=lang(33003), icon="special://home/addons/plugin.video." "plexkodiconnect/icon.png", time=2000, sound=False) self.server_online = True log("Server %s is online and ready." % server, 1) window('emby_online', value="true") if window('plex_authenticated') == 'true': # Server got offline when we were authenticated. # Hence resume threads window('suspend_LibraryThread', clear=True) # Start the userclient thread if not self.userclient_running: self.userclient_running = True user.start() break if monitor.waitForAbort(1): # Abort was requested while waiting. break xbmc.sleep(50) if monitor.waitForAbort(1): # Abort was requested while waiting. We should exit break # Terminating PlexKodiConnect # Tell all threads to terminate (e.g. several lib sync threads) utils.window('plex_terminateNow', value='true') try: plexCompanion.stopThread() except: xbmc.log('plexCompanion already shut down') try: library.stopThread() except: xbmc.log('Library sync already shut down') try: ws.stopThread() except: xbmc.log('Websocket client already shut down') try: user.stopThread() except: xbmc.log('User client already shut down') try: downloadutils.DownloadUtils().stopSession() except: pass log("======== STOP %s ========" % self.addonName, 0)