Support Parental control - access schedule

I had to reorganize the service.py loop a bit for this to work.
Logically the top level inside the while loop should be if the user is
authenticated.
This commit is contained in:
angelblue05 2015-05-12 02:34:03 -05:00
parent a3b500061a
commit 354f0905f6
3 changed files with 83 additions and 48 deletions

View file

@ -265,8 +265,16 @@ class DownloadUtils():
if r.status_code == 401: if r.status_code == 401:
# Unauthorized # Unauthorized
status = WINDOW.getProperty("Server_status") status = WINDOW.getProperty("Server_status")
if (status == "401") or (status == "Auth"):
if r.headers['X-Application-Error-Code'] == "ParentalControl":
# Parental control - access restricted
WINDOW.setProperty("Server_status", "restricted")
xbmcgui.Dialog().notification("Emby server", "Access restricted.", xbmcgui.NOTIFICATION_ERROR)
return False
elif (status == "401") or (status == "Auth"):
pass pass
else: else:
# Tell UserClient token has been revoked. # Tell UserClient token has been revoked.
WINDOW.setProperty("Server_status", "401") WINDOW.setProperty("Server_status", "401")

View file

@ -40,6 +40,7 @@ class UserClient(threading.Thread):
currUserId = None currUserId = None
currServer = None currServer = None
currToken = None currToken = None
HasAccess = True
AdditionalUser = [] AdditionalUser = []
def __init__(self, *args): def __init__(self, *args):
@ -167,6 +168,24 @@ class UserClient(threading.Thread):
return users return users
def hasAccess(self):
url = "{server}/mediabrowser/Users"
result = self.doUtils.downloadUrl(url)
if result is False:
# Access is restricted
self.logMsg("Access is restricted.")
self.HasAccess = False
return
if self.WINDOW.getProperty("Server_status") == "restricted":
self.logMsg("Access is granted.")
self.HasAccess = True
self.WINDOW.setProperty("Server_status", "")
xbmcgui.Dialog().notification("Emby server", "Access is enabled.")
return
def loadCurrUser(self): def loadCurrUser(self):
WINDOW = self.WINDOW WINDOW = self.WINDOW
@ -224,6 +243,8 @@ class UserClient(threading.Thread):
self.logMsg("Current user: %s" % self.currUser, 0) self.logMsg("Current user: %s" % self.currUser, 0)
self.logMsg("Current userId: %s" % self.currUserId, 0) self.logMsg("Current userId: %s" % self.currUserId, 0)
self.logMsg("Current accessToken: %s" % self.currToken, 0) self.logMsg("Current accessToken: %s" % self.currToken, 0)
# parental control - let's verify if access is restricted
self.hasAccess()
return return
users = self.getPublicUsers() users = self.getPublicUsers()
@ -320,7 +341,12 @@ class UserClient(threading.Thread):
if (self.WINDOW.getProperty("Server_status") != ""): if (self.WINDOW.getProperty("Server_status") != ""):
status = self.WINDOW.getProperty("Server_status") status = self.WINDOW.getProperty("Server_status")
if status == "401":
if status == "restricted":
# Parental control is restricting access
self.HasAccess = False
elif status == "401":
self.WINDOW.setProperty("Server_status", "Auth") self.WINDOW.setProperty("Server_status", "Auth")
# Revoked token # Revoked token
self.resetClient() self.resetClient()

View file

@ -88,48 +88,48 @@ class Service():
if WINDOW.getProperty('Server_online') == "true": if WINDOW.getProperty('Server_online') == "true":
# Server is online # Server is online
if xbmc.Player().isPlaying(): if (user.currUser != None) and (user.HasAccess == True):
try: self.warn_auth = True
playTime = xbmc.Player().getTime()
totalTime = xbmc.Player().getTotalTime()
currentFile = xbmc.Player().getPlayingFile()
if(player.played_information.get(currentFile) != None): # Correctly launch the websocket, if user manually launches the add-on
player.played_information[currentFile]["currentPosition"] = playTime if (self.newWebSocketThread == None):
self.newWebSocketThread = "Started"
# send update ws.start()
td = datetime.today() - lastProgressUpdate
secDiff = td.seconds if xbmc.Player().isPlaying():
if(secDiff > 3): try:
try: playTime = xbmc.Player().getTime()
player.reportPlayback() totalTime = xbmc.Player().getTotalTime()
except Exception, msg: currentFile = xbmc.Player().getPlayingFile()
self.logMsg("Exception reporting progress: %s" % msg)
pass if(player.played_information.get(currentFile) != None):
lastProgressUpdate = datetime.today() player.played_information[currentFile]["currentPosition"] = playTime
# only try autoplay when there's 20 seconds or less remaining and only once!
addonSettings = xbmcaddon.Addon(id='plugin.video.emby') # send update
td = datetime.today() - lastProgressUpdate
# if its an episode see if autoplay is enabled secDiff = td.seconds
if addonSettings.getSetting("autoPlaySeason")=="true": if(secDiff > 3):
notificationtime = addonSettings.getSetting("autoPlaySeasonTime") try:
if (totalTime - playTime <= int(notificationtime) and (lastFile==None or lastFile!=currentFile)): player.reportPlayback()
lastFile = currentFile except Exception, msg:
player.autoPlayPlayback() self.logMsg("Exception reporting progress: %s" % msg)
pass
except Exception, e: lastProgressUpdate = datetime.today()
self.logMsg("Exception in Playback Monitor Service: %s" % e) # only try autoplay when there's 20 seconds or less remaining and only once!
pass addonSettings = xbmcaddon.Addon(id='plugin.video.emby')
else:
# background worker for database sync # if its an episode see if autoplay is enabled
if (user.currUser != None): if addonSettings.getSetting("autoPlaySeason")=="true":
self.warn_auth = True notificationtime = addonSettings.getSetting("autoPlaySeasonTime")
if (totalTime - playTime <= int(notificationtime) and (lastFile==None or lastFile!=currentFile)):
# Correctly launch the websocket, if user manually launches the add-on lastFile = currentFile
if (self.newWebSocketThread == None): player.autoPlayPlayback()
self.newWebSocketThread = "Started"
ws.start() except Exception, e:
self.logMsg("Exception in Playback Monitor Service: %s" % e)
pass
else:
#full sync #full sync
if (startupComplete == False): if (startupComplete == False):
self.logMsg("Doing_Db_Sync: syncDatabase (Started)") self.logMsg("Doing_Db_Sync: syncDatabase (Started)")
@ -143,11 +143,12 @@ class Service():
# Abort was requested while waiting. We should exit # Abort was requested while waiting. We should exit
break break
#WebSocketThread().processPendingActions() #WebSocketThread().processPendingActions()
else:
else: user.hasAccess()
if self.warn_auth: if self.warn_auth:
self.logMsg("Not authenticated yet.", 1) self.logMsg("Not authenticated yet.", 1)
self.warn_auth = False self.warn_auth = False
else: else:
# Wait until server becomes online or shut down is requested # Wait until server becomes online or shut down is requested
while not self.KodiMonitor.abortRequested(): while not self.KodiMonitor.abortRequested():