Fix profile switching

Make sure the threads are properly terminated.
This commit is contained in:
angelblue05 2015-09-24 06:16:19 -05:00
parent 9d86604800
commit 0e61825579
2 changed files with 61 additions and 35 deletions

View file

@ -1034,10 +1034,11 @@ class LibrarySync(threading.Thread):
return False return False
def run(self): def run(self):
clientInfo = ClientInformation()
self.logMsg("--- Starting Library Sync Thread ---", 0)
WINDOW = xbmcgui.Window(10000)
startupComplete = False startupComplete = False
kodiProfile = xbmc.translatePath("special://profile")
self.logMsg("--- Starting Library Sync Thread ---", 0)
while not self.KodiMonitor.abortRequested(): while not self.KodiMonitor.abortRequested():
@ -1055,22 +1056,22 @@ class LibrarySync(threading.Thread):
# Only get in here for a while, can be removed later # Only get in here for a while, can be removed later
if utils.settings("dbCreatedWithVersion")=="" and utils.settings("SyncInstallRunDone") == "true": if utils.settings("dbCreatedWithVersion")=="" and utils.settings("SyncInstallRunDone") == "true":
self.logMsg("Unknown DB version", 0) 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: if return_value == 0:
utils.settings("dbCreatedWithVersion","0.0.0") utils.settings("dbCreatedWithVersion","0.0.0")
self.logMsg("DB version out of date according to user", 0) self.logMsg("DB version out of date according to user", 0)
else: else:
utils.settings("dbCreatedWithVersion",WINDOW.getProperty('minDBVersion')) utils.settings("dbCreatedWithVersion", utils.window('minDBVersion'))
self.logMsg("DB version okay according to user", 0) self.logMsg("DB version okay according to user", 0)
# END TEMPORARY CODE # 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) 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?") 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: if return_value == 0:
self.logMsg("DB version out of date !!! USER IGNORED !!!", 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") 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: else:
utils.reset() utils.reset()
@ -1088,9 +1089,9 @@ class LibrarySync(threading.Thread):
startupComplete = True startupComplete = True
# Set via Kodi Monitor event # Set via Kodi Monitor event
if WINDOW.getProperty("OnWakeSync") == "true" and WINDOW.getProperty('Server_online') == "true": if utils.window('OnWakeSync') == "true" and utils.window('Server_online') == "true":
WINDOW.clearProperty("OnWakeSync") utils.window("OnWakeSync", clear=True)
if WINDOW.getProperty("SyncDatabaseRunning") != "true": if utils.window("SyncDatabaseRunning") != "true":
self.logMsg("Doing_Db_Sync Post Resume: syncDatabase (Started)", 0) self.logMsg("Doing_Db_Sync Post Resume: syncDatabase (Started)", 0)
libSync = self.FullLibrarySync() libSync = self.FullLibrarySync()
self.logMsg("Doing_Db_Sync Post Resume: syncDatabase (Finished) " + str(libSync), 0) self.logMsg("Doing_Db_Sync Post Resume: syncDatabase (Finished) " + str(libSync), 0)
@ -1118,6 +1119,12 @@ class LibrarySync(threading.Thread):
self.removeItems = [] self.removeItems = []
self.removefromDB(listItems) 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): if self.KodiMonitor.waitForAbort(1):
# Abort was requested while waiting. We should exit # Abort was requested while waiting. We should exit
break break

View file

@ -1,5 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#################################################################################################
import os import os
import sys import sys
import time import time
@ -10,11 +12,15 @@ import xbmc
import xbmcgui import xbmcgui
import xbmcvfs import xbmcvfs
#################################################################################################
_addon = xbmcaddon.Addon(id='plugin.video.emby') _addon = xbmcaddon.Addon(id='plugin.video.emby')
addon_path = _addon.getAddonInfo('path').decode('utf-8') addon_path = _addon.getAddonInfo('path').decode('utf-8')
base_resource_path = xbmc.translatePath(os.path.join(addon_path, 'resources', 'lib')).decode('utf-8') base_resource_path = xbmc.translatePath(os.path.join(addon_path, 'resources', 'lib')).decode('utf-8')
sys.path.append(base_resource_path) sys.path.append(base_resource_path)
#################################################################################################
import KodiMonitor import KodiMonitor
import Utils as utils import Utils as utils
from ClientInformation import ClientInformation from ClientInformation import ClientInformation
@ -25,6 +31,8 @@ from WebSocketClient import WebSocketThread
from LibrarySync import LibrarySync from LibrarySync import LibrarySync
from LibraryMonitor import LibraryMonitor from LibraryMonitor import LibraryMonitor
#################################################################################################
class Service(): class Service():
KodiMonitor = KodiMonitor.Kodi_Monitor() KodiMonitor = KodiMonitor.Kodi_Monitor()
@ -44,28 +52,31 @@ class Service():
def __init__(self, *args): def __init__(self, *args):
addonName = self.addonName addonName = self.addonName
WINDOW = self.WINDOW clientInfo = self.clientInfo
WINDOW.setProperty('getLogLevel', str(self.logLevel)) logLevel = self.logLevel
utils.window('getLogLevel', value=str(logLevel))
utils.window('kodiProfile_emby', value=xbmc.translatePath("special://profile"))
# Initial logging # Initial logging
self.logMsg("Starting Monitor", 0) self.logMsg("Starting Monitor", 0)
self.logMsg("======== START %s ========" % addonName, 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("KODI Version: %s" % xbmc.getInfoLabel('System.BuildVersion'), 0)
self.logMsg("%s Version: %s" % (addonName, self.clientInfo.getVersion()), 0) self.logMsg("%s Version: %s" % (addonName, clientInfo.getVersion()), 0)
self.logMsg("Log Level: %s" % self.logLevel, 1) self.logMsg("Log Level: %s" % logLevel, 0)
# Reset window props for profile switch # Reset window props for profile switch
WINDOW.clearProperty('Server_online') utils.window('Server_online', clear=True)
WINDOW.clearProperty('Server_status') utils.window('Server_status', clear=True)
WINDOW.clearProperty('startup') utils.window('startup', clear=True)
WINDOW.clearProperty('OnWakeSync') utils.window('OnWakeSync', clear=True)
WINDOW.clearProperty('minDBVersionCheck') utils.window('minDBVersionCheck', clear=True)
# Set min DB version # 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 = [ propNames = [
"index","path","title","content", "index","path","title","content",
@ -84,7 +95,7 @@ class Service():
totalNodes = int(embyProperty) totalNodes = int(embyProperty)
for i in range(totalNodes): for i in range(totalNodes):
for prop in propNames: 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): def logMsg(self, msg, lvl=1):
@ -93,7 +104,7 @@ class Service():
def ServiceEntryPoint(self): def ServiceEntryPoint(self):
WINDOW = self.WINDOW kodiProfile = xbmc.translatePath("special://profile")
# Server auto-detect # Server auto-detect
ConnectionManager().checkServer() ConnectionManager().checkServer()
@ -117,7 +128,7 @@ class Service():
# 2. User is set # 2. User is set
# 3. User has access to the server # 3. User has access to the server
if WINDOW.getProperty('Server_online') == "true": if utils.window('Server_online') == "true":
# Emby server is online # Emby server is online
# Verify if user is set and has access to the server # Verify if user is set and has access to the server
@ -133,7 +144,7 @@ class Service():
# Update positionticks # Update positionticks
if player.played_information.get(currentFile) is not None: 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 td = datetime.today() - lastProgressUpdate
secDiff = td.seconds secDiff = td.seconds
@ -143,12 +154,12 @@ class Service():
player.reportPlayback() player.reportPlayback()
lastProgressUpdate = datetime.today() lastProgressUpdate = datetime.today()
elif WINDOW.getProperty('commandUpdate') == "true": elif utils.window('commandUpdate') == "true":
# Received a remote control command that # Received a remote control command that
# requires updating immediately # requires updating immediately
WINDOW.clearProperty('commandUpdate') utils.window('commandUpdate', clear=True)
player.reportPlayback() player.reportPlayback()
lastProgressUpdate = datetime.today() lastProgressUpdate = da4tetime.today()
except Exception as e: except Exception as e:
self.logMsg("Exception in Playback Monitor Service: %s" % e, 1) self.logMsg("Exception in Playback Monitor Service: %s" % e, 1)
@ -191,7 +202,7 @@ class Service():
# Verify access with an API call # Verify access with an API call
user.hasAccess() user.hasAccess()
if WINDOW.getProperty('Server_online') != "true": if utils.window('Server_online') != "true":
# Server went offline # Server went offline
break break
@ -213,7 +224,7 @@ class Service():
# Alert the user and suppress future warning # Alert the user and suppress future warning
if self.server_online: if self.server_online:
self.logMsg("Server is offline.", 1) 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) 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 self.server_online = False
@ -230,7 +241,7 @@ class Service():
self.server_online = True self.server_online = True
self.logMsg("Server is online and ready.", 1) self.logMsg("Server is online and ready.", 1)
WINDOW.setProperty('Server_online', "true") utils.window('Server_online', value="true")
# Start the User client # Start the User client
if self.newUserClient is None: if self.newUserClient is None:
@ -242,11 +253,19 @@ class Service():
# Abort was requested while waiting. # Abort was requested while waiting.
break 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): if self.KodiMonitor.waitForAbort(1):
# Abort was requested while waiting. We should exit # Abort was requested while waiting. We should exit
break 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 # We use Kodi pathsubstitution to allow for music to play outside network
# The setting needs to be set before Kodi starts. # The setting needs to be set before Kodi starts.
if utils.settings('enableMusicSync') == "true" and utils.settings('directstreammusic') == "true": if utils.settings('enableMusicSync') == "true" and utils.settings('directstreammusic') == "true":