User switch fix, part 1
This commit is contained in:
parent
613e033b48
commit
079f43c644
6 changed files with 70 additions and 17 deletions
|
@ -64,7 +64,8 @@ class Main:
|
||||||
'inprogressepisodes': entrypoint.getInProgressEpisodes,
|
'inprogressepisodes': entrypoint.getInProgressEpisodes,
|
||||||
'recentepisodes': entrypoint.getRecentEpisodes,
|
'recentepisodes': entrypoint.getRecentEpisodes,
|
||||||
'refreshplaylist': entrypoint.refreshPlaylist,
|
'refreshplaylist': entrypoint.refreshPlaylist,
|
||||||
'companion': entrypoint.plexCompanion
|
'companion': entrypoint.plexCompanion,
|
||||||
|
'switchuser': entrypoint.switchPlexUser
|
||||||
}
|
}
|
||||||
|
|
||||||
if "extrafanart" in sys.argv[0]:
|
if "extrafanart" in sys.argv[0]:
|
||||||
|
@ -98,9 +99,6 @@ class Main:
|
||||||
# Other functions
|
# Other functions
|
||||||
if mode == "settings":
|
if mode == "settings":
|
||||||
xbmc.executebuiltin('Addon.OpenSettings(plugin.video.plexkodiconnect)')
|
xbmc.executebuiltin('Addon.OpenSettings(plugin.video.plexkodiconnect)')
|
||||||
if mode == "switchuser":
|
|
||||||
xbmc.log('Requesting user switch')
|
|
||||||
utils.window('emby_serverStatus', value="401")
|
|
||||||
elif mode in ("manualsync", "repair"):
|
elif mode in ("manualsync", "repair"):
|
||||||
if utils.window('emby_dbScan') != "true":
|
if utils.window('emby_dbScan') != "true":
|
||||||
import librarysync
|
import librarysync
|
||||||
|
|
|
@ -161,7 +161,7 @@ class PlexAPI():
|
||||||
"""
|
"""
|
||||||
Prompts user to sign in by visiting https://plex.tv/pin
|
Prompts user to sign in by visiting https://plex.tv/pin
|
||||||
|
|
||||||
Writes username and token to Kodi settings file. Returns:
|
Writes plexhome, username and token to Kodi settings file. Returns:
|
||||||
{
|
{
|
||||||
'plexhome': 'true' if Plex Home, 'false' otherwise
|
'plexhome': 'true' if Plex Home, 'false' otherwise
|
||||||
'username':
|
'username':
|
||||||
|
|
|
@ -119,6 +119,12 @@ def doMainListing():
|
||||||
elif path and not xbmc.getCondVisibility("Window.IsActive(VideoLibrary) | Window.IsActive(Pictures) | Window.IsActive(MusicLibrary)"):
|
elif path and not xbmc.getCondVisibility("Window.IsActive(VideoLibrary) | Window.IsActive(Pictures) | Window.IsActive(MusicLibrary)"):
|
||||||
addDirectoryItem(label, path)
|
addDirectoryItem(label, path)
|
||||||
|
|
||||||
|
# Plex user switch, if Plex home is in use
|
||||||
|
if utils.settings('plexhome') == 'true':
|
||||||
|
addDirectoryItem("Switch Plex Home User",
|
||||||
|
"plugin://plugin.video.plexkodiconnect/"
|
||||||
|
"?mode=switchuser")
|
||||||
|
|
||||||
#experimental live tv nodes
|
#experimental live tv nodes
|
||||||
addDirectoryItem("Live Tv Channels (experimental)", "plugin://plugin.video.plexkodiconnect/?mode=browsecontent&type=tvchannels&folderid=root")
|
addDirectoryItem("Live Tv Channels (experimental)", "plugin://plugin.video.plexkodiconnect/?mode=browsecontent&type=tvchannels&folderid=root")
|
||||||
addDirectoryItem("Live Tv Recordings (experimental)", "plugin://plugin.video.plexkodiconnect/?mode=browsecontent&type=recordings&folderid=root")
|
addDirectoryItem("Live Tv Recordings (experimental)", "plugin://plugin.video.plexkodiconnect/?mode=browsecontent&type=recordings&folderid=root")
|
||||||
|
@ -257,6 +263,27 @@ def addUser():
|
||||||
utils.window('EmbyAdditionalUserPosition.%s' % userid, value=str(count))
|
utils.window('EmbyAdditionalUserPosition.%s' % userid, value=str(count))
|
||||||
count +=1
|
count +=1
|
||||||
|
|
||||||
|
|
||||||
|
def switchPlexUser():
|
||||||
|
"""
|
||||||
|
Signs out currently logged in user (if applicable). Triggers sign-in of a
|
||||||
|
new user
|
||||||
|
"""
|
||||||
|
# Guess these user avatars are a future feature. Skipping for now
|
||||||
|
# Delete any userimages. Since there's always only 1 user: position = 0
|
||||||
|
# position = 0
|
||||||
|
# utils.window('EmbyAdditionalUserImage.%s' % position, clear=True)
|
||||||
|
utils.logMsg("PLEX", "Plex home user switch requested", 0)
|
||||||
|
# Pause library sync thread - user needs to be auth in order to sync
|
||||||
|
lib = librarysync.LibrarySync()
|
||||||
|
lib.suspendThread()
|
||||||
|
# Log out currently signed in user:
|
||||||
|
utils.window('emby_serverStatus', value="401")
|
||||||
|
# Request lib sync to get user view data (e.g. watched/unwatched)
|
||||||
|
utils.window('plex_runLibScan', value='true')
|
||||||
|
# Reset Plex userdata: resume points, watched/unwatched status
|
||||||
|
|
||||||
|
|
||||||
##### THEME MUSIC/VIDEOS #####
|
##### THEME MUSIC/VIDEOS #####
|
||||||
def getThemeMedia():
|
def getThemeMedia():
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import clientinfo
|
||||||
import downloadutils
|
import downloadutils
|
||||||
|
|
||||||
import PlexAPI
|
import PlexAPI
|
||||||
|
import librarysync
|
||||||
|
|
||||||
##################################################################################################
|
##################################################################################################
|
||||||
|
|
||||||
|
@ -21,7 +22,7 @@ import PlexAPI
|
||||||
class UserClient(threading.Thread):
|
class UserClient(threading.Thread):
|
||||||
|
|
||||||
# Borg - multiple instances, shared state
|
# Borg - multiple instances, shared state
|
||||||
_shared_state = {}
|
__shared_state = {}
|
||||||
|
|
||||||
stopClient = False
|
stopClient = False
|
||||||
auth = True
|
auth = True
|
||||||
|
@ -39,7 +40,7 @@ class UserClient(threading.Thread):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
self.__dict__ = self._shared_state
|
self.__dict__ = self.__shared_state
|
||||||
self.addon = xbmcaddon.Addon()
|
self.addon = xbmcaddon.Addon()
|
||||||
|
|
||||||
self.addonName = clientinfo.ClientInfo().getAddonName()
|
self.addonName = clientinfo.ClientInfo().getAddonName()
|
||||||
|
@ -267,6 +268,7 @@ class UserClient(threading.Thread):
|
||||||
def authenticate(self):
|
def authenticate(self):
|
||||||
# Get /profile/addon_data
|
# Get /profile/addon_data
|
||||||
plx = PlexAPI.PlexAPI()
|
plx = PlexAPI.PlexAPI()
|
||||||
|
lib = librarysync.LibrarySync()
|
||||||
addondir = xbmc.translatePath(self.addon.getAddonInfo('profile')).decode('utf-8')
|
addondir = xbmc.translatePath(self.addon.getAddonInfo('profile')).decode('utf-8')
|
||||||
hasSettings = xbmcvfs.exists("%ssettings.xml" % addondir)
|
hasSettings = xbmcvfs.exists("%ssettings.xml" % addondir)
|
||||||
|
|
||||||
|
@ -294,6 +296,7 @@ class UserClient(threading.Thread):
|
||||||
self.logMsg("Current user: %s" % self.currUser, 1)
|
self.logMsg("Current user: %s" % self.currUser, 1)
|
||||||
self.logMsg("Current userId: %s" % self.currUserId, 1)
|
self.logMsg("Current userId: %s" % self.currUserId, 1)
|
||||||
self.logMsg("Current accessToken: xxxx", 1)
|
self.logMsg("Current accessToken: xxxx", 1)
|
||||||
|
lib.resumeThread()
|
||||||
return
|
return
|
||||||
|
|
||||||
##### AUTHENTICATE USER #####
|
##### AUTHENTICATE USER #####
|
||||||
|
@ -310,11 +313,17 @@ class UserClient(threading.Thread):
|
||||||
# Check connection
|
# Check connection
|
||||||
if plx.CheckConnection(server, accessToken) == 200:
|
if plx.CheckConnection(server, accessToken) == 200:
|
||||||
self.currUser = username
|
self.currUser = username
|
||||||
|
dialog = xbmcgui.Dialog()
|
||||||
if username:
|
if username:
|
||||||
xbmcgui.Dialog().notification(self.addonName, "Welcome %s"
|
dialog.notification(self.addonName,
|
||||||
% username)
|
"Welcome %s" % username,
|
||||||
|
"special://home/addons/plugin.video."
|
||||||
|
"plexkodiconnect/icon.png")
|
||||||
else:
|
else:
|
||||||
xbmcgui.Dialog().notification(self.addonName, "Welcome")
|
dialog.notification(self.addonName,
|
||||||
|
"Welcome",
|
||||||
|
"special://home/addons/plugin.video."
|
||||||
|
"plexkodiconnect/icon.png")
|
||||||
utils.settings('accessToken', value=accessToken)
|
utils.settings('accessToken', value=accessToken)
|
||||||
utils.settings('userId%s' % username, value=userId)
|
utils.settings('userId%s' % username, value=userId)
|
||||||
self.logMsg("User authenticated with an access token", 1)
|
self.logMsg("User authenticated with an access token", 1)
|
||||||
|
@ -322,8 +331,10 @@ class UserClient(threading.Thread):
|
||||||
utils.window('emby_serverStatus', clear=True)
|
utils.window('emby_serverStatus', clear=True)
|
||||||
# Write plex_machineIdentifier to window
|
# Write plex_machineIdentifier to window
|
||||||
plex_machineIdentifier = utils.settings('plex_machineIdentifier')
|
plex_machineIdentifier = utils.settings('plex_machineIdentifier')
|
||||||
utils.windows('plex_machineIdentifier', plex_machineIdentifier)
|
utils.window('plex_machineIdentifier', plex_machineIdentifier)
|
||||||
self.retry = 0
|
self.retry = 0
|
||||||
|
# Make sure that lib sync thread is not paused
|
||||||
|
lib.resumeThread()
|
||||||
else:
|
else:
|
||||||
self.logMsg("Error: user authentication failed.", -1)
|
self.logMsg("Error: user authentication failed.", -1)
|
||||||
utils.settings('accessToken', value="")
|
utils.settings('accessToken', value="")
|
||||||
|
|
|
@ -20,6 +20,20 @@ import clientinfo
|
||||||
#################################################################################################
|
#################################################################################################
|
||||||
|
|
||||||
|
|
||||||
|
def borg(cls):
|
||||||
|
"""
|
||||||
|
Dekorator to turn a class into a borg class with an added "@utils.borg"
|
||||||
|
"""
|
||||||
|
cls._state = {}
|
||||||
|
orig_init = cls.__init__
|
||||||
|
|
||||||
|
def new_init(self, *args, **kwargs):
|
||||||
|
self.__dict__ = cls._state
|
||||||
|
orig_init(self, *args, **kwargs)
|
||||||
|
cls.__init__ = new_init
|
||||||
|
return cls
|
||||||
|
|
||||||
|
|
||||||
class logDecor(object):
|
class logDecor(object):
|
||||||
"""
|
"""
|
||||||
A decorator adding logging capabilities.
|
A decorator adding logging capabilities.
|
||||||
|
@ -402,7 +416,7 @@ def passwordsXML():
|
||||||
|
|
||||||
settings('networkCreds', value="")
|
settings('networkCreds', value="")
|
||||||
xbmcgui.Dialog().notification(
|
xbmcgui.Dialog().notification(
|
||||||
heading="Emby for Kodi",
|
heading='PlexKodiConnect',
|
||||||
message="%s removed from passwords.xml" % credentials,
|
message="%s removed from passwords.xml" % credentials,
|
||||||
icon="special://home/addons/plugin.video.plexkodiconnect/icon.png",
|
icon="special://home/addons/plugin.video.plexkodiconnect/icon.png",
|
||||||
time=1000,
|
time=1000,
|
||||||
|
@ -419,7 +433,7 @@ def passwordsXML():
|
||||||
dialog.ok(
|
dialog.ok(
|
||||||
heading="Network credentials",
|
heading="Network credentials",
|
||||||
line1= (
|
line1= (
|
||||||
"Input the server name or IP address as indicated in your emby library paths. "
|
"Input the server name or IP address as indicated in your plex library paths. "
|
||||||
'For example, the server name: \\\\SERVER-PC\\path\\ is "SERVER-PC".'))
|
'For example, the server name: \\\\SERVER-PC\\path\\ is "SERVER-PC".'))
|
||||||
server = dialog.input("Enter the server name or IP address")
|
server = dialog.input("Enter the server name or IP address")
|
||||||
if not server:
|
if not server:
|
||||||
|
@ -461,7 +475,7 @@ def passwordsXML():
|
||||||
etree.ElementTree(root).write(xmlpath)
|
etree.ElementTree(root).write(xmlpath)
|
||||||
|
|
||||||
dialog.notification(
|
dialog.notification(
|
||||||
heading="Emby for Kodi",
|
heading="PlexKodiConnect",
|
||||||
message="%s added to passwords.xml" % server,
|
message="%s added to passwords.xml" % server,
|
||||||
icon="special://home/addons/plugin.video.plexkodiconnect/icon.png",
|
icon="special://home/addons/plugin.video.plexkodiconnect/icon.png",
|
||||||
time=1000,
|
time=1000,
|
||||||
|
|
|
@ -61,6 +61,8 @@ class Service():
|
||||||
utils.window('emby_kodiProfile', value=xbmc.translatePath("special://profile"))
|
utils.window('emby_kodiProfile', value=xbmc.translatePath("special://profile"))
|
||||||
utils.window('emby_pluginpath', value=utils.settings('useDirectPaths'))
|
utils.window('emby_pluginpath', value=utils.settings('useDirectPaths'))
|
||||||
|
|
||||||
|
self.runPlexCompanion = utils.settings('plexCompanion')
|
||||||
|
|
||||||
# Initial logging
|
# Initial logging
|
||||||
self.logMsg("======== START %s ========" % self.addonName, 0)
|
self.logMsg("======== START %s ========" % self.addonName, 0)
|
||||||
self.logMsg("Platform: %s" % (self.clientInfo.getPlatform()), 0)
|
self.logMsg("Platform: %s" % (self.clientInfo.getPlatform()), 0)
|
||||||
|
@ -75,7 +77,8 @@ class Service():
|
||||||
"emby_online", "emby_serverStatus", "emby_onWake",
|
"emby_online", "emby_serverStatus", "emby_onWake",
|
||||||
"emby_syncRunning", "emby_dbCheck", "emby_kodiScan",
|
"emby_syncRunning", "emby_dbCheck", "emby_kodiScan",
|
||||||
"emby_shouldStop", "emby_currUser", "emby_dbScan", "emby_sessionId",
|
"emby_shouldStop", "emby_currUser", "emby_dbScan", "emby_sessionId",
|
||||||
"emby_initialScan", "emby_customplaylist", "emby_playbackProps"
|
"emby_initialScan", "emby_customplaylist", "emby_playbackProps",
|
||||||
|
"plex_runLibScan"
|
||||||
]
|
]
|
||||||
for prop in properties:
|
for prop in properties:
|
||||||
utils.window(prop, clear=True)
|
utils.window(prop, clear=True)
|
||||||
|
@ -108,7 +111,7 @@ class Service():
|
||||||
kplayer = player.Player()
|
kplayer = player.Player()
|
||||||
plx = PlexAPI.PlexAPI()
|
plx = PlexAPI.PlexAPI()
|
||||||
plexCompanion = PlexCompanion.PlexCompanion()
|
plexCompanion = PlexCompanion.PlexCompanion()
|
||||||
plexCompanionDesired = utils.settings('plexCompanion')
|
|
||||||
# Sync and progress report
|
# Sync and progress report
|
||||||
lastProgressUpdate = datetime.today()
|
lastProgressUpdate = datetime.today()
|
||||||
|
|
||||||
|
@ -273,7 +276,7 @@ class Service():
|
||||||
|
|
||||||
# Start the Plex Companion thread
|
# Start the Plex Companion thread
|
||||||
if not self.plexCompanion_running and \
|
if not self.plexCompanion_running and \
|
||||||
plexCompanionDesired == "true":
|
self.runPlexCompanion == "true":
|
||||||
self.plexCompanion_running = True
|
self.plexCompanion_running = True
|
||||||
plexCompanion.start()
|
plexCompanion.start()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue