diff --git a/plexpy/plextv.py b/plexpy/plextv.py index a941cb78..165ed979 100644 --- a/plexpy/plextv.py +++ b/plexpy/plextv.py @@ -266,6 +266,14 @@ class PlexTV(object): return request + def get_plextv_shared_servers(self, machine_id='', output_format=''): + uri = '/api/servers/%s/shared_servers' % machine_id + request = self.request_handler.make_request(uri=uri, + request_type='GET', + output_format=output_format) + + return request + def get_plextv_sync_lists(self, machine_id='', output_format=''): uri = '/servers/%s/sync_lists' % machine_id request = self.request_handler.make_request(uri=uri, @@ -329,15 +337,18 @@ class PlexTV(object): return request def get_full_users_list(self): - friends_list = self.get_plextv_friends(output_format='xml') own_account = self.get_plextv_user_details(output_format='xml') + friends_list = self.get_plextv_friends(output_format='xml') + shared_servers = self.get_plextv_shared_servers(machine_id=plexpy.CONFIG.PMS_IDENTIFIER, + output_format='xml') + users_list = [] try: xml_head = own_account.getElementsByTagName('user') except Exception as e: logger.warn(u"Tautulli PlexTV :: Unable to parse own account XML for get_full_users_list: %s." % e) - return {} + return [] for a in xml_head: own_details = {"user_id": helpers.get_xml_attr(a, 'id'), @@ -346,13 +357,16 @@ class PlexTV(object): "email": helpers.get_xml_attr(a, 'email'), "is_home_user": helpers.get_xml_attr(a, 'home'), "is_admin": 1, - "is_allow_sync": None, + "is_allow_sync": 1, "is_restricted": helpers.get_xml_attr(a, 'restricted'), "filter_all": helpers.get_xml_attr(a, 'filterAll'), "filter_movies": helpers.get_xml_attr(a, 'filterMovies'), "filter_tv": helpers.get_xml_attr(a, 'filterTelevision'), "filter_music": helpers.get_xml_attr(a, 'filterMusic'), - "filter_photos": helpers.get_xml_attr(a, 'filterPhotos') + "filter_photos": helpers.get_xml_attr(a, 'filterPhotos'), + "user_token": helpers.get_xml_attr(a, 'authToken'), + "server_token": helpers.get_xml_attr(a, 'authToken'), + "shared_libraries": None, } users_list.append(own_details) @@ -361,7 +375,7 @@ class PlexTV(object): xml_head = friends_list.getElementsByTagName('User') except Exception as e: logger.warn(u"Tautulli PlexTV :: Unable to parse friends list XML for get_full_users_list: %s." % e) - return {} + return [] for a in xml_head: friend = {"user_id": helpers.get_xml_attr(a, 'id'), @@ -381,6 +395,28 @@ class PlexTV(object): users_list.append(friend) + try: + xml_head = shared_servers.getElementsByTagName('SharedServer') + except Exception as e: + logger.warn(u"Tautulli PlexTV :: Unable to parse shared server list XML for get_full_users_list: %s." % e) + return [] + + user_map = {} + for a in xml_head: + user_id = helpers.get_xml_attr(a, 'userID') + server_token = helpers.get_xml_attr(a, 'accessToken') + + sections = a.getElementsByTagName('Section') + shared_libraries = [helpers.get_xml_attr(s, 'key') + for s in sections if helpers.get_xml_attr(s, 'shared') == '1'] + + user_map[user_id] = {'server_token': server_token, + 'shared_libraries': shared_libraries} + + for u in users_list: + d = user_map.get(u['user_id'], {}) + u.update(d) + return users_list def get_synced_items(self, machine_id=None, client_id_filter=None, user_id_filter=None, diff --git a/plexpy/users.py b/plexpy/users.py index 08b9f254..155d4737 100644 --- a/plexpy/users.py +++ b/plexpy/users.py @@ -31,52 +31,29 @@ def refresh_users(): logger.info(u"Tautulli Users :: Requesting users list refresh...") result = plextv.PlexTV().get_full_users_list() - monitor_db = database.MonitorDatabase() - user_data = Users() - if result: + monitor_db = database.MonitorDatabase() + for item in result: - shared_libraries = '' - user_tokens = user_data.get_tokens(user_id=item['user_id']) - if user_tokens and user_tokens['server_token']: - pms_connect = pmsconnect.PmsConnect(token=user_tokens['server_token']) - library_details = pms_connect.get_server_children() + if item.get('shared_libraries'): + item['shared_libraries'] = ';'.join(item['shared_libraries']) - if library_details: - shared_libraries = ';'.join(d['section_id'] for d in library_details['libraries_list']) - else: - shared_libraries = '' - - control_value_dict = {"user_id": item['user_id']} - new_value_dict = {"username": item['username'], - "thumb": item['thumb'], - "email": item['email'], - "is_admin": item['is_admin'], - "is_home_user": item['is_home_user'], - "is_allow_sync": item['is_allow_sync'], - "is_restricted": item['is_restricted'], - "shared_libraries": shared_libraries, - "filter_all": item['filter_all'], - "filter_movies": item['filter_movies'], - "filter_tv": item['filter_tv'], - "filter_music": item['filter_music'], - "filter_photos": item['filter_photos'] - } + keys_dict = {"user_id": item.pop('user_id')} # Check if we've set a custom avatar if so don't overwrite it. - if item['user_id']: + if keys_dict['user_id']: avatar_urls = monitor_db.select('SELECT thumb, custom_avatar_url ' 'FROM users WHERE user_id = ?', - [item['user_id']]) + [keys_dict['user_id']]) if avatar_urls: if not avatar_urls[0]['custom_avatar_url'] or \ avatar_urls[0]['custom_avatar_url'] == avatar_urls[0]['thumb']: - new_value_dict['custom_avatar_url'] = item['thumb'] + item['custom_avatar_url'] = item['thumb'] else: - new_value_dict['custom_avatar_url'] = item['thumb'] + item['custom_avatar_url'] = item['thumb'] - monitor_db.upsert('users', new_value_dict, control_value_dict) + monitor_db.upsert('users', item, keys_dict) logger.info(u"Tautulli Users :: Users list refreshed.") return True