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,
|
||||
'recentepisodes': entrypoint.getRecentEpisodes,
|
||||
'refreshplaylist': entrypoint.refreshPlaylist,
|
||||
'companion': entrypoint.plexCompanion
|
||||
'companion': entrypoint.plexCompanion,
|
||||
'switchuser': entrypoint.switchPlexUser
|
||||
}
|
||||
|
||||
if "extrafanart" in sys.argv[0]:
|
||||
|
@ -98,9 +99,6 @@ class Main:
|
|||
# Other functions
|
||||
if mode == "settings":
|
||||
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"):
|
||||
if utils.window('emby_dbScan') != "true":
|
||||
import librarysync
|
||||
|
|
|
@ -161,7 +161,7 @@ class PlexAPI():
|
|||
"""
|
||||
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
|
||||
'username':
|
||||
|
|
|
@ -119,6 +119,12 @@ def doMainListing():
|
|||
elif path and not xbmc.getCondVisibility("Window.IsActive(VideoLibrary) | Window.IsActive(Pictures) | Window.IsActive(MusicLibrary)"):
|
||||
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
|
||||
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")
|
||||
|
@ -257,6 +263,27 @@ def addUser():
|
|||
utils.window('EmbyAdditionalUserPosition.%s' % userid, value=str(count))
|
||||
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 #####
|
||||
def getThemeMedia():
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ import clientinfo
|
|||
import downloadutils
|
||||
|
||||
import PlexAPI
|
||||
import librarysync
|
||||
|
||||
##################################################################################################
|
||||
|
||||
|
@ -21,7 +22,7 @@ import PlexAPI
|
|||
class UserClient(threading.Thread):
|
||||
|
||||
# Borg - multiple instances, shared state
|
||||
_shared_state = {}
|
||||
__shared_state = {}
|
||||
|
||||
stopClient = False
|
||||
auth = True
|
||||
|
@ -39,7 +40,7 @@ class UserClient(threading.Thread):
|
|||
|
||||
def __init__(self):
|
||||
|
||||
self.__dict__ = self._shared_state
|
||||
self.__dict__ = self.__shared_state
|
||||
self.addon = xbmcaddon.Addon()
|
||||
|
||||
self.addonName = clientinfo.ClientInfo().getAddonName()
|
||||
|
@ -267,6 +268,7 @@ class UserClient(threading.Thread):
|
|||
def authenticate(self):
|
||||
# Get /profile/addon_data
|
||||
plx = PlexAPI.PlexAPI()
|
||||
lib = librarysync.LibrarySync()
|
||||
addondir = xbmc.translatePath(self.addon.getAddonInfo('profile')).decode('utf-8')
|
||||
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 userId: %s" % self.currUserId, 1)
|
||||
self.logMsg("Current accessToken: xxxx", 1)
|
||||
lib.resumeThread()
|
||||
return
|
||||
|
||||
##### AUTHENTICATE USER #####
|
||||
|
@ -310,11 +313,17 @@ class UserClient(threading.Thread):
|
|||
# Check connection
|
||||
if plx.CheckConnection(server, accessToken) == 200:
|
||||
self.currUser = username
|
||||
dialog = xbmcgui.Dialog()
|
||||
if username:
|
||||
xbmcgui.Dialog().notification(self.addonName, "Welcome %s"
|
||||
% username)
|
||||
dialog.notification(self.addonName,
|
||||
"Welcome %s" % username,
|
||||
"special://home/addons/plugin.video."
|
||||
"plexkodiconnect/icon.png")
|
||||
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('userId%s' % username, value=userId)
|
||||
self.logMsg("User authenticated with an access token", 1)
|
||||
|
@ -322,8 +331,10 @@ class UserClient(threading.Thread):
|
|||
utils.window('emby_serverStatus', clear=True)
|
||||
# Write plex_machineIdentifier to window
|
||||
plex_machineIdentifier = utils.settings('plex_machineIdentifier')
|
||||
utils.windows('plex_machineIdentifier', plex_machineIdentifier)
|
||||
utils.window('plex_machineIdentifier', plex_machineIdentifier)
|
||||
self.retry = 0
|
||||
# Make sure that lib sync thread is not paused
|
||||
lib.resumeThread()
|
||||
else:
|
||||
self.logMsg("Error: user authentication failed.", -1)
|
||||
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):
|
||||
"""
|
||||
A decorator adding logging capabilities.
|
||||
|
@ -402,7 +416,7 @@ def passwordsXML():
|
|||
|
||||
settings('networkCreds', value="")
|
||||
xbmcgui.Dialog().notification(
|
||||
heading="Emby for Kodi",
|
||||
heading='PlexKodiConnect',
|
||||
message="%s removed from passwords.xml" % credentials,
|
||||
icon="special://home/addons/plugin.video.plexkodiconnect/icon.png",
|
||||
time=1000,
|
||||
|
@ -419,7 +433,7 @@ def passwordsXML():
|
|||
dialog.ok(
|
||||
heading="Network credentials",
|
||||
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".'))
|
||||
server = dialog.input("Enter the server name or IP address")
|
||||
if not server:
|
||||
|
@ -461,7 +475,7 @@ def passwordsXML():
|
|||
etree.ElementTree(root).write(xmlpath)
|
||||
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
heading="PlexKodiConnect",
|
||||
message="%s added to passwords.xml" % server,
|
||||
icon="special://home/addons/plugin.video.plexkodiconnect/icon.png",
|
||||
time=1000,
|
||||
|
|
|
@ -61,6 +61,8 @@ class Service():
|
|||
utils.window('emby_kodiProfile', value=xbmc.translatePath("special://profile"))
|
||||
utils.window('emby_pluginpath', value=utils.settings('useDirectPaths'))
|
||||
|
||||
self.runPlexCompanion = utils.settings('plexCompanion')
|
||||
|
||||
# Initial logging
|
||||
self.logMsg("======== START %s ========" % self.addonName, 0)
|
||||
self.logMsg("Platform: %s" % (self.clientInfo.getPlatform()), 0)
|
||||
|
@ -75,7 +77,8 @@ class Service():
|
|||
"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"
|
||||
"emby_initialScan", "emby_customplaylist", "emby_playbackProps",
|
||||
"plex_runLibScan"
|
||||
]
|
||||
for prop in properties:
|
||||
utils.window(prop, clear=True)
|
||||
|
@ -108,7 +111,7 @@ class Service():
|
|||
kplayer = player.Player()
|
||||
plx = PlexAPI.PlexAPI()
|
||||
plexCompanion = PlexCompanion.PlexCompanion()
|
||||
plexCompanionDesired = utils.settings('plexCompanion')
|
||||
|
||||
# Sync and progress report
|
||||
lastProgressUpdate = datetime.today()
|
||||
|
||||
|
@ -273,7 +276,7 @@ class Service():
|
|||
|
||||
# Start the Plex Companion thread
|
||||
if not self.plexCompanion_running and \
|
||||
plexCompanionDesired == "true":
|
||||
self.runPlexCompanion == "true":
|
||||
self.plexCompanion_running = True
|
||||
plexCompanion.start()
|
||||
|
||||
|
|
Loading…
Reference in a new issue