def onPlayBackStarted(self): if not Settings.isActiveVideoPlaying(): return log("PinSentryPlayer: Notification that something started playing") # Only interested if it is not playing music if self.isPlayingAudio(): return # Ignore screen saver videos if xbmcgui.Window(10000).getProperty("VideoScreensaverRunning"): log("PinSentryPlayer: Detected VideoScreensaver playing") return # Check if the Pin is set, as no point prompting if it is not if not PinSentry.isPinSentryEnabled(): return isMusicVideo = False isTvShow = False # Get the information for what is currently playing # http://kodi.wiki/view/InfoLabels#Video_player title = xbmc.getInfoLabel("VideoPlayer.TVShowTitle") # If the TvShow Title is not set, then Check the ListItem as well if title in [None, ""]: title = xbmc.getInfoLabel("ListItem.TVShowTitle") securityLevel = 0 # If it is a TvShow, then check to see if it is enabled for this one if title not in [None, ""]: isTvShow = True log("PinSentryPlayer: TVShowTitle: %s" % title) pinDB = PinSentryDB() securityLevel = pinDB.getTvShowSecurityLevel(title) del pinDB else: # Check if the video is a music video isMusicVideo = self.isMusicVideoPlaying() # Not a TvShow, so check for the Movie Title title = xbmc.getInfoLabel("VideoPlayer.Title") # If no title is found, check the ListItem rather then the Player if title in [None, ""]: title = xbmc.getInfoLabel("ListItem.Title") if title not in [None, ""]: if not isMusicVideo: # Check for a Movie log("PinSentryPlayer: Title: %s" % title) pinDB = PinSentryDB() securityLevel = pinDB.getMovieSecurityLevel(title) del pinDB else: # Now check to see if this is music video log("PinSentryPlayer: Checking Music video for: %s" % title) pinDB = PinSentryDB() securityLevel = pinDB.getMusicVideoSecurityLevel(title) del pinDB # For video files it is possible to set them to always be allowed to play, in this case # the security value is -1 and we don't want to perform any new checking if securityLevel == -1: log("PinSentryPlayer: Security level is -1, so allowing access") return # Now perform the check that restricts if a file is in a file source # that should not be played if securityLevel < 1 and Settings.isActiveFileSource() and Settings.isActiveFileSourcePlaying(): # Get the path of the file being played filePath = xbmc.getInfoLabel("Player.Folderpath") if filePath in [None, ""]: filePath = xbmc.getInfoLabel("Player.Filenameandpath") if filePath in [None, ""]: filePath = xbmc.getInfoLabel("ListItem.FolderPath") if filePath in [None, ""]: filePath = xbmc.getInfoLabel("ListItem.FileNameAndPath") log("PinSentryPlayer: Checking file path: %s" % filePath) # Get all the sources that are protected pinDB = PinSentryDB() securityDetails = pinDB.getAllFileSourcesPathsSecurity() del pinDB # Each key is in path with security applied for key in securityDetails.keys(): if key in filePath: securityLevel = securityDetails[key] log("PinSentryPlayer: Setting path based security to %d" % securityLevel) # Now check to see if this item has a certificate restriction if securityLevel < 1: cert = xbmc.getInfoLabel("VideoPlayer.mpaa") if cert in [None, ""]: cert = xbmc.getInfoLabel("ListItem.Mpaa") if cert not in [None, ""]: log("PinSentryPlayer: Checking for certification restrictions: %s" % str(cert)) # Now split based on a colon and spaces, we only want the last bit of the # MPAA setting as the first bit can change based on scraper cert = cert.strip().split(':')[-1] cert = cert.strip().split()[-1] pinDB = PinSentryDB() if isTvShow: # Look up the TV Shows Certificate to see if it is restricted securityLevel = pinDB.getTvClassificationSecurityLevel(cert) else: # Look up the Movies Certificate to see if it is restricted securityLevel = pinDB.getMovieClassificationSecurityLevel(cert) del pinDB # If we have still not set security yet, check to make sure that the classification was actually # one of our supported types if securityLevel < 1: if isTvShow: if not Settings.isSupportedTvShowClassification(cert): securityLevel = Settings.getDefaultTvShowsWithoutClassification() log("PinSentryPlayer: Setting TV Show to level %d as there is no valid MPAA value" % securityLevel) elif not isMusicVideo: if not Settings.isSupportedMovieClassification(cert): securityLevel = Settings.getDefaultMoviesWithoutClassification() log("PinSentryPlayer: Setting Movie to level %d as there is no valid MPAA value" % securityLevel) # Check if we have set security based off of the classification if securityLevel > 0: # Before we check to make sure the user can access this video based on the # movie or TV Show classification, check for the case where there is background # media playing, this can be the case if TvTunes has started a Video while browsing # We do not want to prompt for the user to input the key for this isBackgroundMedia = True # Total wait for not playing background media is 1 second loopCount = 100 while isBackgroundMedia and (loopCount > 0): loopCount = loopCount - 1 if xbmcgui.Window(10025).getProperty("PlayingBackgroundMedia") in [None, ""]: isBackgroundMedia = False break xbmc.sleep(10) if isBackgroundMedia: securityLevel = 0 log("PinSentryPlayer: Playing background media") # Check if security has been set on this item if securityLevel < 1: if title in [None, ""]: # Not a TvShow or Movie - so allow the user to continue # without entering a pin code log("PinSentryPlayer: No security enabled, no title available") else: log("PinSentryPlayer: No security enabled for %s" % title) return # Check if we have already cached the pin number and at which level if PinSentry.getCachedPinLevel() >= securityLevel: log("PinSentryPlayer: Already cached pin at level %d, allowing access" % PinSentry.getCachedPinLevel()) return # Before we start prompting the user for the pin, check to see if we # have already been called and are prompting in another thread if xbmcgui.Window(10000).getProperty("PinSentryPrompting"): log("PinSentryPlayer: Already prompting for security code") return # Set the flag so other threads know we are processing this play request xbmcgui.Window(10000).setProperty("PinSentryPrompting", "true") # Pause the video so that we can prompt for the Pin to be entered # On some systems we could get notified that we have started playing a video # before it has actually been started, so keep trying to pause until we get # one that works while not xbmc.getCondVisibility("Player.Paused"): self.pause() log("PinSentryPlayer: Pausing video to check if OK to play") # Prompt the user for the pin, returns True if they knew it if PinSentry.promptUserForPin(securityLevel): log("PinSentryPlayer: Resuming video") # Pausing again will start the video playing again self.pause() else: log("PinSentryPlayer: Stopping video") self.stop() PinSentry.displayInvalidPinMessage(securityLevel) xbmcgui.Window(10000).clearProperty("PinSentryPrompting")
def onPlayBackStarted(self): if not Settings.isActiveVideoPlaying(): return log("PinSentryPlayer: Notification that something started playing") # Only interested if it is not playing music if self.isPlayingAudio(): return # Ignore screen saver videos if xbmcgui.Window(10000).getProperty("VideoScreensaverRunning"): log("PinSentryPlayer: Detected VideoScreensaver playing") return # Check if the Pin is set, as no point prompting if it is not if not PinSentry.isPinSentryEnabled(): return # Get the information for what is currently playing # http://kodi.wiki/view/InfoLabels#Video_player tvshowtitle = xbmc.getInfoLabel("VideoPlayer.TVShowTitle") # If the TvShow Title is not set, then Check the ListItem as well if tvshowtitle in [None, ""]: tvshowtitle = xbmc.getInfoLabel("ListItem.TVShowTitle") # cert = xbmc.getInfoLabel("VideoPlayer.mpaa") # listmpaa = xbmc.getInfoLabel("ListItem.Mpaa") # log("*** ROB ***: VideoPlayer.mpaa: %s" % str(cert)) # log("*** ROB ***: ListItem.Mpaa: %s" % str(listmpaa)) securityLevel = 0 # If it is a TvShow, then check to see if it is enabled for this one if tvshowtitle not in [None, ""]: log("PinSentryPlayer: TVShowTitle: %s" % tvshowtitle) pinDB = PinSentryDB() securityLevel = pinDB.getTvShowSecurityLevel(tvshowtitle) del pinDB if securityLevel < 1: log("PinSentryPlayer: No security enabled for %s" % tvshowtitle) return else: # Not a TvShow, so check for the Movie Title title = xbmc.getInfoLabel("VideoPlayer.Title") # If no title is found, check the ListItem rather then the Player if title in [None, ""]: title = xbmc.getInfoLabel("ListItem.Title") if title not in [None, ""]: log("PinSentryPlayer: Title: %s" % title) pinDB = PinSentryDB() securityLevel = pinDB.getMovieSecurityLevel(title) del pinDB if securityLevel < 1: log("PinSentryPlayer: No security enabled for %s" % title) return else: # Not a TvShow or Movie - so allow the user to continue # without entering a pin code log("PinSentryPlayer: No security enabled, no title available") return # Check if we have already cached the pin number and at which level if PinSentry.getCachedPinLevel() >= securityLevel: log("PinSentryPlayer: Already cached pin at level %d, allowing access" % PinSentry.getCachedPinLevel()) return # Before we start prompting the user for the pin, check to see if we # have already been called and are prompting in another thread if xbmcgui.Window(10000).getProperty("PinSentryPrompting"): log("PinSentryPlayer: Already prompting for security code") return # Set the flag so other threads know we are processing this play request xbmcgui.Window(10000).setProperty("PinSentryPrompting", "true") # Pause the video so that we can prompt for the Pin to be entered # On some systems we could get notified that we have started playing a video # before it has actually been started, so keep trying to pause until we get # one that works while not xbmc.getCondVisibility("Player.Paused"): self.pause() log("PinSentryPlayer: Pausing video to check if OK to play") # Prompt the user for the pin, returns True if they knew it if PinSentry.promptUserForPin(): log("PinSentryPlayer: Resuming video") # Pausing again will start the video playing again self.pause() else: log("PinSentryPlayer: Stopping video") self.stop() PinSentry.displayInvalidPinMessage() xbmcgui.Window(10000).clearProperty("PinSentryPrompting")