diff --git a/README.md b/README.md
index f9601277..1e9a4027 100644
--- a/README.md
+++ b/README.md
@@ -14,9 +14,16 @@
7. Once you're succesfully authenticated to your Plex server, the initial sync will start.
8. The first sync of the Plex server to local Kodi database may take a LONG time. With my setup (~400 movies, ~600 episodes, couple of Test music albums and a very powerful NAS), sync take approximately 5 minutes.
9. Once the full sync is done, you can browse your media in Kodi, syncs will be automatically done in the background.
+10. Restart!
Again, this is beta. You have been warned. It's a given that you will need to fully resync and reset your setup on a regular basis.
+**Having Problems? Then thanks for your log files**
+
+1. Activate a more detailed logging for KodiPlexConnect: Settings -> Advanced -> "Debug"
+2. Follow the instructions here: http://kodi.wiki/view/Log_file/Easy
+3. Post the link to your log (that you posted e.g. here: http://xbmclogs.com/) on https://forums.plex.tv/discussion/210023/plexkodiconnect-supercharge-your-plex-kodi-connection
+
### Welcome to PlexKodiConnect
**Connect your Plex Media Server to a Kodi Front End**
@@ -44,6 +51,7 @@ Guess what, this is BETA. Currently these features are working:
**Known Issues:**
- Windows users: Kodi Helix 14.2 RC1 required - other versions will result in errors with recently added items etc.
- You must have a static IP address for your Plex media server if you plan to use Plex Music features. This is due to the way Kodi works and cannot be helped.
+- PlexKodiConnect continuously polls the Plex Media Server for changes. If something on the PMS changed, this change is synced to Kodi. Hence if you rescan your entire library, a long PlexKodiConnect re-sync is triggered.
- This is a BETA version and could potentially set fire to your Raspi
diff --git a/default.py b/default.py
index d36a29da..e4b5173b 100644
--- a/default.py
+++ b/default.py
@@ -8,7 +8,6 @@ import urlparse
import xbmc
import xbmcaddon
-import xbmcgui
#################################################################################################
@@ -67,7 +66,8 @@ class Main:
'refreshplaylist': entrypoint.refreshPlaylist,
'companion': entrypoint.plexCompanion,
'switchuser': entrypoint.switchPlexUser,
- 'deviceid': entrypoint.resetDeviceId
+ 'deviceid': entrypoint.resetDeviceId,
+ 'doPlexTvLogin': entrypoint.doPlexTvLogin
}
if "extrafanart" in sys.argv[0]:
diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml
index 6aa9d3ce..ee753cee 100644
--- a/resources/language/English/strings.xml
+++ b/resources/language/English/strings.xml
@@ -310,7 +310,7 @@
Access is enabled
Enter password for user:
Invalid username or password
- Failed to authenticate too many times
+ Failed to authenticate too many times. Reset in the settings.
Unable to direct play
Direct play failed 3 times. Enabled play from HTTP.
Choose the audio stream
@@ -360,6 +360,11 @@
[COLOR yellow]Perform local database reset (full resync)[/COLOR]
[COLOR yellow]Cache all images to Kodi texture cache[/COLOR]
[COLOR yellow]Sync Emby Theme Media to Kodi[/COLOR]
+ (local)
+ Failed to authenticate. Did you login to plex.tv?
+ [COLOR yellow]Log into plex.tv[/COLOR]
+ Automatically log into plex.tv on startup
+
Switch Plex Home User
diff --git a/resources/language/German/strings.xml b/resources/language/German/strings.xml
index 6ae78fc0..4c44a3af 100644
--- a/resources/language/German/strings.xml
+++ b/resources/language/German/strings.xml
@@ -250,6 +250,8 @@
Unterdrücke Server-Verbindungsmeldungen beim Starten
Benutze lokale Pfade anstelle von Addon-Umleitungen beim Abspielen
+ Plex Media Server Authorisierung ist zu häufig fehlgeschlagen. In den Einstellungen können die Anzahl erfolgloser Versuche zurückgesetzt werden.
+
Aktiviert
Zurücksetzen
@@ -289,6 +291,10 @@
[COLOR yellow]Lokale Datenbank zurücksetzen (kompletter Resync nötig)[/COLOR]
[COLOR yellow]Alle Plex Bilder in Kodi zwischenspeichern[/COLOR]
[COLOR yellow]Plex Themes zu Kodi synchronisieren[/COLOR]
+ (lokal)
+ Plex Media Server Authentifizierung fehlgeschlagen. Haben Sie sich bei plex.tv eingeloggt?
+ [COLOR yellow]Bei plex.tv einloggen[/COLOR]
+ Automatisch beim Starten bei plex.tv einloggen
Plex Home Benutzer wechseln
diff --git a/resources/lib/PlexAPI.py b/resources/lib/PlexAPI.py
index 6a2d2bfa..a8330722 100644
--- a/resources/lib/PlexAPI.py
+++ b/resources/lib/PlexAPI.py
@@ -88,16 +88,25 @@ class PlexAPI():
def GetPlexLoginFromSettings(self):
"""
- Returns empty strings if not found.
+ Returns a dict:
+ 'plexLogin': utils.settings('plexLogin'),
+ 'plexToken': utils.settings('plexToken'),
+ 'plexhome': utils.settings('plexhome'),
+ 'plexid': utils.settings('plexid'),
+ 'myplexlogin': utils.settings('myplexlogin')
+
+ Returns empty strings '' for a setting if not found.
myplexlogin is 'true' if user opted to log into plex.tv (the default)
plexhome is 'true' if plex home is used (the default)
"""
- plexLogin = utils.settings('plexLogin')
- plexToken = utils.settings('plexToken')
- myplexlogin = utils.settings('myplexlogin')
- plexhome = utils.settings('plexhome')
- return (myplexlogin, plexhome, plexLogin, plexToken)
+ return {
+ 'plexLogin': utils.settings('plexLogin'),
+ 'plexToken': utils.settings('plexToken'),
+ 'plexhome': utils.settings('plexhome'),
+ 'plexid': utils.settings('plexid'),
+ 'myplexlogin': utils.settings('myplexlogin')
+ }
def GetPlexLoginAndPassword(self):
"""
@@ -178,18 +187,19 @@ class PlexAPI():
return False
count = 0
# Wait for approx 30 seconds (since the PIN is not visible anymore :-))
- while count < 6:
+ while count < 30:
xml = self.CheckPlexTvSignin(identifier)
if xml:
break
- # Wait for 5 seconds
- xbmc.sleep(5000)
+ # Wait for 1 seconds
+ xbmc.sleep(1000)
count += 1
if not xml:
# Could not sign in to plex.tv Try again later
dialog.ok(self.addonName, string(39305))
return False
# Parse xml
+ userid = xml.attrib.get('id')
home = xml.get('home', '0')
if home == '1':
home = 'true'
@@ -202,11 +212,15 @@ class PlexAPI():
'plexhome': home,
'username': username,
'avatar': avatar,
- 'token': token
+ 'token': token,
+ 'plexid': userid
}
utils.settings('plexLogin', username)
utils.settings('plexToken', token)
utils.settings('plexhome', home)
+ utils.settings('plexid', userid)
+ # Let Kodi log into plex.tv on startup from now on
+ utils.settings('myplexlogin', 'true')
return result
def CheckPlexTvSignin(self, identifier):
@@ -307,7 +321,7 @@ class PlexAPI():
return False
return xml
- def CheckConnection(self, url, token):
+ def CheckConnection(self, url, token=None):
"""
Checks connection to a Plex server, available at url. Can also be used
to check for connection with plex.tv.
@@ -735,7 +749,6 @@ class PlexAPI():
xargs['X-Plex-Token'] = authtoken
self.logMsg("URL for XML download: %s%s" % (baseURL, path), 1)
- self.logMsg("xargs: %s" % xargs, 1)
request = urllib2.Request(baseURL+path, None, xargs)
request.add_header('User-agent', 'PlexDB')
@@ -1090,11 +1103,14 @@ class PlexAPI():
if user['protected'] == '1':
dialog = xbmcgui.Dialog()
# Please enter pin for user
+ self.logMsg('Asking for users PIN', 1)
pin = dialog.input(
string(39307) + selected_user,
type=xbmcgui.INPUT_NUMERIC,
- option=xbmcgui.ALPHANUM_HIDE_INPUT
- )
+ option=xbmcgui.ALPHANUM_HIDE_INPUT)
+ # User chose to cancel
+ if pin is None:
+ break
else:
pin = None
# Switch to this Plex Home user, if applicable
@@ -1108,18 +1124,20 @@ class PlexAPI():
if not username:
dialog = xbmcgui.Dialog()
# Could not login user, please try again
- dialog.ok(
+ if not dialog.yesno(
self.addonName,
string(39308) + selected_user,
string(39309)
- )
+ ):
+ # User chose to cancel
+ break
# Successfully retrieved: break out of while loop
else:
break
trials += trials
if not username:
xbmc.executebuiltin('Addon.OpenSettings(%s)' % self.addonId)
- return ('', '', '', '')
+ return ('', '', '')
return (username, user['id'], usertoken)
def PlexSwitchHomeUser(self, userId, pin, token, machineId):
diff --git a/resources/lib/entrypoint.py b/resources/lib/entrypoint.py
index ab454064..7046b9c1 100644
--- a/resources/lib/entrypoint.py
+++ b/resources/lib/entrypoint.py
@@ -73,6 +73,20 @@ def plexCompanion(fullurl, params):
title, "Not knowing what to do for now - no playQueue sent", -1)
+def doPlexTvLogin():
+ """
+ Triggers login to plex.tv
+ """
+ # Suspend the user client during procedure
+ utils.window('suspend_Userclient', value='true')
+ import initialsetup
+ initialsetup.InitialSetup().setup(forcePlexTV=True)
+ utils.logMsg("PLEX", "Reset login attempts.", 1)
+ utils.window('emby_serverStatus', value="Auth")
+ # Restart user client
+ utils.window('suspend_Userclient', clear=True)
+
+
def PassPlaylist(xml, resume=None):
"""
resume in KodiTime - seconds.
diff --git a/resources/lib/initialsetup.py b/resources/lib/initialsetup.py
index 0532a41b..3544149d 100644
--- a/resources/lib/initialsetup.py
+++ b/resources/lib/initialsetup.py
@@ -30,7 +30,7 @@ class InitialSetup():
self.userClient = userclient.UserClient()
self.plx = PlexAPI.PlexAPI()
- def setup(self):
+ def setup(self, forcePlexTV=False):
"""
Initial setup. Run once upon startup.
Check server, user, direct paths, music, direct stream if not direct
@@ -42,16 +42,24 @@ class InitialSetup():
server = self.userClient.getServer()
clientId = self.clientInfo.getDeviceId()
serverid = utils.settings('plex_machineIdentifier')
- myplexlogin, plexhome, plexLogin, plexToken = \
- self.plx.GetPlexLoginFromSettings()
+ # Get Plex credentials from settings file, if they exist
+ plexdict = self.plx.GetPlexLoginFromSettings()
+ myplexlogin = plexdict['myplexlogin']
+ plexLogin = plexdict['plexLogin']
+ plexToken = plexdict['plexToken']
+ plexid = plexdict['plexid']
+ self.logMsg('Plex info retrieved from settings: %s' % plexdict, 1)
+
dialog = xbmcgui.Dialog()
# Optionally sign into plex.tv. Will not be called on very first run
# as plexToken will be ''
- if plexToken and myplexlogin == 'true':
+ if (plexToken and myplexlogin == 'true' and forcePlexTV is False):
chk = self.plx.CheckConnection('plex.tv', plexToken)
- # HTTP Error: unauthorized
+ # HTTP Error: unauthorized. Token is no longer valid
if chk == 401:
+ # Delete token in the settings
+ utils.settings('plexToken', value='')
# Could not login, please try again
dialog.ok(
self.addonName,
@@ -61,25 +69,28 @@ class InitialSetup():
if result:
plexLogin = result['username']
plexToken = result['token']
+ plexid = result['plexid']
elif chk is False or chk >= 400:
+ # Problems connecting to plex.tv. Network or internet issue?
dialog.ok(
self.addonName,
string(39010)
)
# If a Plex server IP has already been set, return.
- if server:
+ if server and forcePlexTV is False:
self.logMsg("Server is already set.", 0)
self.logMsg("url: %s, Plex machineIdentifier: %s"
% (server, serverid), 0)
return
# If not already retrieved myplex info, optionally let user sign in
- # to plex.tv.
- if not plexToken and myplexlogin == 'true':
+ # to plex.tv. This DOES get called on very first install run
+ if ((not plexToken and myplexlogin == 'true') or forcePlexTV):
result = self.plx.PlexTvSignInWithPin()
if result:
plexLogin = result['username']
plexToken = result['token']
+ plexid = result['plexid']
# Get g_PMS list of servers (saved to plx.g_PMS)
while True:
tokenDict = {'MyPlexToken': plexToken} if plexToken else {}
@@ -104,8 +115,8 @@ class InitialSetup():
break
for server in serverlist:
if server['local'] == '1':
- # server is in the same network as client
- dialoglist.append(str(server['name']) + ' (nearby)')
+ # server is in the same network as client. Add "local"
+ dialoglist.append(str(server['name']) + string(39022))
else:
dialoglist.append(str(server['name']))
resp = dialog.select(
@@ -127,6 +138,8 @@ class InitialSetup():
chk = self.plx.CheckConnection(url, server['accesstoken'])
# Unauthorized
if chk == 401:
+ # Not yet authorized for Plex server
+ # Please sign in to plex.tv
dialog.ok(self.addonName,
string(39013) + str(server['name']),
string(39014))
@@ -134,13 +147,14 @@ class InitialSetup():
if result:
plexLogin = result['username']
plexToken = result['token']
+ plexid = result['plexid']
else:
# Exit while loop if user cancels
break
# Problems connecting
elif chk >= 400 or chk is False:
- resp = dialog.yesno(self.addonName,
- string(39015))
+ # Problems connecting to server. Pick another server?
+ resp = dialog.yesno(self.addonName, string(39015))
# Exit while loop if user chooses No
if not resp:
break
@@ -150,6 +164,11 @@ class InitialSetup():
break
if not isconnected:
# Enter Kodi settings instead
+ if dialog.yesno(
+ heading=self.addonName,
+ line1=string(39016)):
+ self.logMsg("User opted to disable Plex music library.", 1)
+ utils.settings('enableMusic', value="false")
xbmc.executebuiltin('Addon.OpenSettings(%s)' % self.addonId)
return
# Write to Kodi settings file
@@ -160,7 +179,7 @@ class InitialSetup():
utils.settings('https', 'true')
else:
utils.settings('https', 'false')
- self.logMsg("Wrote to Kodi user settings file:", 0)
+ self.logMsg("Writing to Kodi user settings file", 0)
self.logMsg("PMS machineIdentifier: %s, ip: %s, port: %s, https: %s "
% (activeServer, server['ip'], server['port'],
server['scheme']), 0)
@@ -178,6 +197,9 @@ class InitialSetup():
# self.logMsg("User opted to use direct paths.", 1)
# utils.settings('useDirectPaths', value="1")
+ if forcePlexTV:
+ return
+
if dialog.yesno(
heading=self.addonName,
line1=string(39016)):
diff --git a/resources/lib/itemtypes.py b/resources/lib/itemtypes.py
index 88731aba..0baa9d75 100644
--- a/resources/lib/itemtypes.py
+++ b/resources/lib/itemtypes.py
@@ -369,7 +369,6 @@ class Movies(Items):
if extra['extraType'] == '1':
trailer = ("plugin://plugin.video.plexkodiconnect/trailer/?"
"id=%s&mode=play") % extra['key']
- self.logMsg("Trailer for %s: %s" % (itemid, trailer), 2)
break
##### GET THE FILE AND PATH #####
@@ -403,9 +402,7 @@ class Movies(Items):
# Set plugin path and media flags using real filename
path = "plugin://plugin.video.plexkodiconnect.movies/"
params = {
-
- #'filename': filename.encode('utf-8'),
- 'filename': filename,
+ 'filename': filename.encode('utf-8'),
'id': itemid,
'dbid': movieid,
'mode': "play"
@@ -1257,7 +1254,7 @@ class TVShows(Items):
params = {
#'filename': filename.encode('utf-8'),
- 'filename': filename,
+ 'filename': filename.encode('utf-8'),
'id': itemid,
'dbid': episodeid,
'mode': "play"
diff --git a/resources/lib/librarysync.py b/resources/lib/librarysync.py
index fa7a760b..4e685462 100644
--- a/resources/lib/librarysync.py
+++ b/resources/lib/librarysync.py
@@ -165,7 +165,9 @@ class ThreadedShowSyncInfo(Thread):
downloadLock = self.locks[0]
processLock = self.locks[1]
dialog.create("%s: Sync %s: %s items"
- % (self.addonName, self.itemType, str(total)),
+ % (self.addonName.encode('utf-8'),
+ self.itemType.encode('utf-8'),
+ str(total)),
"Starting")
global getMetadataCount
global processMetadataCount
@@ -188,7 +190,7 @@ class ThreadedShowSyncInfo(Thread):
percentage,
message="Downloaded: %s. Processed: %s: %s"
% (getMetadataProgress, processMetadataProgress,
- viewName))
+ viewName.decode('utf-8')))
except:
# Wierd formating of the string viewName?!?
pass
@@ -819,7 +821,7 @@ class LibrarySync(Thread):
viewName,
viewId)
self.GetAndProcessXMLs(itemType)
- self.logMsg("Processed view %s with ID %s" % (viewName, viewId), 1)
+ self.logMsg("Processed view", 1)
# Update viewstate
for view in views:
if self.threadStopped():
diff --git a/resources/lib/userclient.py b/resources/lib/userclient.py
index f4f6dbc2..2a31f58e 100644
--- a/resources/lib/userclient.py
+++ b/resources/lib/userclient.py
@@ -18,6 +18,7 @@ import PlexAPI
@utils.logging
+@utils.ThreadMethodsAdditionalSuspend('suspend_Userclient')
@utils.ThreadMethods
class UserClient(threading.Thread):
@@ -57,8 +58,11 @@ class UserClient(threading.Thread):
username = utils.settings('username')
if not username:
- self.logMsg("No username saved.", 2)
- return ""
+ self.logMsg("No username saved, trying to get Plex username", 0)
+ username = utils.settings('plexLogin')
+ if not username:
+ self.logMsg("Also no Plex username found", 0)
+ return ""
return username
@@ -71,13 +75,14 @@ class UserClient(threading.Thread):
return logLevel
- def getUserId(self):
+ def getUserId(self, username=None):
log = self.logMsg
window = utils.window
settings = utils.settings
- username = self.getUsername()
+ if username is None:
+ username = self.getUsername()
w_userId = window('emby_currUser')
s_userId = settings('userId%s' % username)
@@ -87,32 +92,34 @@ class UserClient(threading.Thread):
# Save access token if it's missing from settings
settings('userId%s' % username, value=w_userId)
log("Returning userId from WINDOW for username: %s UserId: %s"
- % (username, w_userId), 2)
+ % (username, w_userId), 1)
return w_userId
# Verify the settings
elif s_userId:
log("Returning userId from SETTINGS for username: %s userId: %s"
- % (username, s_userId), 2)
+ % (username, s_userId), 1)
return s_userId
# No userId found
else:
- log("No userId saved for username: %s." % username, 1)
+ log("No userId saved for username: %s. Trying to get Plex ID"
+ % username, 0)
+ plexId = settings('plexid')
+ if not plexId:
+ log('Also no Plex ID found in settings', 0)
+ return ''
+ log('Using Plex ID %s as userid for username: %s'
+ % (plexId, username))
+ settings('userId%s' % username, value=plexId)
+ return plexId
def getServer(self, prefix=True):
settings = utils.settings
- alternate = settings('altip') == "true"
- if alternate:
- # Alternate host
- HTTPS = settings('secondhttps') == "true"
- host = settings('secondipaddress')
- port = settings('secondport')
- else:
- # Original host
- HTTPS = settings('https') == "true"
- host = settings('ipaddress')
- port = settings('port')
+ # Original host
+ HTTPS = settings('https') == "true"
+ host = settings('ipaddress')
+ port = settings('port')
server = host + ":" + port
@@ -132,14 +139,16 @@ class UserClient(threading.Thread):
elif not prefix:
return server
- def getToken(self):
+ def getToken(self, username=None, userId=None):
log = self.logMsg
window = utils.window
settings = utils.settings
- username = self.getUsername()
- userId = self.getUserId()
+ if username is None:
+ username = self.getUsername()
+ if userId is None:
+ userId = self.getUserId()
w_token = window('emby_accessToken%s' % userId)
s_token = settings('accessToken')
@@ -188,7 +197,7 @@ class UserClient(threading.Thread):
return s_cert
def setUserPref(self):
-
+ self.logMsg('Setting user preferences', 0)
url = PlexAPI.PlexAPI().GetUserArtworkURL(self.currUser)
if url:
utils.window('EmbyUserImage', value=url)
@@ -235,17 +244,16 @@ class UserClient(threading.Thread):
log("Access is granted.", 1)
self.HasAccess = True
window('emby_serverStatus', clear=True)
- xbmcgui.Dialog().notification("Emby for Kodi", utils.language(33007))
+ xbmcgui.Dialog().notification(self.addonName, utils.language(33007))
def loadCurrUser(self, authenticated=False):
-
+ self.logMsg('Loading current user', 0)
window = utils.window
doUtils = self.doUtils
username = self.getUsername()
userId = self.getUserId()
- # Only to be used if token exists
self.currUserId = userId
self.currServer = self.getServer()
self.currToken = self.getToken()
@@ -253,18 +261,23 @@ class UserClient(threading.Thread):
self.ssl = self.getSSLverify()
self.sslcert = self.getSSL()
- # Test the validity of current token
if authenticated is False:
- url = "%s/clients" % (self.currServer)
+ self.logMsg('Testing validity of current token', 0)
window('emby_currUser', value=userId)
window('plex_username', value=username)
window('emby_accessToken%s' % userId, value=self.currToken)
- result = doUtils.downloadUrl(url)
-
- if result == 401:
- # Token is no longer valid
+ res = PlexAPI.PlexAPI().CheckConnection(
+ self.currServer, self.currToken)
+ if res is False:
+ self.logMsg('Answer from PMS is not as expected. Retrying', -1)
+ return False
+ elif res == 401:
+ self.logMsg('Token is no longer valid', -1)
self.resetClient()
return False
+ elif res >= 400:
+ self.logMsg('Answer from PMS is not as expected. Retrying', -1)
+ return False
# Set to windows property
window('emby_currUser', value=userId)
@@ -274,6 +287,9 @@ class UserClient(threading.Thread):
window('emby_server_%s' % userId, value=self.getServer(prefix=False))
window('plex_machineIdentifier', value=self.machineIdentifier)
+ window('emby_serverStatus', clear=True)
+ window('suspend_LibraryThread', clear=True)
+
# Set DownloadUtils values
doUtils.setUsername(username)
doUtils.setUserId(self.currUserId)
@@ -292,52 +308,49 @@ class UserClient(threading.Thread):
return True
def authenticate(self):
-
log = self.logMsg
+ log('Authenticating user', 1)
lang = utils.language
window = utils.window
settings = utils.settings
dialog = xbmcgui.Dialog()
# Get /profile/addon_data
- plx = PlexAPI.PlexAPI()
addondir = xbmc.translatePath(self.addon.getAddonInfo('profile')).decode('utf-8')
hasSettings = xbmcvfs.exists("%ssettings.xml" % addondir)
- username = self.getUsername()
- userId = settings('userId%s' % username)
- server = self.getServer()
-
# If there's no settings.xml
if not hasSettings:
- log("No settings.xml found.", 1)
+ log("Error, no settings.xml found.", -1)
self.auth = False
return
+ server = self.getServer()
# If no user information
- elif not server:
+ if not server:
log("Missing server information.", 0)
self.auth = False
return
- # If there's a token, load the user
- elif self.getToken():
- result = self.loadCurrUser()
- if result is False:
+ username = self.getUsername()
+ userId = self.getUserId(username)
+ # If there's a token, load the user
+ if self.getToken(username=username, userId=userId):
+ if self.loadCurrUser() is False:
pass
else:
+ # We successfully loaded a user
log("Current user: %s" % self.currUser, 1)
log("Current userId: %s" % self.currUserId, 1)
log("Current accessToken: xxxx", 1)
-
- window('suspend_LibraryThread', clear=True)
return
# AUTHENTICATE USER #####
+ plx = PlexAPI.PlexAPI()
# Choose Plex user login
- myplexlogin, plexhome, plexLogin, dont_use_accessToken = \
- plx.GetPlexLoginFromSettings()
- log("myplexlogin: %s, plexhome: %s, plexLogin: %s"
- % (myplexlogin, plexhome, plexLogin), 2)
+ plexdict = plx.GetPlexLoginFromSettings()
+ myplexlogin = plexdict['myplexlogin']
+ plexhome = plexdict['plexhome']
+
if myplexlogin == "true" and plexhome == 'true':
username, userId, accessToken = plx.ChoosePlexHomeUser()
else:
@@ -347,6 +360,15 @@ class UserClient(threading.Thread):
if plx.CheckConnection(server, accessToken) == 200:
self.currUser = username
dialog = xbmcgui.Dialog()
+ settings('accessToken', value=accessToken)
+ settings('userId%s' % username, value=userId)
+ log("User authenticated with an access token", 1)
+ if self.loadCurrUser(authenticated=True) is False:
+ # Something went really wrong, return and try again
+ self.auth = True
+ self.currUser = None
+ return
+ # Success!
if username:
dialog.notification(
heading=self.addonName,
@@ -357,28 +379,20 @@ class UserClient(threading.Thread):
heading=self.addonName,
message="Welcome",
icon="special://home/addons/plugin.video.plexkodiconnect/icon.png")
- settings('accessToken', value=accessToken)
- settings('userId%s' % username, value=userId)
- log("User authenticated with an access token", 1)
- self.loadCurrUser(authenticated=True)
- window('emby_serverStatus', clear=True)
- # Write plex_machineIdentifier to window
- plex_machineIdentifier = settings('plex_machineIdentifier')
- window('plex_machineIdentifier', plex_machineIdentifier)
self.retry = 0
# Make sure that lib sync thread is not paused
- utils.window('suspend_LibraryThread', clear=True)
else:
self.logMsg("Error: user authentication failed.", -1)
settings('accessToken', value="")
settings('userId%s' % username, value="")
- # Give 3 attempts at entering password / selecting user
- if self.retry == 3:
- log("Too many retries. You can retry by resetting attempts in "
- "the addon settings.", 1)
+ # Give attempts at entering password / selecting user
+ if self.retry >= 5:
+ log("Too many retries.", 1)
window('emby_serverStatus', value="Stop")
- dialog.ok(lang(33001), lang(33010))
+ dialog.ok(lang(33001), lang(39023))
+ xbmc.executebuiltin(
+ 'Addon.OpenSettings(plugin.video.plexkodiconnect)')
self.retry += 1
self.auth = False
@@ -430,15 +444,13 @@ class UserClient(threading.Thread):
self.authenticate()
if not self.auth and (self.currUser is None):
- # If authenticate failed.
+ # Loop if no server found
server = self.getServer()
- username = self.getUsername()
# The status Stop is for when user cancelled password dialog.
- if server and username and status != "Stop":
+ if server and status != "Stop":
# Only if there's information found to login
log("Server found: %s" % server, 2)
- log("Username found: %s" % username, 2)
self.auth = True
self.doUtils.stopSession()
diff --git a/resources/lib/utils.py b/resources/lib/utils.py
index d618e77b..3f7257a9 100644
--- a/resources/lib/utils.py
+++ b/resources/lib/utils.py
@@ -304,7 +304,7 @@ def setScreensaver(value):
}
}
result = xbmc.executeJSONRPC(json.dumps(query))
- logMsg("EMBY", "Toggling screensaver: %s %s" % (value, result), 1)
+ logMsg("PLEX", "Toggling screensaver: %s %s" % (value, result), 1)
def reset():
@@ -318,7 +318,7 @@ def reset():
window('emby_shouldStop', value="true")
count = 10
while window('emby_dbScan') == "true":
- logMsg("EMBY", "Sync is running, will retry: %s..." % count)
+ logMsg("PLEX", "Sync is running, will retry: %s..." % count)
count -= 1
if count == 0:
dialog.ok("Warning", "Could not stop the database from running. Try again.")
diff --git a/resources/settings.xml b/resources/settings.xml
index faf5a9f2..c12a66d3 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -25,10 +25,11 @@
-
-
+
+
-
+
+
diff --git a/service.py b/service.py
index f54c22ca..de478698 100644
--- a/service.py
+++ b/service.py
@@ -169,21 +169,14 @@ class Service():
if 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=self.addonName,
- message=("%s %s%s!"
- % (lang(33000), user.currUser.decode('utf-8'),
- add.decode('utf-8'))),
- icon="special://home/addons/plugin.video.plexkodiconnect/icon.png",
- time=2000,
- sound=False)
-
+ heading=self.addonName,
+ message=("%s %s"
+ % (lang(33000),
+ user.currUser.decode('utf-8'))),
+ 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()
@@ -221,15 +214,12 @@ class Service():
# Wait until Emby server is online
# or Kodi is shut down.
while not monitor.abortRequested():
-
server = user.getServer()
- plexToken = utils.settings('plexToken')
- if server == False:
+ if server is False:
# No server info set in add-on settings
pass
-
- elif plx.CheckConnection(server, plexToken) != 200:
- # Server is offline.
+ elif plx.CheckConnection(server) 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)
@@ -322,4 +312,4 @@ if delay and xbmc.Monitor().waitForAbort(delay+3):
# Start the service
xbmc.log("Abort requested while waiting. Emby for kodi not started.")
else:
- Service().ServiceEntryPoint()
\ No newline at end of file
+ Service().ServiceEntryPoint()