def __init__(self): global log log = Logging(self.__class__.__name__).log self.addonId = clientinfo.ClientInfo().getAddonId() self.doUtils = downloadutils.DownloadUtils().downloadUrl self.userClient = userclient.UserClient()
def __init__(self): self.addon = xbmcaddon.Addon() self.__language__ = self.addon.getLocalizedString self.clientInfo = clientinfo.ClientInfo() self.addonName = self.clientInfo.getAddonName() self.addonId = self.clientInfo.getAddonId() self.doUtils = downloadutils.DownloadUtils() self.userClient = userclient.UserClient()
def __init__(self): self.__dict__ = self._shared_state self.monitor = xbmc.Monitor() self.clientInfo = clientinfo.ClientInfo() self.doUtils = downloadutils.DownloadUtils().downloadUrl self.user = userclient.UserClient() self.emby = embyserver.Read_EmbyServer() self.kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2]) threading.Thread.__init__(self)
def on_message(self, ws, message): result = json.loads(message) message_type = result['MessageType'] if message_type not in ('NotificationAdded', 'SessionEnded', 'RestartRequired', 'PackageInstalling'): # Mute certain events log.info("Message: %s", message) if message_type == 'Play': # A remote control play command has been sent from the server. data = result['Data'] self._play(data) elif message_type == 'Playstate': # A remote control update playstate command has been sent from the server. data = result['Data'] self._playstate(data) elif message_type == "UserDataChanged": # A user changed their personal rating for an item, or their playstate was updated data = result['Data'] userdata_list = data['UserDataList'] self.library_sync.triage_items("userdata", userdata_list) elif message_type == "LibraryChanged": data = result['Data'] self._library_changed(data) elif message_type == "GeneralCommand": data = result['Data'] self._general_commands(data) elif message_type == "ServerRestarting": self._server_restarting() elif message_type == "UserConfigurationUpdated": # Update user data set in userclient data = result['Data'] userclient.UserClient().get_user(data) self.library_sync.refresh_views = True elif message_type == "ServerShuttingDown": # Server went offline window('emby_online', value="false")
def __init__(self): log.debug('Entering initialsetup class') self.clientInfo = clientinfo.ClientInfo() self.addonId = self.clientInfo.getAddonId() self.doUtils = downloadutils.DownloadUtils().downloadUrl self.userClient = userclient.UserClient() self.plx = PlexAPI.PlexAPI() self.dialog = xbmcgui.Dialog() self.server = self.userClient.getServer() self.serverid = settings('plex_machineIdentifier') # Get Plex credentials from settings file, if they exist plexdict = self.plx.GetPlexLoginFromSettings() self.myplexlogin = plexdict['myplexlogin'] == 'true' self.plexLogin = plexdict['plexLogin'] self.plexToken = plexdict['plexToken'] self.plexid = plexdict['plexid'] if self.plexToken: log.debug('Found a plex.tv token in the settings')
def __init__(self): log = self.logMsg window = utils.window self.clientInfo = clientinfo.ClientInfo() self.addonName = self.clientInfo.getAddonName() logLevel = userclient.UserClient().getLogLevel() self.monitor = xbmc.Monitor() window('emby_logLevel', value=str(logLevel)) window('emby_kodiProfile', value=xbmc.translatePath("special://profile")) window('emby_pluginpath', value=utils.settings('useDirectPaths')) # Initial logging log("======== START %s ========" % self.addonName, 0) log("Platform: %s" % (self.clientInfo.getPlatform()), 0) log("KODI Version: %s" % xbmc.getInfoLabel('System.BuildVersion'), 0) log("%s Version: %s" % (self.addonName, self.clientInfo.getVersion()), 0) log( "Using plugin paths: %s" % (utils.settings('useDirectPaths') != "true"), 0) log("Log Level: %s" % logLevel, 0) # Reset window props for profile switch properties = [ "emby_online", "emby_serverStatus", "emby_onWake", "emby_syncRunning", "emby_dbCheck", "emby_kodiScan", "emby_shouldStop", "emby_currUser", "emby_dbScan", "emby_sessionId", "emby_initialScan", "emby_customplaylist", "emby_playbackProps" ] for prop in properties: window(prop, clear=True) # Clear video nodes properties videonodes.VideoNodes().clearProperties() # Set the minimum database version window('emby_minDBVersion', value="1.1.63")
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. 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 __init__(self): self.addon_id = clientinfo.ClientInfo().get_addon_id() self.user_client = userclient.UserClient() self.connectmanager = connectmanager.ConnectManager()
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 on_message(self, ws, message): log = self.logMsg window = utils.window lang = utils.language result = json.loads(message) messageType = result['MessageType'] data = result['Data'] if messageType not in ('SessionEnded'): # Mute certain events log("Message: %s" % message, 1) if messageType == "Play": # A remote control play command has been sent from the server. itemIds = data['ItemIds'] command = data['PlayCommand'] pl = playlist.Playlist() dialog = xbmcgui.Dialog() if command == "PlayNow": dialog.notification( heading="Emby for Kodi", message="%s %s" % (len(itemIds), lang(33004)), icon="special://home/addons/plugin.video.emby/icon.png", sound=False) startat = data.get('StartPositionTicks', 0) pl.playAll(itemIds, startat) elif command == "PlayNext": dialog.notification( heading="Emby for Kodi", message="%s %s" % (len(itemIds), lang(33005)), icon="special://home/addons/plugin.video.emby/icon.png", sound=False) newplaylist = pl.modifyPlaylist(itemIds) player = xbmc.Player() if not player.isPlaying(): # Only start the playlist if nothing is playing player.play(newplaylist) elif messageType == "Playstate": # A remote control update playstate command has been sent from the server. command = data['Command'] player = xbmc.Player() actions = { 'Stop': player.stop, 'Unpause': player.pause, 'Pause': player.pause, 'NextTrack': player.playnext, 'PreviousTrack': player.playprevious, 'Seek': player.seekTime } action = actions[command] if command == "Seek": seekto = data['SeekPositionTicks'] seektime = seekto / 10000000.0 action(seektime) log("Seek to %s." % seektime, 1) else: action() log("Command: %s completed." % command, 1) window('emby_command', value="true") elif messageType == "UserDataChanged": # A user changed their personal rating for an item, or their playstate was updated userdata_list = data['UserDataList'] self.librarySync.triage_items("userdata", userdata_list) elif messageType == "LibraryChanged": librarySync = self.librarySync processlist = { 'added': data['ItemsAdded'], 'update': data['ItemsUpdated'], 'remove': data['ItemsRemoved'] } for action in processlist: librarySync.triage_items(action, processlist[action]) elif messageType == "GeneralCommand": command = data['Name'] arguments = data['Arguments'] if command in ('Mute', 'Unmute', 'SetVolume', 'SetSubtitleStreamIndex', 'SetAudioStreamIndex'): player = xbmc.Player() # These commands need to be reported back if command == "Mute": xbmc.executebuiltin('Mute') elif command == "Unmute": xbmc.executebuiltin('Mute') elif command == "SetVolume": volume = arguments['Volume'] xbmc.executebuiltin('SetVolume(%s[,showvolumebar])' % volume) elif command == "SetAudioStreamIndex": index = int(arguments['Index']) player.setAudioStream(index - 1) elif command == "SetSubtitleStreamIndex": embyindex = int(arguments['Index']) currentFile = player.getPlayingFile() mapping = window('emby_%s.indexMapping' % currentFile) if mapping: externalIndex = json.loads(mapping) # If there's external subtitles added via playbackutils for index in externalIndex: if externalIndex[index] == embyindex: player.setSubtitleStream(int(index)) break else: # User selected internal subtitles external = len(externalIndex) audioTracks = len( player.getAvailableAudioStreams()) player.setSubtitleStream(external + embyindex - audioTracks - 1) else: # Emby merges audio and subtitle index together audioTracks = len(player.getAvailableAudioStreams()) player.setSubtitleStream(index - audioTracks - 1) # Let service know window('emby_command', value="true") elif command == "DisplayMessage": header = arguments['Header'] text = arguments['Text'] xbmcgui.Dialog().notification( heading=header, message=text, icon="special://home/addons/plugin.video.emby/icon.png", time=4000) elif command == "SendString": string = arguments['String'] text = { 'jsonrpc': "2.0", 'id': 0, 'method': "Input.SendText", 'params': { 'text': "%s" % string, 'done': False } } result = xbmc.executeJSONRPC(json.dumps(text)) else: builtin = { 'ToggleFullscreen': 'Action(FullScreen)', 'ToggleOsdMenu': 'Action(OSD)', 'ToggleContextMenu': 'Action(ContextMenu)', 'MoveUp': 'Action(Up)', 'MoveDown': 'Action(Down)', 'MoveLeft': 'Action(Left)', 'MoveRight': 'Action(Right)', 'Select': 'Action(Select)', 'Back': 'Action(back)', 'GoHome': 'ActivateWindow(Home)', 'PageUp': 'Action(PageUp)', 'NextLetter': 'Action(NextLetter)', 'GoToSearch': 'VideoLibrary.Search', 'GoToSettings': 'ActivateWindow(Settings)', 'PageDown': 'Action(PageDown)', 'PreviousLetter': 'Action(PrevLetter)', 'TakeScreenshot': 'TakeScreenshot', 'ToggleMute': 'Mute', 'VolumeUp': 'Action(VolumeUp)', 'VolumeDown': 'Action(VolumeDown)', } action = builtin.get(command) if action: xbmc.executebuiltin(action) elif messageType == "ServerRestarting": if utils.settings('supressRestartMsg') == "true": xbmcgui.Dialog().notification( heading="Emby for Kodi", message=lang(33006), icon="special://home/addons/plugin.video.emby/icon.png") elif messageType == "UserConfigurationUpdated": # Update user data set in userclient userclient.UserClient().userSettings = data self.librarySync.refresh_views = True
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)
def __init__(self): self.clientInfo = clientinfo.ClientInfo() self.addonId = self.clientInfo.getAddonId() self.doUtils = downloadutils.DownloadUtils().downloadUrl self.userClient = userclient.UserClient() self.plx = PlexAPI.PlexAPI()