def onReachabilityResponse(self, request, response, context): self.hasPendingRequest = False # It's possible we may have a result pending before we were able # to cancel it, so we'll just ignore it. # if request.ignoreResponse: # return if response.isSuccess(): data = response.getBodyXml() if data is not None and context.server.collectDataFromRoot(data): self.state = self.STATE_REACHABLE else: # This is unexpected, but treat it as unreachable util.ERROR_LOG("Unable to parse root response from {0}".format( context.server)) self.state = self.STATE_UNREACHABLE elif response.getStatus() == 401: self.state = self.STATE_UNAUTHORIZED else: self.state = self.STATE_UNREACHABLE self.getScore(True) context.server.onReachabilityResult(self)
def canDirectPlay(self, item, choice): maxResolution = item.settings.getMaxResolution(item.getQualityType(), self.isSupported4k(choice.media, choice.videoStream)) height = choice.media.getVideoResolution() if height > maxResolution: util.LOG("MDE: (DP) Video height is greater than max allowed: {0} > {1}".format(height, maxResolution)) if height > 1088 and item.settings.getPreference("allow_4k", True): util.LOG("MDE: (DP) Unsupported 4k media") return False maxBitrate = item.settings.getMaxBitrate(item.getQualityType()) bitrate = choice.media.bitrate.asInt() if bitrate > maxBitrate: util.LOG("MDE: (DP) Video bitrate is greater than the allowed max: {0} > {1}".format(bitrate, maxBitrate)) return False if choice.videoStream is None: util.ERROR_LOG("MDE: (DP) No video stream") return True if not item.settings.getGlobal("supports1080p60"): videoFrameRate = choice.videoStream.asInt() if videoFrameRate > 30 and height >= 1080: util.LOG("MDE: (DP) Frame rate is not supported for resolution: {0}@{1}".format(height, videoFrameRate)) return False if choice.videoStream.codec == "hevc" and not item.settings.getPreference("allow_hevc", False): util.LOG("MDE: (DP) Codec is HEVC, which is disabled") return False return True
def addItemToPlayQueue(item, addNext=False): # See if we have an active play queue for this self.dia type or if we need to # create one. if item.isMusicOrDirectoryItem(): player = AudioPlayer() elif item.isVideoOrDirectoryItem(): player = VideoPlayer() elif item.isPhotoOrDirectoryItem(): player = PhotoPlayer() else: player = None if not player: util.ERROR_LOG("Don't know how to add item to play queue: " + str(item)) return None elif not player.allowAddToQueue(): util.DEBUG_LOG("Not allowed to add to this player") return None if player.playQueue: playQueue = player.playQueue playQueue.addItem(item, addNext) else: options = PlayOptions() options.context = options.CONTEXT_SELF playQueue = createPlayQueueForItem(item, None, options) if playQueue: player.setPlayQueue(playQueue, False) return playQueue
def loadState(self): jstring = plexapp.INTERFACE.getRegistry("PlexServerManager") if not jstring: return try: obj = json.loads(jstring) except: util.ERROR() obj = None if not obj: util.ERROR_LOG("Failed to parse PlexServerManager JSON") return for serverObj in obj['servers']: server = plexserver.createPlexServerForName( serverObj['uuid'], serverObj['name']) server.owned = bool(serverObj.get('owned')) server.sameNetwork = serverObj.get('sameNetwork') hasSecureConn = False for i in range(len(serverObj.get('connections', []))): conn = serverObj['connections'][i] if conn['address'][:5] == "https": hasSecureConn = True break for i in range(len(serverObj.get('connections', []))): conn = serverObj['connections'][i] isFallback = hasSecureConn and conn['address'][:5] != "https" sources = plexconnection.PlexConnection.SOURCE_BY_VAL[ conn['sources']] connection = plexconnection.PlexConnection( sources, conn['address'], conn['isLocal'], conn['token'], isFallback) # Keep the secure connection on top if connection.isSecure: server.connections.insert(0, connection) else: server.connections.append(connection) self.serversByUuid[server.uuid] = server util.LOG("Loaded {0} servers from registry".format(len( obj['servers']))) self.updateReachability(False, True)
def deSerialize(cls, jstring): try: serverObj = json.loads(jstring) except: util.ERROR() util.ERROR_LOG("Failed to deserialize PlexServer JSON") return import plexconnection server = createPlexServerForName(serverObj['uuid'], serverObj['name']) server.owned = bool(serverObj.get('owned')) server.sameNetwork = serverObj.get('sameNetwork') hasSecureConn = False for i in range(len(serverObj.get('connections', []))): conn = serverObj['connections'][i] if conn['address'][:5] == "https": hasSecureConn = True break for i in range(len(serverObj.get('connections', []))): conn = serverObj['connections'][i] isFallback = hasSecureConn and conn['address'][:5] != "https" sources = plexconnection.PlexConnection.SOURCE_BY_VAL[ conn['sources']] connection = plexconnection.PlexConnection(sources, conn['address'], conn['isLocal'], conn['token'], isFallback) # Keep the secure connection on top if connection.isSecure: server.connections.insert(0, connection) else: server.connections.append(connection) if conn.get('active'): server.activeConnection = connection return server