def create_session(self, session_key, state): """ :type session_key: str :type state: str :rtype: WatchSession or None """ log.debug('Creating a WatchSession for the current media') skip = False info = PlexMediaServer.get_session(session_key) if not info: return None # Client player_section = info.findall('Player') if len(player_section): player_section = player_section[0] client = PlexMediaServer.get_client(player_section.get('machineIdentifier')) # Metadata metadata = None try: metadata = PlexMetadata.get(info.get('ratingKey')) if metadata: metadata = metadata.to_dict() except NotImplementedError, e: # metadata not supported (music, etc..) log.debug('%s, ignoring session' % e.message) skip = True
def fetch(cls, types=None, keys=None, titles=None, cache_id=None): if types and isinstance(types, basestring): types = [types] # Get all sections or filter based on 'types' and 'sections' sections = [(type, key) for (type, key, _) in PlexMediaServer.get_sections( types, keys, titles, cache_id=cache_id)] movies = {} shows = {} for type, key in sections: container = PlexMediaServer.get_section(key, cache_id=cache_id) if container is None: continue for media in container: if type == 'movie': cls.map_item(movies, container, media) if type == 'show': cls.map_item(shows, container, media) if len(types) == 1: if types[0] == 'movie': return movies if types[0] == 'show': return shows return movies, shows
def fetch(cls, types=None, keys=None, titles=None, cache_id=None): if types and isinstance(types, basestring): types = [types] # Get all sections or filter based on 'types' and 'sections' sections = [(type, key) for (type, key, _) in PlexMediaServer.get_sections( types, keys, titles, cache_id=cache_id )] movies = {} shows = {} for type, key in sections: container = PlexMediaServer.get_section(key, cache_id=cache_id) if container is None: continue for media in container: if type == 'movie': cls.map_item(movies, container, media) if type == 'show': cls.map_item(shows, container, media) if len(types) == 1: if types[0] == 'movie': return movies if types[0] == 'show': return shows return movies, shows
def watch(self, p_items, t_item): if type(p_items) is not list: p_items = [p_items] if not t_item.is_watched: return True for p_item in p_items: # Ignore already seen movies if p_item.seen: continue PlexMediaServer.scrobble(p_item.rating_key) return True
def create_session(self, info): if not info.get('ratingKey'): log.warn('Invalid ratingKey provided from activity info') return None skip = False # Client client = None if info.get('machineIdentifier'): client = PlexMediaServer.get_client(info['machineIdentifier']) else: log.info( 'No machineIdentifier available, client filtering not available' ) # Metadata metadata = None try: metadata = PlexMetadata.get(info['ratingKey']) if metadata: metadata = metadata.to_dict() except NotImplementedError, e: # metadata not supported (music, etc..) log.debug('%s, ignoring session' % e.message) skip = True
def test(cls): if PlexMediaServer.get_sessions() is None: log.info("Error while retrieving sessions, assuming WebSocket method isn't available") return False server_info = PlexMediaServer.get_info() if server_info is None: log.info('Error while retrieving server info for testing') return False multi_user = bool(server_info.get('multiuser', 0)) if not multi_user: log.info("Server info indicates multi-user support isn't available, WebSocket method not available") return False return True
def create_session(self, info): if not info.get('ratingKey'): log.warn('Invalid ratingKey provided from activity info') return None skip = False # Client client = None if info.get('machineIdentifier'): client = PlexMediaServer.get_client(info['machineIdentifier']) else: log.info('No machineIdentifier available, client filtering not available') # Metadata metadata = None try: metadata = PlexMetadata.get(info['ratingKey']) if metadata: metadata = metadata.to_dict() except NotImplementedError, e: # metadata not supported (music, etc..) log.debug('%s, ignoring session' % e.message) skip = True
def rate(self, p_items, t_item): if type(p_items) is not list: p_items = [p_items] if t_item.rating is None: return True t_rating = t_item.rating.advanced for p_item in p_items: # Ignore already rated episodes if p_item.user_rating == t_rating: continue if p_item.user_rating is None or self.rate_conflict(p_item, t_item): PlexMediaServer.rate(p_item.rating_key, t_rating) return True
def sections(cls, types=None, keys=None, titles=None): # Default to 'titles' filter preference if titles is None: titles = get_filter('filter_sections') return PlexMediaServer.get_sections(types, keys, titles, cache_id=cls.get_cache_id())
def sections(cls, types=None, keys=None, titles=None): # Default to 'titles' filter preference if titles is None: titles, _ = get_filter('filter_sections') return PlexMediaServer.get_sections( types, keys, titles, cache_id=cls.get_cache_id() )
def rate(self, p_items, t_item): if type(p_items) is not list: p_items = [p_items] if t_item.rating_advanced is None: return True t_rating = t_item.rating_advanced for p_item in p_items: # Ignore already rated episodes if p_item.user_rating == t_rating: continue if p_item.user_rating is None or self.rate_conflict( p_item, t_item): PlexMediaServer.rate(p_item.rating_key, t_rating) return True
def test(cls): if PlexMediaServer.get_sessions() is None: log.info( "Error while retrieving sessions, assuming WebSocket method isn't available" ) return False server_info = PlexMediaServer.get_info() if server_info is None: log.info('Error while retrieving server info for testing') return False multi_user = bool(server_info.get('multiuser', 0)) if not multi_user: log.info( "Server info indicates multi-user support isn't available, WebSocket method not available" ) return False return True
def try_read_line(cls, start_interval=1, interval_step=1.6, max_interval=5, max_tries=4, timeout=30): line = None try_count = 0 retry_interval = float(start_interval) while not line and try_count <= max_tries: try_count += 1 line = cls.read_line(timeout) if line: break if cls.log_file.get_path() != cls.log_path: log.debug("Log file moved (probably rotated), closing") cls.close() # If we are below max_interval, keep increasing the interval if retry_interval < max_interval: retry_interval = retry_interval * interval_step # Ensure the new retry_interval is below max_interval if retry_interval > max_interval: retry_interval = max_interval # Sleep if we should still retry if try_count <= max_tries: if try_count > 1: log.debug('Log file read returned nothing, waiting %.02f seconds and then trying again' % retry_interval) time.sleep(retry_interval) # Ping server to see if server is still active PlexMediaServer.get_info(quiet=True) if line and try_count > 2: log.debug('Successfully read the log file after retrying') elif not line: log.warn('Finished retrying, still no success') return line
def create_session(self, session_key, state): """ :type session_key: str :type state: str :rtype: WatchSession or None """ log.debug('Creating a WatchSession for the current media') skip = False info = PlexMediaServer.get_session(session_key) if not info: return None # Client player_section = info.findall('Player') if len(player_section): player_section = player_section[0] client = PlexMediaServer.get_client( player_section.get('machineIdentifier')) # Metadata metadata = None try: metadata = PlexMetadata.get(info.get('ratingKey')) if metadata: metadata = metadata.to_dict() except NotImplementedError, e: # metadata not supported (music, etc..) log.debug('%s, ignoring session' % e.message) skip = True
def update_session(self, session, view_offset): log.debug('Trying to update the current WatchSession (session key: %s)' % session.key) video_section = PlexMediaServer.get_session(session.key) if not video_section: log.warn('Session was not found on media server') return False log.debug('last item key: %s, current item key: %s' % (session.item_key, video_section.get('ratingKey'))) if session.item_key != video_section.get('ratingKey'): log.debug('Invalid Session: Media changed') return False session.last_view_offset = view_offset session.update_required = False return True
def start(self): # Get current server version and save it to dict. server_version = PlexMediaServer.get_version() if server_version: Log('Server Version is %s' % server_version) Dict['server_version'] = server_version # Validate username/password spawn(self.validate_auth) # Check for updates self.update_checker.run_once(async=True) self.session_manager.start() # Start modules for module in self.modules: if hasattr(module, 'start'): log.debug("Starting module %s", module) module.start()
def init_trakt(): def get_credentials(): password_hash = hashlib.sha1(Prefs['password']) return ( Prefs['username'], password_hash.hexdigest() ) Trakt.configure( # Application api_key='ba5aa61249c02dc5406232da20f6e768f3c82b28', # Version plugin_version=PLUGIN_VERSION, media_center_version=PlexMediaServer.get_version(), # Account credentials=get_credentials )
def SyncMenu(refresh=None): oc = ObjectContainer(title2=L('sync_menu:title'), no_history=True, no_cache=True) all_keys = [] create_active_item(oc) oc.add(DirectoryObject( key=Callback(Synchronize), title=pad_title('Synchronize'), summary=get_task_status('synchronize'), thumb=R("icon-sync.png") )) f_allow, f_deny = get_filter('filter_sections') sections = PlexMediaServer.get_sections(['show', 'movie'], titles=f_allow) for _, key, title in sections: oc.add(DirectoryObject( key=Callback(Push, section=key), title=pad_title('Push "' + title + '" to trakt'), summary=get_task_status('push', key), thumb=R("icon-sync_up.png") )) all_keys.append(key) if len(all_keys) > 1: oc.add(DirectoryObject( key=Callback(Push), title=pad_title('Push all to trakt'), summary=get_task_status('push'), thumb=R("icon-sync_up.png") )) oc.add(DirectoryObject( key=Callback(Pull), title=pad_title('Pull from trakt'), summary=get_task_status('pull'), thumb=R("icon-sync_down.png") )) return oc
def update_session(self, session, view_offset): log.debug( 'Trying to update the current WatchSession (session key: %s)' % session.key) video_section = PlexMediaServer.get_session(session.key) if not video_section: log.warn('Session was not found on media server') return False log.debug('last item key: %s, current item key: %s' % (session.item_key, video_section.get('ratingKey'))) if session.item_key != video_section.get('ratingKey'): log.debug('Invalid Session: Media changed') return False session.last_view_offset = view_offset session.update_required = False return True
def SyncMenu(refresh=None): oc = ObjectContainer(title2=L("Sync"), no_history=True, no_cache=True) all_keys = [] create_active_item(oc) oc.add( DirectoryObject(key=Callback(Synchronize), title=pad_title('Synchronize'), summary=get_task_status('synchronize'), thumb=R("icon-sync.png"))) sections = PlexMediaServer.get_sections( ['show', 'movie'], titles=get_filter('filter_sections')) for _, key, title in sections: oc.add( DirectoryObject(key=Callback(Push, section=key), title=pad_title('Push "' + title + '" to trakt'), summary=get_task_status('push', key), thumb=R("icon-sync_up.png"))) all_keys.append(key) if len(all_keys) > 1: oc.add( DirectoryObject(key=Callback(Push), title=pad_title('Push all to trakt'), summary=get_task_status('push'), thumb=R("icon-sync_up.png"))) oc.add( DirectoryObject(key=Callback(Pull), title=pad_title('Pull from trakt'), summary=get_task_status('pull'), thumb=R("icon-sync_down.png"))) return oc