From 0e61825579639fe7644d995e11e4ebd1f8cb0171 Mon Sep 17 00:00:00 2001 From: angelblue05 Date: Thu, 24 Sep 2015 06:16:19 -0500 Subject: [PATCH] Fix profile switching Make sure the threads are properly terminated. --- resources/lib/LibrarySync.py | 27 ++++++++------ service.py | 69 +++++++++++++++++++++++------------- 2 files changed, 61 insertions(+), 35 deletions(-) diff --git a/resources/lib/LibrarySync.py b/resources/lib/LibrarySync.py index a9401409..7ae14370 100644 --- a/resources/lib/LibrarySync.py +++ b/resources/lib/LibrarySync.py @@ -1034,10 +1034,11 @@ class LibrarySync(threading.Thread): return False def run(self): - clientInfo = ClientInformation() - self.logMsg("--- Starting Library Sync Thread ---", 0) - WINDOW = xbmcgui.Window(10000) + startupComplete = False + kodiProfile = xbmc.translatePath("special://profile") + + self.logMsg("--- Starting Library Sync Thread ---", 0) while not self.KodiMonitor.abortRequested(): @@ -1055,22 +1056,22 @@ class LibrarySync(threading.Thread): # Only get in here for a while, can be removed later if utils.settings("dbCreatedWithVersion")=="" and utils.settings("SyncInstallRunDone") == "true": self.logMsg("Unknown DB version", 0) - return_value = xbmcgui.Dialog().yesno("DB Version", "Can't detect version of Emby for Kodi the DB was created with.\nWas it at least version " + WINDOW.getProperty('minDBVersion') + "?") + return_value = xbmcgui.Dialog().yesno("DB Version", "Can't detect version of Emby for Kodi the DB was created with.\nWas it at least version " + utils.window('minDBVersion') + "?") if return_value == 0: utils.settings("dbCreatedWithVersion","0.0.0") self.logMsg("DB version out of date according to user", 0) else: - utils.settings("dbCreatedWithVersion",WINDOW.getProperty('minDBVersion')) + utils.settings("dbCreatedWithVersion", utils.window('minDBVersion')) self.logMsg("DB version okay according to user", 0) # END TEMPORARY CODE - if (utils.settings("SyncInstallRunDone") == "true" and self.checkDBVersion(utils.settings("dbCreatedWithVersion"), WINDOW.getProperty('minDBVersion'))==False and WINDOW.getProperty('minDBVersionCheck') != "true"): + if (utils.settings("SyncInstallRunDone") == "true" and self.checkDBVersion(utils.settings("dbCreatedWithVersion"), utils.window('minDBVersion'))==False and utils.window('minDBVersionCheck') != "true"): self.logMsg("DB version out of date according to check", 0) return_value = xbmcgui.Dialog().yesno("DB Version", "Detected the DB needs to be recreated for\nthis version of Emby for Kodi.\nProceed?") if return_value == 0: self.logMsg("DB version out of date !!! USER IGNORED !!!", 0) xbmcgui.Dialog().ok("Emby for Kodi","Emby for Kodi may not work\ncorrectly until the database is reset.\n") - WINDOW.setProperty('minDBVersionCheck', "true") + utils.window('minDBVersionCheck', value="true") else: utils.reset() @@ -1088,9 +1089,9 @@ class LibrarySync(threading.Thread): startupComplete = True # Set via Kodi Monitor event - if WINDOW.getProperty("OnWakeSync") == "true" and WINDOW.getProperty('Server_online') == "true": - WINDOW.clearProperty("OnWakeSync") - if WINDOW.getProperty("SyncDatabaseRunning") != "true": + if utils.window('OnWakeSync') == "true" and utils.window('Server_online') == "true": + utils.window("OnWakeSync", clear=True) + if utils.window("SyncDatabaseRunning") != "true": self.logMsg("Doing_Db_Sync Post Resume: syncDatabase (Started)", 0) libSync = self.FullLibrarySync() self.logMsg("Doing_Db_Sync Post Resume: syncDatabase (Finished) " + str(libSync), 0) @@ -1118,6 +1119,12 @@ class LibrarySync(threading.Thread): self.removeItems = [] self.removefromDB(listItems) + + if utils.window("kodiProfile_emby") != kodiProfile: + # Profile change happened, terminate this thread + self.logMsg("Kodi profile was: %s and changed to: %s. Terminating Library thread." % (kodiProfile, utils.window("kodiProfile_emby")), 1) + break + if self.KodiMonitor.waitForAbort(1): # Abort was requested while waiting. We should exit break diff --git a/service.py b/service.py index 47426aa2..6b397977 100644 --- a/service.py +++ b/service.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- +################################################################################################# + import os import sys import time @@ -10,11 +12,15 @@ import xbmc import xbmcgui import xbmcvfs +################################################################################################# + _addon = xbmcaddon.Addon(id='plugin.video.emby') addon_path = _addon.getAddonInfo('path').decode('utf-8') base_resource_path = xbmc.translatePath(os.path.join(addon_path, 'resources', 'lib')).decode('utf-8') sys.path.append(base_resource_path) +################################################################################################# + import KodiMonitor import Utils as utils from ClientInformation import ClientInformation @@ -25,6 +31,8 @@ from WebSocketClient import WebSocketThread from LibrarySync import LibrarySync from LibraryMonitor import LibraryMonitor +################################################################################################# + class Service(): KodiMonitor = KodiMonitor.Kodi_Monitor() @@ -44,28 +52,31 @@ class Service(): def __init__(self, *args): addonName = self.addonName - WINDOW = self.WINDOW - WINDOW.setProperty('getLogLevel', str(self.logLevel)) + clientInfo = self.clientInfo + logLevel = self.logLevel + + utils.window('getLogLevel', value=str(logLevel)) + utils.window('kodiProfile_emby', value=xbmc.translatePath("special://profile")) # Initial logging self.logMsg("Starting Monitor", 0) self.logMsg("======== START %s ========" % addonName, 0) - self.logMsg("Platform: %s" % (self.clientInfo.getPlatform()), 0) + self.logMsg("Platform: %s" % (clientInfo.getPlatform()), 0) self.logMsg("KODI Version: %s" % xbmc.getInfoLabel('System.BuildVersion'), 0) - self.logMsg("%s Version: %s" % (addonName, self.clientInfo.getVersion()), 0) - self.logMsg("Log Level: %s" % self.logLevel, 1) + self.logMsg("%s Version: %s" % (addonName, clientInfo.getVersion()), 0) + self.logMsg("Log Level: %s" % logLevel, 0) # Reset window props for profile switch - WINDOW.clearProperty('Server_online') - WINDOW.clearProperty('Server_status') - WINDOW.clearProperty('startup') - WINDOW.clearProperty('OnWakeSync') - WINDOW.clearProperty('minDBVersionCheck') + utils.window('Server_online', clear=True) + utils.window('Server_status', clear=True) + utils.window('startup', clear=True) + utils.window('OnWakeSync', clear=True) + utils.window('minDBVersionCheck', clear=True) # Set min DB version - WINDOW.setProperty('minDBVersion','1.1.40') + utils.window('minDBVersion', value="1.1.40") - embyProperty = WINDOW.getProperty('Emby.nodes.total') + embyProperty = utils.window('Emby.nodes.total') propNames = [ "index","path","title","content", @@ -84,7 +95,7 @@ class Service(): totalNodes = int(embyProperty) for i in range(totalNodes): for prop in propNames: - WINDOW.clearProperty('Emby.nodes.%s.%s' % (str(i), prop)) + utils.window('Emby.nodes.%s.%s' % (str(i), prop), clear=True) def logMsg(self, msg, lvl=1): @@ -92,9 +103,9 @@ class Service(): utils.logMsg("%s %s" % (self.addonName, className), msg, int(lvl)) def ServiceEntryPoint(self): - - WINDOW = self.WINDOW - + + kodiProfile = xbmc.translatePath("special://profile") + # Server auto-detect ConnectionManager().checkServer() @@ -117,7 +128,7 @@ class Service(): # 2. User is set # 3. User has access to the server - if WINDOW.getProperty('Server_online') == "true": + if utils.window('Server_online') == "true": # Emby server is online # Verify if user is set and has access to the server @@ -133,7 +144,7 @@ class Service(): # Update positionticks if player.played_information.get(currentFile) is not None: - player.played_information[currentFile]["currentPosition"] = playTime + player.played_information[currentFile]['currentPosition'] = playTime td = datetime.today() - lastProgressUpdate secDiff = td.seconds @@ -143,12 +154,12 @@ class Service(): player.reportPlayback() lastProgressUpdate = datetime.today() - elif WINDOW.getProperty('commandUpdate') == "true": + elif utils.window('commandUpdate') == "true": # Received a remote control command that # requires updating immediately - WINDOW.clearProperty('commandUpdate') + utils.window('commandUpdate', clear=True) player.reportPlayback() - lastProgressUpdate = datetime.today() + lastProgressUpdate = da4tetime.today() except Exception as e: self.logMsg("Exception in Playback Monitor Service: %s" % e, 1) @@ -191,7 +202,7 @@ class Service(): # Verify access with an API call user.hasAccess() - if WINDOW.getProperty('Server_online') != "true": + if utils.window('Server_online') != "true": # Server went offline break @@ -213,7 +224,7 @@ class Service(): # Alert the user and suppress future warning if self.server_online: self.logMsg("Server is offline.", 1) - WINDOW.setProperty('Server_online', "false") + utils.window('Server_online', value="false") xbmcgui.Dialog().notification("Error connecting", "%s Server is unreachable." % self.addonName, icon="special://home/addons/plugin.video.emby/icon.png", sound=False) self.server_online = False @@ -230,7 +241,7 @@ class Service(): self.server_online = True self.logMsg("Server is online and ready.", 1) - WINDOW.setProperty('Server_online', "true") + utils.window('Server_online', value="true") # Start the User client if self.newUserClient is None: @@ -242,11 +253,19 @@ class Service(): # Abort was requested while waiting. break + + if utils.window("kodiProfile_emby") != kodiProfile: + # Profile change happened, terminate this thread + self.logMsg("Kodi profile was: %s and changed to: %s. Terminating old Emby thread." % (kodiProfile, utils.window("kodiProfile_emby")), 1) + break + if self.KodiMonitor.waitForAbort(1): # Abort was requested while waiting. We should exit break - # If music is enable and direct stream for music is enabled + ##### Emby thread is terminating. ##### + + # If music is enabled and direct stream for music is enabled # We use Kodi pathsubstitution to allow for music to play outside network # The setting needs to be set before Kodi starts. if utils.settings('enableMusicSync') == "true" and utils.settings('directstreammusic') == "true":