Example #1
0
        def get_connections(device):
            conn = []
            connections = device.getElementsByTagName('Connection')

            for c in connections:
                server_details = {"protocol": helpers.get_xml_attr(c, 'protocol'),
                                  "address": helpers.get_xml_attr(c, 'address'),
                                  "port": helpers.get_xml_attr(c, 'port'),
                                  "uri": helpers.get_xml_attr(c, 'uri'),
                                  "local": helpers.get_xml_attr(c, 'local')
                                  }
                conn.append(server_details)

            return conn
Example #2
0
    def get_server_identity(self):
        identity = self.get_local_server_identity(output_format='xml')

        xml_head = identity.getElementsByTagName('MediaContainer')
        if not xml_head:
            logger.warn("Error parsing XML for Plex server identity.")
            return None

        server_identity = {}
        for a in xml_head:
            server_identity = {"machine_identifier": helpers.get_xml_attr(a, 'machineIdentifier'),
                               "version": helpers.get_xml_attr(a, 'version')
                               }

        return server_identity
Example #3
0
        def get_connections(device):
            conn = []
            connections = device.getElementsByTagName('Connection')

            for c in connections:
                server_details = {
                    "protocol": helpers.get_xml_attr(c, 'protocol'),
                    "address": helpers.get_xml_attr(c, 'address'),
                    "port": helpers.get_xml_attr(c, 'port'),
                    "uri": helpers.get_xml_attr(c, 'uri'),
                    "local": helpers.get_xml_attr(c, 'local')
                }
                conn.append(server_details)

            return conn
Example #4
0
    def get_server_identity(self):
        identity = self.get_local_server_identity(output_format='xml')

        try:
            xml_head = identity.getElementsByTagName('MediaContainer')
        except:
            logger.warn("Unable to parse XML for get_local_server_identity.")
            return []

        server_identity = {}
        for a in xml_head:
            server_identity = {"machine_identifier": helpers.get_xml_attr(a, 'machineIdentifier'),
                               "version": helpers.get_xml_attr(a, 'version')
                               }

        return server_identity
Example #5
0
    def get_current_activity(self):
        session_data = self.get_sessions(output_format="xml")

        try:
            xml_head = session_data.getElementsByTagName("MediaContainer")
        except:
            logger.warn("Unable to parse XML for get_sessions.")
            return []

        session_list = []

        for a in xml_head:
            if a.getAttribute("size"):
                if a.getAttribute("size") == "0":
                    session_list = {"stream_count": "0", "sessions": []}
                    return session_list

            if a.getElementsByTagName("Track"):
                session_data = a.getElementsByTagName("Track")
                session_type = "track"
                for session in session_data:
                    session_output = self.get_session_each(session_type, session)
                    session_list.append(session_output)
            if a.getElementsByTagName("Video"):
                session_data = a.getElementsByTagName("Video")
                session_type = "video"
                for session in session_data:
                    session_output = self.get_session_each(session_type, session)
                    session_list.append(session_output)

        output = {"stream_count": helpers.get_xml_attr(xml_head[0], "size"), "sessions": session_list}

        return output
Example #6
0
    def get_current_activity(self):
        session_data = self.get_sessions(output_format='xml')
        session_list = []

        xml_head = session_data.getElementsByTagName('MediaContainer')
        if not xml_head:
            logger.warn("Error parsing XML for Plex session data.")
            return None

        for a in xml_head:
            if a.getAttribute('size'):
                if a.getAttribute('size') == '0':
                    session_list = {'stream_count': '0',
                                    'sessions': []
                                    }
                    return session_list

            if a.getElementsByTagName('Track'):
                session_data = a.getElementsByTagName('Track')
                session_type = 'track'
                for session in session_data:
                    session_output = self.get_session_each(session_type, session)
                    session_list.append(session_output)
            if a.getElementsByTagName('Video'):
                session_data = a.getElementsByTagName('Video')
                session_type = 'video'
                for session in session_data:
                    session_output = self.get_session_each(session_type, session)
                    session_list.append(session_output)

        output = {'stream_count': helpers.get_xml_attr(xml_head[0], 'size'),
                  'sessions': session_list
                  }

        return output
Example #7
0
    def get_server_times(self):
        servers = self.get_plextv_server_list(output_format='xml')
        server_times = []

        try:
            xml_head = servers.getElementsByTagName('Server')
        except:
            logger.warn("Error parsing XML for Plex servers.")
            return []

        for a in xml_head:
            if helpers.get_xml_attr(a, 'machineIdentifier') == plexpy.CONFIG.PMS_IDENTIFIER:
                server_times.append({"created_at": helpers.get_xml_attr(a, 'createdAt'),
                                     "updated_at": helpers.get_xml_attr(a, 'updatedAt')
                                     })
                break

        return server_times
Example #8
0
    def get_server_times(self):
        servers = self.get_plextv_server_list(output_format='xml')
        server_times = []

        try:
            xml_head = servers.getElementsByTagName('Server')
        except Exception as e:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_server_times: %s." % e)
            return []

        for a in xml_head:
            if helpers.get_xml_attr(a, 'machineIdentifier') == plexpy.CONFIG.PMS_IDENTIFIER:
                server_times.append({"created_at": helpers.get_xml_attr(a, 'createdAt'),
                                     "updated_at": helpers.get_xml_attr(a, 'updatedAt')
                                     })
                break

        return server_times
Example #9
0
    def get_server_times(self):
        servers = self.get_plextv_server_list(output_format='xml')
        server_times = []

        try:
            xml_head = servers.getElementsByTagName('Server')
        except:
            logger.warn("Error parsing XML for Plex servers.")
            return []

        for a in xml_head:
            if helpers.get_xml_attr(a, 'machineIdentifier') == plexpy.CONFIG.PMS_IDENTIFIER:
                server_times.append({"created_at": helpers.get_xml_attr(a, 'createdAt'),
                                     "updated_at": helpers.get_xml_attr(a, 'updatedAt')
                                     })
                break

        return server_times
Example #10
0
    def get_cloud_server_status(self, server):
        cloud_status = self.cloud_server_status(output_format='xml')

        try:
            status_info = cloud_status.getElementsByTagName('info')
        except Exception as e:
            logger.warn(
                u"Tautulli PlexTV :: Unable to parse XML for get_cloud_server_status: %s."
                % e)
            return False

        for info in status_info:
            servers = info.getElementsByTagName('server')
            for s in servers:
                if helpers.get_xml_attr(s, 'address') == server.CONFIG.PMS_IP:
                    if helpers.get_xml_attr(info, 'running') == '1':
                        return True
                    else:
                        return False
Example #11
0
    def get_server_pref(self, pref=None):
        if pref:
            prefs = self.get_server_prefs(output_format="xml")

            try:
                xml_head = prefs.getElementsByTagName("Setting")
            except:
                logger.warn("Unable to parse XML for get_local_server_name.")
                return ""

            pref_value = "None"
            for a in xml_head:
                if helpers.get_xml_attr(a, "id") == pref:
                    pref_value = helpers.get_xml_attr(a, "value")
                    break

            return pref_value
        else:
            logger.debug(u"Server preferences queried but no parameter received.")
            return None
Example #12
0
    def get_server_pref(self, pref=None):
        if pref:
            prefs = self.get_server_prefs(output_format='xml')

            try:
                xml_head = prefs.getElementsByTagName('Setting')
            except:
                logger.warn("Unable to parse XML for get_local_server_name.")
                return ''

            pref_value = 'None'
            for a in xml_head:
                if helpers.get_xml_attr(a, 'id') == pref:
                    pref_value = helpers.get_xml_attr(a, 'value')
                    break

            return pref_value
        else:
            logger.debug(u"Server preferences queried but no parameter received.")
            return None
Example #13
0
    def get_servers_info(self):
        recent = self.get_server_list(output_format='xml')

        xml_head = recent.getElementsByTagName('Server')
        if not xml_head:
            logger.warn("Error parsing XML for Plex server prefs.")
            return None

        server_info = []
        for a in xml_head:
            output = {"name": helpers.get_xml_attr(a, 'name'),
                      "machine_identifier": helpers.get_xml_attr(a, 'machineIdentifier'),
                      "host": helpers.get_xml_attr(a, 'host'),
                      "port": helpers.get_xml_attr(a, 'port'),
                      "version": helpers.get_xml_attr(a, 'version')
                      }

            server_info.append(output)

        return server_info
Example #14
0
    def get_servers_info(self):
        recent = self.get_server_list(output_format='xml')

        try:
            xml_head = recent.getElementsByTagName('Server')
        except:
            logger.warn("Unable to parse XML for get_server_list.")
            return []

        server_info = []
        for a in xml_head:
            output = {"name": helpers.get_xml_attr(a, 'name'),
                      "machine_identifier": helpers.get_xml_attr(a, 'machineIdentifier'),
                      "host": helpers.get_xml_attr(a, 'host'),
                      "port": helpers.get_xml_attr(a, 'port'),
                      "version": helpers.get_xml_attr(a, 'version')
                      }

            server_info.append(output)

        return server_info
Example #15
0
    def get_season_children(self, rating_key=''):
        episode_data = self.get_episode_list(rating_key, output_format='xml')
        episode_list = []

        xml_head = episode_data.getElementsByTagName('MediaContainer')
        if not xml_head:
            logger.warn("Error parsing XML for Plex session data.")
            return None

        for a in xml_head:
            if a.getAttribute('size'):
                if a.getAttribute('size') == '0':
                    logger.debug(u"No episode data.")
                    episode_list = {'episode_count': '0',
                                    'episode_list': []
                                    }
                    return episode_list

            if a.getElementsByTagName('Video'):
                result_data = a.getElementsByTagName('Video')
                for result in result_data:
                    episode_output = {'rating_key': helpers.get_xml_attr(result, 'ratingKey'),
                                      'index': helpers.get_xml_attr(result, 'index'),
                                      'title': helpers.get_xml_attr(result, 'title'),
                                      'thumb': helpers.get_xml_attr(result, 'thumb')
                                      }
                    episode_list.append(episode_output)

        output = {'episode_count': helpers.get_xml_attr(xml_head[0], 'size'),
                  'title': helpers.get_xml_attr(xml_head[0], 'title2'),
                  'episode_list': episode_list
                  }

        return output
Example #16
0
    def get_server_times(self):
        servers = self.get_plextv_server_list(output_format='xml')
        server_times = {}

        try:
            xml_head = servers.getElementsByTagName('Server')
        except Exception as e:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_server_times: %s."
                % e)
            return {}

        for a in xml_head:
            if helpers.get_xml_attr(
                    a, 'machineIdentifier') == plexpy.CONFIG.PMS_IDENTIFIER:
                server_times = {
                    "created_at": helpers.get_xml_attr(a, 'createdAt'),
                    "updated_at": helpers.get_xml_attr(a, 'updatedAt'),
                    "version": helpers.get_xml_attr(a, 'version')
                }
                break

        return server_times
Example #17
0
    def get_server_token(self):
        servers = self.get_plextv_resources(output_format='xml')

        try:
            xml_head = servers.getElementsByTagName('Device')
        except Exception as e:
            logger.warn(
                u"Tautulli PlexTV :: Unable to parse XML for get_server_token: %s."
                % e)
            return None

        server_tokens = {}
        for a in xml_head:
            if 'server' in helpers.get_xml_attr(a, 'provides'):
                server_identifier = helpers.get_xml_attr(a, 'clientIdentifier')
                server_token = helpers.get_xml_attr(a, 'accessToken')
                server = plexpy.PMS_SERVERS.get_server_by_identifier(
                    server_identifier)
                if server:
                    server_id = server.CONFIG.ID
                    server_tokens[server_id] = server_token

        return server_tokens
Example #18
0
    def discover(self):
        """ Query plex for all servers online. Returns the ones you own in a selectize format """
        servers = self.get_plextv_resources(include_https=True, output_format='xml')
        clean_servers = []

        try:
            xml_head = servers.getElementsByTagName('MediaContainer')
        except Exception as e:
            logger.warn(u"PlexPy PlexTV :: Failed to get servers from plex: %s." % e)
            return []

        for a in xml_head:
            if a.getAttribute('size'):
                if a.getAttribute('size') == '0':
                    return []

            if a.getElementsByTagName('Device'):
                devices = a.getElementsByTagName('Device')

                for d in devices:
                    if helpers.get_xml_attr(d, 'presence') == '1' and \
                        helpers.get_xml_attr(d, 'owned') == '1' and \
                        helpers.get_xml_attr(d, 'provides') == 'server':
                        connections = d.getElementsByTagName('Connection')

                        for c in connections:
                            server = {'httpsRequired': helpers.get_xml_attr(d, 'httpsRequired'),
                                      'clientIdentifier': helpers.get_xml_attr(d, 'clientIdentifier'),
                                      'label': helpers.get_xml_attr(d, 'name'),
                                      'ip': helpers.get_xml_attr(c, 'address'),
                                      'port': helpers.get_xml_attr(c, 'port'),
                                      'local': helpers.get_xml_attr(c, 'local'),
                                      'value': helpers.get_xml_attr(c, 'address')
                                      }
                            clean_servers.append(server)

        return clean_servers
Example #19
0
    def get_server_times(self):
        servers = self.get_plextv_server_list(output_format='xml')

        try:
            xml_head = servers.getElementsByTagName('Server')
        except Exception as e:
            logger.warn(
                u"Tautulli PlexTV :: Unable to parse XML for get_server_times: %s."
                % e)
            return {}

        server_list = {}
        for a in xml_head:
            server_times = {
                "created_at": helpers.get_xml_attr(a, 'createdAt'),
                "updated_at": helpers.get_xml_attr(a, 'updatedAt'),
                "version": helpers.get_xml_attr(a, 'version')
            }
            pms_identifier = helpers.get_xml_attr(a, 'machineIdentifier')
            pms_name = plexpy.PMS_SERVERS.get_server_by_identifier(
                pms_identifier=pms_identifier)
            server_list[pms_name] = server_times

        return server_list
Example #20
0
    def get_plexpass_status(self):
        account_data = self.get_plextv_user_details(output_format='xml')

        try:
            subscription = account_data.getElementsByTagName('subscription')
        except Exception as e:
            logger.warn(
                u"Tautulli PlexTV :: Unable to parse XML for get_plexpass_status: %s."
                % e)
            return False

        if subscription and helpers.get_xml_attr(subscription[0],
                                                 'active') == '1':
            return True
        else:
            logger.debug(
                u"Tautulli PlexTV :: Plex Pass subscription not found.")
            return False
Example #21
0
    def get_season_children(self, rating_key=""):
        episode_data = self.get_episode_list(rating_key, output_format="xml")

        try:
            xml_head = episode_data.getElementsByTagName("MediaContainer")
        except:
            logger.warn("Unable to parse XML for get_episode_list.")
            return []

        episode_list = []

        for a in xml_head:
            if a.getAttribute("size"):
                if a.getAttribute("size") == "0":
                    logger.debug(u"No episode data.")
                    episode_list = {"episode_count": "0", "episode_list": []}
                    return episode_list

            if a.getElementsByTagName("Video"):
                result_data = a.getElementsByTagName("Video")
                for result in result_data:
                    episode_output = {
                        "rating_key": helpers.get_xml_attr(result, "ratingKey"),
                        "index": helpers.get_xml_attr(result, "index"),
                        "title": helpers.get_xml_attr(result, "title"),
                        "thumb": helpers.get_xml_attr(result, "thumb"),
                    }
                    episode_list.append(episode_output)

        output = {
            "episode_count": helpers.get_xml_attr(xml_head[0], "size"),
            "title": helpers.get_xml_attr(xml_head[0], "title2"),
            "episode_list": episode_list,
        }

        return output
Example #22
0
    def get_full_users_list(self):
        friends_list = self.get_plextv_friends()
        own_account = self.get_plextv_user_details()
        users_list = []

        try:
            xml_parse = minidom.parseString(own_account)
        except Exception as e:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list own account: %s"
                % e)
            return []
        except:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list own account."
            )
            return []

        xml_head = xml_parse.getElementsByTagName('user')
        if not xml_head:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list."
            )
        else:
            for a in xml_head:
                own_details = {
                    "user_id": helpers.get_xml_attr(a, 'id'),
                    "username": helpers.get_xml_attr(a, 'username'),
                    "thumb": helpers.get_xml_attr(a, 'thumb'),
                    "email": helpers.get_xml_attr(a, 'email'),
                    "is_home_user": helpers.get_xml_attr(a, 'home'),
                    "is_allow_sync": None,
                    "is_restricted": helpers.get_xml_attr(a, 'restricted')
                }

                users_list.append(own_details)

        try:
            xml_parse = minidom.parseString(friends_list)
        except Exception as e:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list friends list: %s"
                % e)
            return []
        except:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list friends list."
            )
            return []

        xml_head = xml_parse.getElementsByTagName('User')
        if not xml_head:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list."
            )
        else:
            for a in xml_head:
                friend = {
                    "user_id": helpers.get_xml_attr(a, 'id'),
                    "username": helpers.get_xml_attr(a, 'title'),
                    "thumb": helpers.get_xml_attr(a, 'thumb'),
                    "email": helpers.get_xml_attr(a, 'email'),
                    "is_home_user": helpers.get_xml_attr(a, 'home'),
                    "is_allow_sync": helpers.get_xml_attr(a, 'allowSync'),
                    "is_restricted": helpers.get_xml_attr(a, 'restricted')
                }

                users_list.append(friend)

        return users_list
Example #23
0
    def get_synced_items(self, machine_id=None, user_id=None):
        sync_list = self.get_plextv_sync_lists(machine_id)
        user_data = users.Users()

        synced_items = []

        try:
            xml_parse = minidom.parseString(sync_list)
        except Exception as e:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_synced_items: %s"
                % e)
            return []
        except:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_synced_items.")
            return []

        xml_head = xml_parse.getElementsByTagName('SyncList')

        if not xml_head:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_synced_items.")
        else:
            for a in xml_head:
                client_id = helpers.get_xml_attr(a, 'id')
                sync_device = a.getElementsByTagName('Device')
                for device in sync_device:
                    device_user_id = helpers.get_xml_attr(device, 'userID')
                    try:
                        device_username = user_data.get_details(
                            user_id=device_user_id)['username']
                        device_friendly_name = user_data.get_details(
                            user_id=device_user_id)['friendly_name']
                    except:
                        device_username = ''
                        device_friendly_name = ''
                    device_name = helpers.get_xml_attr(device, 'name')
                    device_product = helpers.get_xml_attr(device, 'product')
                    device_product_version = helpers.get_xml_attr(
                        device, 'productVersion')
                    device_platform = helpers.get_xml_attr(device, 'platform')
                    device_platform_version = helpers.get_xml_attr(
                        device, 'platformVersion')
                    device_type = helpers.get_xml_attr(device, 'device')
                    device_model = helpers.get_xml_attr(device, 'model')
                    device_last_seen = helpers.get_xml_attr(
                        device, 'lastSeenAt')

                # Filter by user_id
                if user_id and user_id != device_user_id:
                    continue

                for synced in a.getElementsByTagName('SyncItems'):
                    sync_item = synced.getElementsByTagName('SyncItem')
                    for item in sync_item:
                        sync_id = helpers.get_xml_attr(item, 'id')
                        sync_version = helpers.get_xml_attr(item, 'version')
                        sync_root_title = helpers.get_xml_attr(
                            item, 'rootTitle')
                        sync_title = helpers.get_xml_attr(item, 'title')
                        sync_metadata_type = helpers.get_xml_attr(
                            item, 'metadataType')
                        sync_content_type = helpers.get_xml_attr(
                            item, 'contentType')

                        for status in item.getElementsByTagName('Status'):
                            status_failure_code = helpers.get_xml_attr(
                                status, 'failureCode')
                            status_failure = helpers.get_xml_attr(
                                status, 'failure')
                            status_state = helpers.get_xml_attr(
                                status, 'state')
                            status_item_count = helpers.get_xml_attr(
                                status, 'itemsCount')
                            status_item_complete_count = helpers.get_xml_attr(
                                status, 'itemsCompleteCount')
                            status_item_downloaded_count = helpers.get_xml_attr(
                                status, 'itemsDownloadedCount')
                            status_item_ready_count = helpers.get_xml_attr(
                                status, 'itemsReadyCount')
                            status_item_successful_count = helpers.get_xml_attr(
                                status, 'itemsSuccessfulCount')
                            status_total_size = helpers.get_xml_attr(
                                status, 'totalSize')
                            status_item_download_percent_complete = helpers.get_percent(
                                status_item_downloaded_count,
                                status_item_count)

                        for settings in item.getElementsByTagName(
                                'MediaSettings'):
                            settings_audio_boost = helpers.get_xml_attr(
                                settings, 'audioBoost')
                            settings_music_bitrate = helpers.get_xml_attr(
                                settings, 'musicBitrate')
                            settings_photo_quality = helpers.get_xml_attr(
                                settings, 'photoQuality')
                            settings_photo_resolution = helpers.get_xml_attr(
                                settings, 'photoResolution')
                            settings_video_quality = helpers.get_xml_attr(
                                settings, 'videoQuality')
                            settings_video_resolution = helpers.get_xml_attr(
                                settings, 'videoResolution')

                        for location in item.getElementsByTagName('Location'):
                            clean_uri = helpers.get_xml_attr(
                                location, 'uri').split('%2F')

                        rating_key = next(
                            (clean_uri[(idx + 1) % len(clean_uri)]
                             for idx, item in enumerate(clean_uri)
                             if item == 'metadata'), None)

                        sync_details = {
                            "device_name": helpers.sanitize(device_name),
                            "platform": helpers.sanitize(device_platform),
                            "username": helpers.sanitize(device_username),
                            "friendly_name":
                            helpers.sanitize(device_friendly_name),
                            "user_id": device_user_id,
                            "root_title": helpers.sanitize(sync_root_title),
                            "title": helpers.sanitize(sync_title),
                            "metadata_type": sync_metadata_type,
                            "content_type": sync_content_type,
                            "rating_key": rating_key,
                            "state": status_state,
                            "item_count": status_item_count,
                            "item_complete_count": status_item_complete_count,
                            "item_downloaded_count":
                            status_item_downloaded_count,
                            "item_downloaded_percent_complete":
                            status_item_download_percent_complete,
                            "music_bitrate": settings_music_bitrate,
                            "photo_quality": settings_photo_quality,
                            "video_quality": settings_video_quality,
                            "total_size": status_total_size,
                            "failure": status_failure,
                            "sync_id": sync_id
                        }

                        synced_items.append(sync_details)

        return synced_items
Example #24
0
    def get_plex_account_details(self):
        account_data = self.get_plextv_user_details(output_format='xml')

        try:
            xml_head = account_data.getElementsByTagName('user')
        except Exception as e:
            logger.warn(
                u"Tautulli PlexTV :: Unable to parse XML for get_plex_account_details: %s."
                % e)
            return None

        for a in xml_head:
            account_details = {
                "user_id": helpers.get_xml_attr(a, 'id'),
                "username": helpers.get_xml_attr(a, 'username'),
                "thumb": helpers.get_xml_attr(a, 'thumb'),
                "email": helpers.get_xml_attr(a, 'email'),
                "is_home_user": helpers.get_xml_attr(a, 'home'),
                "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'),
                "user_token": helpers.get_xml_attr(a, 'authToken')
            }
            return account_details
Example #25
0
    def get_metadata_details(self, rating_key=''):
        metadata = self.get_metadata(rating_key, output_format='xml')
        metadata_list = []

        xml_head = metadata.getElementsByTagName('MediaContainer')
        if not xml_head:
            logger.warn("Error parsing XML for Plex metadata.")
            return None

        for a in xml_head:
            if a.getAttribute('size'):
                if a.getAttribute('size') != '1':
                    metadata_list = {'metadata': None}
                    return metadata_list

            if a.getElementsByTagName('Directory'):
                metadata_main = a.getElementsByTagName('Directory')[0]
                metadata_type = helpers.get_xml_attr(metadata_main, 'type')
            elif a.getElementsByTagName('Video'):
                metadata_main = a.getElementsByTagName('Video')[0]
                metadata_type = helpers.get_xml_attr(metadata_main, 'type')
            else:
                logger.debug(u"Metadata failed")

        genres = []
        actors = []
        writers = []
        directors = []

        if metadata_main.getElementsByTagName('Genre'):
            for genre in metadata_main.getElementsByTagName('Genre'):
                genres.append(helpers.get_xml_attr(genre, 'tag'))

        if metadata_main.getElementsByTagName('Role'):
            for actor in metadata_main.getElementsByTagName('Role'):
                actors.append(helpers.get_xml_attr(actor, 'tag'))

        if metadata_main.getElementsByTagName('Writer'):
            for writer in metadata_main.getElementsByTagName('Writer'):
                writers.append(helpers.get_xml_attr(writer, 'tag'))

        if metadata_main.getElementsByTagName('Director'):
            for director in metadata_main.getElementsByTagName('Director'):
                directors.append(helpers.get_xml_attr(director, 'tag'))

        if metadata_type == 'show':
            metadata = {'type': metadata_type,
                        'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
                        'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
                        'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
                        'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
                        'index': helpers.get_xml_attr(metadata_main, 'index'),
                        'studio': helpers.get_xml_attr(metadata_main, 'studio'),
                        'title': helpers.get_xml_attr(metadata_main, 'title'),
                        'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
                        'summary': helpers.get_xml_attr(metadata_main, 'summary'),
                        'rating': helpers.get_xml_attr(metadata_main, 'rating'),
                        'duration': helpers.convert_milliseconds_to_minutes(helpers.get_xml_attr(metadata_main, 'duration')),
                        'year': helpers.get_xml_attr(metadata_main, 'year'),
                        'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
                        'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
                        'art': helpers.get_xml_attr(metadata_main, 'art'),
                        'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
                        'writers': writers,
                        'directors': directors,
                        'genres': genres,
                        'actors': actors
                        }
            metadata_list = {'metadata': metadata}
        elif metadata_type == 'episode':
            metadata = {'type': metadata_type,
                        'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
                        'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
                        'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
                        'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
                        'index': helpers.get_xml_attr(metadata_main, 'index'),
                        'studio': helpers.get_xml_attr(metadata_main, 'studio'),
                        'title': helpers.get_xml_attr(metadata_main, 'title'),
                        'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
                        'summary': helpers.get_xml_attr(metadata_main, 'summary'),
                        'rating': helpers.get_xml_attr(metadata_main, 'rating'),
                        'duration': helpers.convert_milliseconds_to_minutes(helpers.get_xml_attr(metadata_main, 'duration')),
                        'year': helpers.get_xml_attr(metadata_main, 'year'),
                        'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
                        'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
                        'art': helpers.get_xml_attr(metadata_main, 'art'),
                        'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
                        'writers': writers,
                        'directors': directors,
                        'genres': genres,
                        'actors': actors
                        }
            metadata_list = {'metadata': metadata}
        elif metadata_type == 'movie':
            metadata = {'type': metadata_type,
                        'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
                        'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
                        'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
                        'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
                        'index': helpers.get_xml_attr(metadata_main, 'index'),
                        'studio': helpers.get_xml_attr(metadata_main, 'studio'),
                        'title': helpers.get_xml_attr(metadata_main, 'title'),
                        'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
                        'summary': helpers.get_xml_attr(metadata_main, 'summary'),
                        'rating': helpers.get_xml_attr(metadata_main, 'rating'),
                        'duration': helpers.convert_milliseconds_to_minutes(helpers.get_xml_attr(metadata_main, 'duration')),
                        'year': helpers.get_xml_attr(metadata_main, 'year'),
                        'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
                        'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
                        'art': helpers.get_xml_attr(metadata_main, 'art'),
                        'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
                        'genres': genres,
                        'actors': actors,
                        'writers': writers,
                        'directors': directors
                        }
            metadata_list = {'metadata': metadata}
        elif metadata_type == 'season':
            parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey')
            show_details = self.get_metadata_details(parent_rating_key)
            metadata = {'type': metadata_type,
                        'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
                        'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
                        'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
                        'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
                        'index': helpers.get_xml_attr(metadata_main, 'index'),
                        'studio': helpers.get_xml_attr(metadata_main, 'studio'),
                        'title': helpers.get_xml_attr(metadata_main, 'title'),
                        'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
                        'summary': show_details['metadata']['summary'],
                        'rating': helpers.get_xml_attr(metadata_main, 'rating'),
                        'duration': show_details['metadata']['duration'],
                        'year': helpers.get_xml_attr(metadata_main, 'year'),
                        'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
                        'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
                        'art': helpers.get_xml_attr(metadata_main, 'art'),
                        'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
                        'genres': genres,
                        'actors': actors,
                        'writers': writers,
                        'directors': directors
                        }
            metadata_list = {'metadata': metadata}
        else:
            return None

        return metadata_list
Example #26
0
    def get_session_each(self, stream_type='', session=None):
        session_output = None
        data_factory = datafactory.DataFactory()
        if stream_type == 'track':

            media_info = session.getElementsByTagName('Media')[0]
            audio_decision = 'direct play'
            audio_channels = helpers.get_xml_attr(media_info, 'audioChannels')
            audio_codec = helpers.get_xml_attr(media_info, 'audioCodec')
            container = helpers.get_xml_attr(media_info, 'container')
            bitrate = helpers.get_xml_attr(media_info, 'bitrate')
            duration = helpers.get_xml_attr(media_info, 'duration')
            progress = helpers.get_xml_attr(session, 'viewOffset')

            if session.getElementsByTagName('TranscodeSession'):
                transcode_session = session.getElementsByTagName('TranscodeSession')[0]
                audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision')
                transcode_audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels')
                transcode_audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec')
                transcode_container = helpers.get_xml_attr(transcode_session, 'container')
                transcode_protocol = helpers.get_xml_attr(transcode_session, 'protocol')
                duration = helpers.get_xml_attr(transcode_session, 'duration')
            else:
                transcode_audio_channels = ''
                transcode_audio_codec = ''
                transcode_container = ''
                transcode_protocol = ''

            user_details = data_factory.get_user_details(
                user=helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'))

            if helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'machineIdentifier').endswith('_Track'):
                machine_id = helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'machineIdentifier')[:-6]
            else:
                machine_id = helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'machineIdentifier')

            session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
                              'media_index': helpers.get_xml_attr(session, 'index'),
                              'parent_media_index': helpers.get_xml_attr(session, 'parentIndex'),
                              'art': helpers.get_xml_attr(session, 'art'),
                              'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
                              'grandparent_thumb': helpers.get_xml_attr(session, 'grandparentThumb'),
                              'thumb': helpers.get_xml_attr(session, 'thumb'),
                              'bif_thumb': '',
                              'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
                              'user_id': user_details['user_id'],
                              'friendly_name': user_details['friendly_name'],
                              'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'title'),
                              'platform': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
                              'machine_id': machine_id,
                              'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
                              'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
                              'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
                              'title': helpers.get_xml_attr(session, 'title'),
                              'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
                              'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'),
                              'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'),
                              'audio_decision': audio_decision,
                              'audio_channels': audio_channels,
                              'audio_codec': audio_codec,
                              'video_decision': '',
                              'video_codec': '',
                              'height': '',
                              'width': '',
                              'container': container,
                              'bitrate': bitrate,
                              'video_resolution': '',
                              'video_framerate': '',
                              'aspect_ratio': '',
                              'transcode_audio_channels': transcode_audio_channels,
                              'transcode_audio_codec': transcode_audio_codec,
                              'transcode_video_codec': '',
                              'transcode_width': '',
                              'transcode_height': '',
                              'transcode_container': transcode_container,
                              'transcode_protocol': transcode_protocol,
                              'duration': duration,
                              'progress': progress,
                              'progress_percent': str(helpers.get_percent(progress, duration)),
                              'type': 'track',
                              'indexes': 0
                              }
        elif stream_type == 'video':
            media_info = session.getElementsByTagName('Media')[0]
            audio_decision = 'direct play'
            audio_channels = helpers.get_xml_attr(media_info, 'audioChannels')
            audio_codec = helpers.get_xml_attr(media_info, 'audioCodec')
            video_decision = 'direct play'
            video_codec = helpers.get_xml_attr(media_info, 'videoCodec')
            container = helpers.get_xml_attr(media_info, 'container')
            bitrate = helpers.get_xml_attr(media_info, 'bitrate')
            video_resolution = helpers.get_xml_attr(media_info, 'videoResolution')
            video_framerate = helpers.get_xml_attr(media_info, 'videoFrameRate')
            aspect_ratio = helpers.get_xml_attr(media_info, 'aspectRatio')
            width = helpers.get_xml_attr(media_info, 'width')
            height = helpers.get_xml_attr(media_info, 'height')
            duration = helpers.get_xml_attr(media_info, 'duration')
            progress = helpers.get_xml_attr(session, 'viewOffset')

            if session.getElementsByTagName('TranscodeSession'):
                transcode_session = session.getElementsByTagName('TranscodeSession')[0]
                audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision')
                transcode_audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels')
                transcode_audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec')
                video_decision = helpers.get_xml_attr(transcode_session, 'videoDecision')
                transcode_video_codec = helpers.get_xml_attr(transcode_session, 'videoCodec')
                transcode_width = helpers.get_xml_attr(transcode_session, 'width')
                transcode_height = helpers.get_xml_attr(transcode_session, 'height')
                transcode_container = helpers.get_xml_attr(transcode_session, 'container')
                transcode_protocol = helpers.get_xml_attr(transcode_session, 'protocol')
            else:
                transcode_audio_channels = ''
                transcode_audio_codec = ''
                transcode_video_codec = ''
                transcode_width = ''
                transcode_height = ''
                transcode_container = ''
                transcode_protocol = ''

            media_info = session.getElementsByTagName('Media')[0]
            if media_info.getElementsByTagName('Part'):
                indexes = helpers.get_xml_attr(media_info.getElementsByTagName('Part')[0], 'indexes')
                part_id = helpers.get_xml_attr(media_info.getElementsByTagName('Part')[0], 'id')
                if indexes == 'sd':
                    bif_thumb = '/library/parts/' + part_id + '/indexes/sd/' + progress
                else:
                    bif_thumb = ''
            else:
                indexes = ''
                bif_thumb = ''

            if plexpy.CONFIG.PMS_USE_BIF and indexes == 'sd':
                use_indexes = 1
            else:
                use_indexes = 0

            user_details = data_factory.get_user_details(
                user=helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'))

            if helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'machineIdentifier').endswith('_Video'):
                machine_id = helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'machineIdentifier')[:-6]
            else:
                machine_id = helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'machineIdentifier')

            if helpers.get_xml_attr(session, 'type') == 'episode':
                session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
                                  'media_index': helpers.get_xml_attr(session, 'index'),
                                  'parent_media_index': helpers.get_xml_attr(session, 'parentIndex'),
                                  'art': helpers.get_xml_attr(session, 'art'),
                                  'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
                                  'grandparent_thumb': helpers.get_xml_attr(session, 'grandparentThumb'),
                                  'thumb': helpers.get_xml_attr(session, 'thumb'),
                                  'bif_thumb': bif_thumb,
                                  'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
                                  'user_id': user_details['user_id'],
                                  'friendly_name': user_details['friendly_name'],
                                  'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'title'),
                                  'platform': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
                                  'machine_id': machine_id,
                                  'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
                                  'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
                                  'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
                                  'title': helpers.get_xml_attr(session, 'title'),
                                  'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
                                  'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'),
                                  'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'),
                                  'audio_decision': audio_decision,
                                  'audio_channels': audio_channels,
                                  'audio_codec': audio_codec,
                                  'video_decision': video_decision,
                                  'video_codec': video_codec,
                                  'height': height,
                                  'width': width,
                                  'container': container,
                                  'bitrate': bitrate,
                                  'video_resolution': video_resolution,
                                  'video_framerate': video_framerate,
                                  'aspect_ratio': aspect_ratio,
                                  'transcode_audio_channels': transcode_audio_channels,
                                  'transcode_audio_codec': transcode_audio_codec,
                                  'transcode_video_codec': transcode_video_codec,
                                  'transcode_width': transcode_width,
                                  'transcode_height': transcode_height,
                                  'transcode_container': transcode_container,
                                  'transcode_protocol': transcode_protocol,
                                  'duration': duration,
                                  'progress': progress,
                                  'progress_percent': str(helpers.get_percent(progress, duration)),
                                  'type': helpers.get_xml_attr(session, 'type'),
                                  'indexes': use_indexes
                                  }
            elif helpers.get_xml_attr(session, 'type') == 'movie':
                session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
                                  'media_index': helpers.get_xml_attr(session, 'index'),
                                  'parent_media_index': helpers.get_xml_attr(session, 'parentIndex'),
                                  'art': helpers.get_xml_attr(session, 'art'),
                                  'thumb': helpers.get_xml_attr(session, 'thumb'),
                                  'bif_thumb': bif_thumb,
                                  'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
                                  'grandparent_thumb': helpers.get_xml_attr(session, 'grandparentThumb'),
                                  'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
                                  'user_id': user_details['user_id'],
                                  'friendly_name': user_details['friendly_name'],
                                  'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'title'),
                                  'platform': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
                                  'machine_id': machine_id,
                                  'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
                                  'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
                                  'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
                                  'title': helpers.get_xml_attr(session, 'title'),
                                  'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
                                  'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'),
                                  'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'),
                                  'audio_decision': audio_decision,
                                  'audio_channels': audio_channels,
                                  'audio_codec': audio_codec,
                                  'video_decision': video_decision,
                                  'video_codec': video_codec,
                                  'height': height,
                                  'width': width,
                                  'container': container,
                                  'bitrate': bitrate,
                                  'video_resolution': video_resolution,
                                  'video_framerate': video_framerate,
                                  'aspect_ratio': aspect_ratio,
                                  'transcode_audio_channels': transcode_audio_channels,
                                  'transcode_audio_codec': transcode_audio_codec,
                                  'transcode_video_codec': transcode_video_codec,
                                  'transcode_width': transcode_width,
                                  'transcode_height': transcode_height,
                                  'transcode_container': transcode_container,
                                  'transcode_protocol': transcode_protocol,
                                  'duration': duration,
                                  'progress': progress,
                                  'progress_percent': str(helpers.get_percent(progress, duration)),
                                  'type': helpers.get_xml_attr(session, 'type'),
                                  'indexes': use_indexes
                                  }
            elif helpers.get_xml_attr(session, 'type') == 'clip':
                session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
                                  'media_index': helpers.get_xml_attr(session, 'index'),
                                  'parent_media_index': helpers.get_xml_attr(session, 'parentIndex'),
                                  'art': helpers.get_xml_attr(session, 'art'),
                                  'thumb': helpers.get_xml_attr(session, 'thumb'),
                                  'bif_thumb': bif_thumb,
                                  'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
                                  'grandparent_thumb': helpers.get_xml_attr(session, 'grandparentThumb'),
                                  'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
                                  'user_id': user_details['user_id'],
                                  'friendly_name': user_details['friendly_name'],
                                  'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'title'),
                                  'platform': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
                                  'machine_id': machine_id,
                                  'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
                                  'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
                                  'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
                                  'title': helpers.get_xml_attr(session, 'title'),
                                  'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
                                  'parent_rating_key': helpers.get_xml_attr(session, 'parentRatingKey'),
                                  'grandparent_rating_key': helpers.get_xml_attr(session, 'grandparentRatingKey'),
                                  'audio_decision': audio_decision,
                                  'audio_channels': audio_channels,
                                  'audio_codec': audio_codec,
                                  'video_decision': video_decision,
                                  'video_codec': video_codec,
                                  'height': height,
                                  'width': width,
                                  'container': container,
                                  'bitrate': bitrate,
                                  'video_resolution': video_resolution,
                                  'video_framerate': video_framerate,
                                  'aspect_ratio': aspect_ratio,
                                  'transcode_audio_channels': transcode_audio_channels,
                                  'transcode_audio_codec': transcode_audio_codec,
                                  'transcode_video_codec': transcode_video_codec,
                                  'transcode_width': transcode_width,
                                  'transcode_height': transcode_height,
                                  'transcode_container': transcode_container,
                                  'transcode_protocol': transcode_protocol,
                                  'duration': duration,
                                  'progress': progress,
                                  'progress_percent': str(helpers.get_percent(progress, duration)),
                                  'type': helpers.get_xml_attr(session, 'type'),
                                  'indexes': 0
                                  }
        else:
            logger.warn(u"No known stream types found in session list.")

        return session_output
Example #27
0
    def get_full_users_list(self):

        own_account = self.get_plextv_user_details(output_format='xml')
        friends_list = self.get_plextv_friends(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 []

        for a in xml_head:
            own_details = {
                "user_id": helpers.get_xml_attr(a, 'id'),
                "username": helpers.get_xml_attr(a, 'username'),
                "thumb": helpers.get_xml_attr(a, 'thumb'),
                "email": helpers.get_xml_attr(a, 'email'),
                "is_admin": 1,
                "is_home_user": helpers.get_xml_attr(a, 'home'),
                "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'),
                "shared_libraries": [],
            }
            for server in plexpy.PMS_SERVERS:
                own_details["shared_libraries"].append({
                    "server_id":
                    server.CONFIG.ID,
                    "user_token":
                    helpers.get_xml_attr(a, 'authToken'),
                    "server_token":
                    helpers.get_xml_attr(a, 'authToken'),
                })

            users_list.append(own_details)

        try:
            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 []

        for a in xml_head:
            friend = {
                "user_id": helpers.get_xml_attr(a, 'id'),
                "username": helpers.get_xml_attr(a, 'title'),
                "thumb": helpers.get_xml_attr(a, 'thumb'),
                "email": helpers.get_xml_attr(a, 'email'),
                "is_admin": 0,
                "is_home_user": helpers.get_xml_attr(a, 'home'),
                "is_allow_sync": helpers.get_xml_attr(a, 'allowSync'),
                "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')
            }

            users_list.append(friend)

        user_map = {}
        for server in plexpy.PMS_SERVERS:
            if server.CONFIG.PMS_IS_ENABLED:
                shared_servers = self.get_plextv_shared_servers(
                    machine_id=server.CONFIG.PMS_IDENTIFIER,
                    output_format='xml')
                try:
                    xml_head = shared_servers.getElementsByTagName(
                        'SharedServer')
                except Exception as e:
                    logger.warn(
                        u"Tautulli PlexTV :: %s: Unable to parse shared server list XML for get_full_users_list: %s."
                        % (server.CONFIG.PMS_NAME, e))
                    return []

                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'
                    ]
                    if user_id not in user_map:
                        user_map[user_id] = {'shared_libraries': []}
                    user_map[user_id]['shared_libraries'].append({
                        'server_token':
                        server_token,
                        'server_id':
                        server.CONFIG.ID,
                        'shared_libraries':
                        shared_libraries
                    })

        for u in users_list:
            d = user_map.get(u['user_id'], {})
            u.update(d)

        return users_list
Example #28
0
        try:
            xml_parse = minidom.parseString(own_account)
        except Exception, e:
            logger.warn("Error parsing XML for Plex account details: %s" % e)
            return []
        except:
            logger.warn("Error parsing XML for Plex account details.")
            return []

        xml_head = xml_parse.getElementsByTagName('user')
        if not xml_head:
            logger.warn("Error parsing XML for Plex account details.")
        else:
            for a in xml_head:
                own_details = {
                    "user_id": helpers.get_xml_attr(a, 'id'),
                    "username": helpers.get_xml_attr(a, 'username'),
                    "thumb": helpers.get_xml_attr(a, 'thumb'),
                    "email": helpers.get_xml_attr(a, 'email'),
                    "is_home_user": helpers.get_xml_attr(a, 'home'),
                    "is_allow_sync": None,
                    "is_restricted": helpers.get_xml_attr(a, 'restricted')
                }

                users_list.append(own_details)

        try:
            xml_parse = minidom.parseString(friends_list)
        except Exception, e:
            logger.warn("Error parsing XML for Plex friends list: %s" % e)
        except:
Example #29
0
        def get_connections(device):
            conn = []
            connections = device.getElementsByTagName('Connection')

            server = {
                'pms_identifier':
                helpers.get_xml_attr(device, 'clientIdentifier'),
                'pms_name':
                helpers.get_xml_attr(device, 'name'),
                'pms_version':
                helpers.get_xml_attr(device, 'productVersion'),
                'pms_platform':
                helpers.get_xml_attr(device, 'platform'),
                'pms_presence':
                helpers.get_xml_attr(device, 'presence'),
                'pms_is_cloud':
                1 if helpers.get_xml_attr(device, 'platform') == 'Cloud' else 0
            }

            for c in connections:
                server_details = {
                    'protocol': helpers.get_xml_attr(c, 'protocol'),
                    'address': helpers.get_xml_attr(c, 'address'),
                    'port': helpers.get_xml_attr(c, 'port'),
                    'uri': helpers.get_xml_attr(c, 'uri'),
                    'local': helpers.get_xml_attr(c, 'local')
                }
                conn.append(server_details)

            server['connections'] = conn
            return server
Example #30
0
    def get_synced_items(self, machine_id=None, user_id=None):
        sync_list = self.get_plextv_sync_lists(machine_id)
        user_data = users.Users()

        synced_items = []

        try:
            xml_parse = minidom.parseString(sync_list)
        except Exception as e:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_synced_items: %s" % e)
            return []
        except:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_synced_items.")
            return []

        xml_head = xml_parse.getElementsByTagName('SyncList')

        if not xml_head:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_synced_items.")
        else:
            for a in xml_head:
                client_id = helpers.get_xml_attr(a, 'id')
                sync_device = a.getElementsByTagName('Device')
                for device in sync_device:
                    device_user_id = helpers.get_xml_attr(device, 'userID')
                    try:
                        device_username = user_data.get_details(user_id=device_user_id)['username']
                        device_friendly_name = user_data.get_details(user_id=device_user_id)['friendly_name']
                    except:
                        device_username = ''
                        device_friendly_name = ''
                    device_name = helpers.get_xml_attr(device, 'name')
                    device_product = helpers.get_xml_attr(device, 'product')
                    device_product_version = helpers.get_xml_attr(device, 'productVersion')
                    device_platform = helpers.get_xml_attr(device, 'platform')
                    device_platform_version = helpers.get_xml_attr(device, 'platformVersion')
                    device_type = helpers.get_xml_attr(device, 'device')
                    device_model = helpers.get_xml_attr(device, 'model')
                    device_last_seen = helpers.get_xml_attr(device, 'lastSeenAt')

                # Filter by user_id
                if user_id and user_id != device_user_id:
                    continue

                for synced in a.getElementsByTagName('SyncItems'):
                    sync_item = synced.getElementsByTagName('SyncItem')
                    for item in sync_item:
                        sync_id = helpers.get_xml_attr(item, 'id')
                        sync_version = helpers.get_xml_attr(item, 'version')
                        sync_root_title = helpers.get_xml_attr(item, 'rootTitle')
                        sync_title = helpers.get_xml_attr(item, 'title')
                        sync_metadata_type = helpers.get_xml_attr(item, 'metadataType')
                        sync_content_type = helpers.get_xml_attr(item, 'contentType')

                        for status in item.getElementsByTagName('Status'):
                            status_failure_code = helpers.get_xml_attr(status, 'failureCode')
                            status_failure = helpers.get_xml_attr(status, 'failure')
                            status_state = helpers.get_xml_attr(status, 'state')
                            status_item_count = helpers.get_xml_attr(status, 'itemsCount')
                            status_item_complete_count = helpers.get_xml_attr(status, 'itemsCompleteCount')
                            status_item_downloaded_count = helpers.get_xml_attr(status, 'itemsDownloadedCount')
                            status_item_ready_count = helpers.get_xml_attr(status, 'itemsReadyCount')
                            status_item_successful_count = helpers.get_xml_attr(status, 'itemsSuccessfulCount')
                            status_total_size = helpers.get_xml_attr(status, 'totalSize')
                            status_item_download_percent_complete = helpers.get_percent(
                                status_item_downloaded_count, status_item_count)

                        for settings in item.getElementsByTagName('MediaSettings'):
                            settings_audio_boost = helpers.get_xml_attr(settings, 'audioBoost')
                            settings_music_bitrate = helpers.get_xml_attr(settings, 'musicBitrate')
                            settings_photo_quality = helpers.get_xml_attr(settings, 'photoQuality')
                            settings_photo_resolution = helpers.get_xml_attr(settings, 'photoResolution')
                            settings_video_quality = helpers.get_xml_attr(settings, 'videoQuality')
                            settings_video_resolution = helpers.get_xml_attr(settings, 'videoResolution')

                        for location in item.getElementsByTagName('Location'):
                            clean_uri = helpers.get_xml_attr(location, 'uri').split('%2F')

                        rating_key = next((clean_uri[(idx + 1) % len(clean_uri)] 
                                           for idx, item in enumerate(clean_uri) if item == 'metadata'), None)

                        sync_details = {"device_name": helpers.sanitize(device_name),
                                        "platform": helpers.sanitize(device_platform),
                                        "username": helpers.sanitize(device_username),
                                        "friendly_name": helpers.sanitize(device_friendly_name),
                                        "user_id": device_user_id,
                                        "root_title": helpers.sanitize(sync_root_title),
                                        "title": helpers.sanitize(sync_title),
                                        "metadata_type": sync_metadata_type,
                                        "content_type": sync_content_type,
                                        "rating_key": rating_key,
                                        "state": status_state,
                                        "item_count": status_item_count,
                                        "item_complete_count": status_item_complete_count,
                                        "item_downloaded_count": status_item_downloaded_count,
                                        "item_downloaded_percent_complete": status_item_download_percent_complete,
                                        "music_bitrate": settings_music_bitrate,
                                        "photo_quality": settings_photo_quality,
                                        "video_quality": settings_video_quality,
                                        "total_size": status_total_size,
                                        "failure": status_failure,
                                        "sync_id": sync_id
                                        }

                        synced_items.append(sync_details)

        return synced_items
Example #31
0
    def get_session_each(self, stream_type="", session=None):
        session_output = None
        data_factory = datafactory.DataFactory()
        if stream_type == "track":

            media_info = session.getElementsByTagName("Media")[0]
            audio_decision = "direct play"
            audio_channels = helpers.get_xml_attr(media_info, "audioChannels")
            audio_codec = helpers.get_xml_attr(media_info, "audioCodec")
            container = helpers.get_xml_attr(media_info, "container")
            bitrate = helpers.get_xml_attr(media_info, "bitrate")
            duration = helpers.get_xml_attr(media_info, "duration")
            progress = helpers.get_xml_attr(session, "viewOffset")

            if session.getElementsByTagName("TranscodeSession"):
                transcode_session = session.getElementsByTagName("TranscodeSession")[0]
                audio_decision = helpers.get_xml_attr(transcode_session, "audioDecision")
                transcode_audio_channels = helpers.get_xml_attr(transcode_session, "audioChannels")
                transcode_audio_codec = helpers.get_xml_attr(transcode_session, "audioCodec")
                transcode_container = helpers.get_xml_attr(transcode_session, "container")
                transcode_protocol = helpers.get_xml_attr(transcode_session, "protocol")
                duration = helpers.get_xml_attr(transcode_session, "duration")
            else:
                transcode_audio_channels = ""
                transcode_audio_codec = ""
                transcode_container = ""
                transcode_protocol = ""

            user_details = data_factory.get_user_details(
                user=helpers.get_xml_attr(session.getElementsByTagName("User")[0], "title")
            )

            if helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "machineIdentifier").endswith("_Track"):
                machine_id = helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "machineIdentifier")[:-6]
            else:
                machine_id = helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "machineIdentifier")

            session_output = {
                "session_key": helpers.get_xml_attr(session, "sessionKey"),
                "media_index": helpers.get_xml_attr(session, "index"),
                "parent_media_index": helpers.get_xml_attr(session, "parentIndex"),
                "art": helpers.get_xml_attr(session, "art"),
                "parent_thumb": helpers.get_xml_attr(session, "parentThumb"),
                "grandparent_thumb": helpers.get_xml_attr(session, "grandparentThumb"),
                "thumb": helpers.get_xml_attr(session, "thumb"),
                "bif_thumb": "",
                "user": helpers.get_xml_attr(session.getElementsByTagName("User")[0], "title"),
                "user_id": user_details["user_id"],
                "friendly_name": user_details["friendly_name"],
                "player": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "title"),
                "platform": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "platform"),
                "machine_id": machine_id,
                "state": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "state"),
                "grandparent_title": helpers.get_xml_attr(session, "grandparentTitle"),
                "parent_title": helpers.get_xml_attr(session, "parentTitle"),
                "title": helpers.get_xml_attr(session, "title"),
                "rating_key": helpers.get_xml_attr(session, "ratingKey"),
                "parent_rating_key": helpers.get_xml_attr(session, "parentRatingKey"),
                "grandparent_rating_key": helpers.get_xml_attr(session, "grandparentRatingKey"),
                "audio_decision": audio_decision,
                "audio_channels": audio_channels,
                "audio_codec": audio_codec,
                "video_decision": "",
                "video_codec": "",
                "height": "",
                "width": "",
                "container": container,
                "bitrate": bitrate,
                "video_resolution": "",
                "video_framerate": "",
                "aspect_ratio": "",
                "transcode_audio_channels": transcode_audio_channels,
                "transcode_audio_codec": transcode_audio_codec,
                "transcode_video_codec": "",
                "transcode_width": "",
                "transcode_height": "",
                "transcode_container": transcode_container,
                "transcode_protocol": transcode_protocol,
                "duration": duration,
                "progress": progress,
                "progress_percent": str(helpers.get_percent(progress, duration)),
                "type": "track",
                "indexes": 0,
            }
        elif stream_type == "video":
            media_info = session.getElementsByTagName("Media")[0]
            audio_decision = "direct play"
            audio_channels = helpers.get_xml_attr(media_info, "audioChannels")
            audio_codec = helpers.get_xml_attr(media_info, "audioCodec")
            video_decision = "direct play"
            video_codec = helpers.get_xml_attr(media_info, "videoCodec")
            container = helpers.get_xml_attr(media_info, "container")
            bitrate = helpers.get_xml_attr(media_info, "bitrate")
            video_resolution = helpers.get_xml_attr(media_info, "videoResolution")
            video_framerate = helpers.get_xml_attr(media_info, "videoFrameRate")
            aspect_ratio = helpers.get_xml_attr(media_info, "aspectRatio")
            width = helpers.get_xml_attr(media_info, "width")
            height = helpers.get_xml_attr(media_info, "height")
            duration = helpers.get_xml_attr(media_info, "duration")
            progress = helpers.get_xml_attr(session, "viewOffset")

            if session.getElementsByTagName("TranscodeSession"):
                transcode_session = session.getElementsByTagName("TranscodeSession")[0]
                audio_decision = helpers.get_xml_attr(transcode_session, "audioDecision")
                transcode_audio_channels = helpers.get_xml_attr(transcode_session, "audioChannels")
                transcode_audio_codec = helpers.get_xml_attr(transcode_session, "audioCodec")
                video_decision = helpers.get_xml_attr(transcode_session, "videoDecision")
                transcode_video_codec = helpers.get_xml_attr(transcode_session, "videoCodec")
                transcode_width = helpers.get_xml_attr(transcode_session, "width")
                transcode_height = helpers.get_xml_attr(transcode_session, "height")
                transcode_container = helpers.get_xml_attr(transcode_session, "container")
                transcode_protocol = helpers.get_xml_attr(transcode_session, "protocol")
            else:
                transcode_audio_channels = ""
                transcode_audio_codec = ""
                transcode_video_codec = ""
                transcode_width = ""
                transcode_height = ""
                transcode_container = ""
                transcode_protocol = ""

            media_info = session.getElementsByTagName("Media")[0]
            if media_info.getElementsByTagName("Part"):
                indexes = helpers.get_xml_attr(media_info.getElementsByTagName("Part")[0], "indexes")
                part_id = helpers.get_xml_attr(media_info.getElementsByTagName("Part")[0], "id")
                if indexes == "sd":
                    bif_thumb = "/library/parts/" + part_id + "/indexes/sd/" + progress
                else:
                    bif_thumb = ""
            else:
                indexes = ""
                bif_thumb = ""

            if plexpy.CONFIG.PMS_USE_BIF and indexes == "sd":
                use_indexes = 1
            else:
                use_indexes = 0

            user_details = data_factory.get_user_details(
                user=helpers.get_xml_attr(session.getElementsByTagName("User")[0], "title")
            )

            if helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "machineIdentifier").endswith("_Video"):
                machine_id = helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "machineIdentifier")[:-6]
            else:
                machine_id = helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "machineIdentifier")

            if helpers.get_xml_attr(session, "type") == "episode":
                session_output = {
                    "session_key": helpers.get_xml_attr(session, "sessionKey"),
                    "media_index": helpers.get_xml_attr(session, "index"),
                    "parent_media_index": helpers.get_xml_attr(session, "parentIndex"),
                    "art": helpers.get_xml_attr(session, "art"),
                    "parent_thumb": helpers.get_xml_attr(session, "parentThumb"),
                    "grandparent_thumb": helpers.get_xml_attr(session, "grandparentThumb"),
                    "thumb": helpers.get_xml_attr(session, "thumb"),
                    "bif_thumb": bif_thumb,
                    "user": helpers.get_xml_attr(session.getElementsByTagName("User")[0], "title"),
                    "user_id": user_details["user_id"],
                    "friendly_name": user_details["friendly_name"],
                    "player": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "title"),
                    "platform": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "platform"),
                    "machine_id": machine_id,
                    "state": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "state"),
                    "grandparent_title": helpers.get_xml_attr(session, "grandparentTitle"),
                    "parent_title": helpers.get_xml_attr(session, "parentTitle"),
                    "title": helpers.get_xml_attr(session, "title"),
                    "rating_key": helpers.get_xml_attr(session, "ratingKey"),
                    "parent_rating_key": helpers.get_xml_attr(session, "parentRatingKey"),
                    "grandparent_rating_key": helpers.get_xml_attr(session, "grandparentRatingKey"),
                    "audio_decision": audio_decision,
                    "audio_channels": audio_channels,
                    "audio_codec": audio_codec,
                    "video_decision": video_decision,
                    "video_codec": video_codec,
                    "height": height,
                    "width": width,
                    "container": container,
                    "bitrate": bitrate,
                    "video_resolution": video_resolution,
                    "video_framerate": video_framerate,
                    "aspect_ratio": aspect_ratio,
                    "transcode_audio_channels": transcode_audio_channels,
                    "transcode_audio_codec": transcode_audio_codec,
                    "transcode_video_codec": transcode_video_codec,
                    "transcode_width": transcode_width,
                    "transcode_height": transcode_height,
                    "transcode_container": transcode_container,
                    "transcode_protocol": transcode_protocol,
                    "duration": duration,
                    "progress": progress,
                    "progress_percent": str(helpers.get_percent(progress, duration)),
                    "type": helpers.get_xml_attr(session, "type"),
                    "indexes": use_indexes,
                }
            elif helpers.get_xml_attr(session, "type") == "movie":
                session_output = {
                    "session_key": helpers.get_xml_attr(session, "sessionKey"),
                    "media_index": helpers.get_xml_attr(session, "index"),
                    "parent_media_index": helpers.get_xml_attr(session, "parentIndex"),
                    "art": helpers.get_xml_attr(session, "art"),
                    "thumb": helpers.get_xml_attr(session, "thumb"),
                    "bif_thumb": bif_thumb,
                    "parent_thumb": helpers.get_xml_attr(session, "parentThumb"),
                    "grandparent_thumb": helpers.get_xml_attr(session, "grandparentThumb"),
                    "user": helpers.get_xml_attr(session.getElementsByTagName("User")[0], "title"),
                    "user_id": user_details["user_id"],
                    "friendly_name": user_details["friendly_name"],
                    "player": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "title"),
                    "platform": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "platform"),
                    "machine_id": machine_id,
                    "state": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "state"),
                    "grandparent_title": helpers.get_xml_attr(session, "grandparentTitle"),
                    "parent_title": helpers.get_xml_attr(session, "parentTitle"),
                    "title": helpers.get_xml_attr(session, "title"),
                    "rating_key": helpers.get_xml_attr(session, "ratingKey"),
                    "parent_rating_key": helpers.get_xml_attr(session, "parentRatingKey"),
                    "grandparent_rating_key": helpers.get_xml_attr(session, "grandparentRatingKey"),
                    "audio_decision": audio_decision,
                    "audio_channels": audio_channels,
                    "audio_codec": audio_codec,
                    "video_decision": video_decision,
                    "video_codec": video_codec,
                    "height": height,
                    "width": width,
                    "container": container,
                    "bitrate": bitrate,
                    "video_resolution": video_resolution,
                    "video_framerate": video_framerate,
                    "aspect_ratio": aspect_ratio,
                    "transcode_audio_channels": transcode_audio_channels,
                    "transcode_audio_codec": transcode_audio_codec,
                    "transcode_video_codec": transcode_video_codec,
                    "transcode_width": transcode_width,
                    "transcode_height": transcode_height,
                    "transcode_container": transcode_container,
                    "transcode_protocol": transcode_protocol,
                    "duration": duration,
                    "progress": progress,
                    "progress_percent": str(helpers.get_percent(progress, duration)),
                    "type": helpers.get_xml_attr(session, "type"),
                    "indexes": use_indexes,
                }
            elif helpers.get_xml_attr(session, "type") == "clip":
                session_output = {
                    "session_key": helpers.get_xml_attr(session, "sessionKey"),
                    "media_index": helpers.get_xml_attr(session, "index"),
                    "parent_media_index": helpers.get_xml_attr(session, "parentIndex"),
                    "art": helpers.get_xml_attr(session, "art"),
                    "thumb": helpers.get_xml_attr(session, "thumb"),
                    "bif_thumb": bif_thumb,
                    "parent_thumb": helpers.get_xml_attr(session, "parentThumb"),
                    "grandparent_thumb": helpers.get_xml_attr(session, "grandparentThumb"),
                    "user": helpers.get_xml_attr(session.getElementsByTagName("User")[0], "title"),
                    "user_id": user_details["user_id"],
                    "friendly_name": user_details["friendly_name"],
                    "player": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "title"),
                    "platform": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "platform"),
                    "machine_id": machine_id,
                    "state": helpers.get_xml_attr(session.getElementsByTagName("Player")[0], "state"),
                    "grandparent_title": helpers.get_xml_attr(session, "grandparentTitle"),
                    "parent_title": helpers.get_xml_attr(session, "parentTitle"),
                    "title": helpers.get_xml_attr(session, "title"),
                    "rating_key": helpers.get_xml_attr(session, "ratingKey"),
                    "parent_rating_key": helpers.get_xml_attr(session, "parentRatingKey"),
                    "grandparent_rating_key": helpers.get_xml_attr(session, "grandparentRatingKey"),
                    "audio_decision": audio_decision,
                    "audio_channels": audio_channels,
                    "audio_codec": audio_codec,
                    "video_decision": video_decision,
                    "video_codec": video_codec,
                    "height": height,
                    "width": width,
                    "container": container,
                    "bitrate": bitrate,
                    "video_resolution": video_resolution,
                    "video_framerate": video_framerate,
                    "aspect_ratio": aspect_ratio,
                    "transcode_audio_channels": transcode_audio_channels,
                    "transcode_audio_codec": transcode_audio_codec,
                    "transcode_video_codec": transcode_video_codec,
                    "transcode_width": transcode_width,
                    "transcode_height": transcode_height,
                    "transcode_container": transcode_container,
                    "transcode_protocol": transcode_protocol,
                    "duration": duration,
                    "progress": progress,
                    "progress_percent": str(helpers.get_percent(progress, duration)),
                    "type": helpers.get_xml_attr(session, "type"),
                    "indexes": 0,
                }
        else:
            logger.warn(u"No known stream types found in session list.")

        return session_output
Example #32
0
def extract_plexwatch_xml(xml=None):
    output = {}
    clean_xml = helpers.latinToAscii(xml)
    try:
        xml_parse = minidom.parseString(clean_xml)
    except:
        logger.warn(u"PlexPy Importer :: Error parsing XML for Plexwatch database.")
        return None

    xml_head = xml_parse.getElementsByTagName('opt')
    if not xml_head:
        logger.warn(u"PlexPy Importer :: Error parsing XML for Plexwatch database.")
        return None

    for a in xml_head:
        added_at = helpers.get_xml_attr(a, 'addedAt')
        art = helpers.get_xml_attr(a, 'art')
        duration = helpers.get_xml_attr(a, 'duration')
        grandparent_thumb = helpers.get_xml_attr(a, 'grandparentThumb')
        grandparent_title = helpers.get_xml_attr(a, 'grandparentTitle')
        guid = helpers.get_xml_attr(a, 'guid')
        section_id = helpers.get_xml_attr(a, 'librarySectionID')
        media_index = helpers.get_xml_attr(a, 'index')
        originally_available_at = helpers.get_xml_attr(a, 'originallyAvailableAt')
        last_viewed_at = helpers.get_xml_attr(a, 'lastViewedAt')
        parent_media_index = helpers.get_xml_attr(a, 'parentIndex')
        parent_thumb = helpers.get_xml_attr(a, 'parentThumb')
        rating = helpers.get_xml_attr(a, 'rating')
        thumb = helpers.get_xml_attr(a, 'thumb')
        media_type = helpers.get_xml_attr(a, 'type')
        updated_at = helpers.get_xml_attr(a, 'updatedAt')
        view_offset = helpers.get_xml_attr(a, 'viewOffset')
        year = helpers.get_xml_attr(a, 'year')
        parent_title = helpers.get_xml_attr(a, 'parentTitle')
        studio = helpers.get_xml_attr(a, 'studio')
        title = helpers.get_xml_attr(a, 'title')
        tagline = helpers.get_xml_attr(a, 'tagline')

        directors = []
        if a.getElementsByTagName('Director'):
            director_elem = a.getElementsByTagName('Director')
            for b in director_elem:
                directors.append(helpers.get_xml_attr(b, 'tag'))

        aspect_ratio = ''
        audio_channels = None
        audio_codec = ''
        bitrate = None
        container = ''
        height = None
        video_codec = ''
        video_framerate = ''
        video_resolution = ''
        width = None

        if a.getElementsByTagName('Media'):
            media_elem = a.getElementsByTagName('Media')
            for c in media_elem:
                aspect_ratio = helpers.get_xml_attr(c, 'aspectRatio')
                audio_channels = helpers.get_xml_attr(c, 'audioChannels')
                audio_codec = helpers.get_xml_attr(c, 'audioCodec')
                bitrate = helpers.get_xml_attr(c, 'bitrate')
                container = helpers.get_xml_attr(c, 'container')
                height = helpers.get_xml_attr(c, 'height')
                video_codec = helpers.get_xml_attr(c, 'videoCodec')
                video_framerate = helpers.get_xml_attr(c, 'videoFrameRate')
                video_resolution = helpers.get_xml_attr(c, 'videoResolution')
                width = helpers.get_xml_attr(c, 'width')

        machine_id = ''
        platform = ''
        player = ''

        if a.getElementsByTagName('Player'):
            player_elem = a.getElementsByTagName('Player')
            for d in player_elem:
                machine_id = helpers.get_xml_attr(d, 'machineIdentifier')
                platform = helpers.get_xml_attr(d, 'platform')
                player = helpers.get_xml_attr(d, 'title')

        transcode_audio_channels = None
        transcode_audio_codec = ''
        audio_decision = 'direct play'
        transcode_container = ''
        transcode_height = None
        transcode_protocol = ''
        transcode_video_codec = ''
        video_decision = 'direct play'
        transcode_width = None

        if a.getElementsByTagName('TranscodeSession'):
            transcode_elem = a.getElementsByTagName('TranscodeSession')
            for e in transcode_elem:
                transcode_audio_channels = helpers.get_xml_attr(e, 'audioChannels')
                transcode_audio_codec = helpers.get_xml_attr(e, 'audioCodec')
                audio_decision = helpers.get_xml_attr(e, 'audioDecision')
                transcode_container = helpers.get_xml_attr(e, 'container')
                transcode_height = helpers.get_xml_attr(e, 'height')
                transcode_protocol = helpers.get_xml_attr(e, 'protocol')
                transcode_video_codec = helpers.get_xml_attr(e, 'videoCodec')
                video_decision = helpers.get_xml_attr(e, 'videoDecision')
                transcode_width = helpers.get_xml_attr(e, 'width')

        user_id = None

        if a.getElementsByTagName('User'):
            user_elem = a.getElementsByTagName('User')
            for f in user_elem:
                user_id = helpers.get_xml_attr(f, 'id')

        writers = []
        if a.getElementsByTagName('Writer'):
            writer_elem = a.getElementsByTagName('Writer')
            for g in writer_elem:
                writers.append(helpers.get_xml_attr(g, 'tag'))

        actors = []
        if a.getElementsByTagName('Role'):
            actor_elem = a.getElementsByTagName('Role')
            for h in actor_elem:
                actors.append(helpers.get_xml_attr(h, 'tag'))

        genres = []
        if a.getElementsByTagName('Genre'):
            genre_elem = a.getElementsByTagName('Genre')
            for i in genre_elem:
                genres.append(helpers.get_xml_attr(i, 'tag'))

        output = {'added_at': added_at,
                  'art': art,
                  'duration': duration,
                  'grandparent_thumb': grandparent_thumb,
                  'grandparent_title': grandparent_title,
                  'parent_title': parent_title,
                  'title': title,
                  'tagline': tagline,
                  'guid': guid,
                  'section_id': section_id,
                  'media_index': media_index,
                  'originally_available_at': originally_available_at,
                  'last_viewed_at': last_viewed_at,
                  'parent_media_index': parent_media_index,
                  'parent_thumb': parent_thumb,
                  'rating': rating,
                  'thumb': thumb,
                  'media_type': media_type,
                  'updated_at': updated_at,
                  'view_offset': view_offset,
                  'year': year,
                  'directors': directors,
                  'aspect_ratio': aspect_ratio,
                  'audio_channels': audio_channels,
                  'audio_codec': audio_codec,
                  'bitrate': bitrate,
                  'container': container,
                  'height': height,
                  'video_codec': video_codec,
                  'video_framerate': video_framerate,
                  'video_resolution': video_resolution,
                  'width': width,
                  'machine_id': machine_id,
                  'platform': platform,
                  'player': player,
                  'transcode_audio_channels': transcode_audio_channels,
                  'transcode_audio_codec': transcode_audio_codec,
                  'audio_decision': audio_decision,
                  'transcode_container': transcode_container,
                  'transcode_height': transcode_height,
                  'transcode_protocol': transcode_protocol,
                  'transcode_video_codec': transcode_video_codec,
                  'video_decision': video_decision,
                  'transcode_width': transcode_width,
                  'user_id': user_id,
                  'writers': writers,
                  'actors': actors,
                  'genres': genres,
                  'studio': studio
                  }

    return output
Example #33
0
    def get_server_connections(self,
                               pms_identifier='',
                               pms_ip='',
                               pms_port=32400,
                               include_https=True):

        if not pms_identifier:
            logger.error(
                u"Tautulli PlexTV :: Unable to retrieve server connections: no pms_identifier provided."
            )
            return {}

        plextv_resources = self.get_plextv_resources(
            include_https=include_https, output_format='xml')
        try:
            xml_head = plextv_resources.getElementsByTagName('Device')
        except Exception as e:
            logger.warn(
                u"Tautulli PlexTV :: Unable to parse XML for get_server_urls: %s."
                % e)
            return {}

        # Function to get all connections for a device
        def get_connections(device):
            conn = []
            connections = device.getElementsByTagName('Connection')

            server = {
                'pms_identifier':
                helpers.get_xml_attr(device, 'clientIdentifier'),
                'pms_name':
                helpers.get_xml_attr(device, 'name'),
                'pms_version':
                helpers.get_xml_attr(device, 'productVersion'),
                'pms_platform':
                helpers.get_xml_attr(device, 'platform'),
                'pms_presence':
                helpers.get_xml_attr(device, 'presence'),
                'pms_is_cloud':
                1 if helpers.get_xml_attr(device, 'platform') == 'Cloud' else 0
            }

            for c in connections:
                server_details = {
                    'protocol': helpers.get_xml_attr(c, 'protocol'),
                    'address': helpers.get_xml_attr(c, 'address'),
                    'port': helpers.get_xml_attr(c, 'port'),
                    'uri': helpers.get_xml_attr(c, 'uri'),
                    'local': helpers.get_xml_attr(c, 'local')
                }
                conn.append(server_details)

            server['connections'] = conn
            return server

        server = {}

        # Try to match the device
        for a in xml_head:
            if helpers.get_xml_attr(a, 'clientIdentifier') == pms_identifier:
                server = get_connections(a)
                break

        # Else no device match found
        if not server:
            # Try to match the PMS_IP and PMS_PORT
            for a in xml_head:
                if helpers.get_xml_attr(a, 'provides') == 'server':
                    connections = a.getElementsByTagName('Connection')

                    for connection in connections:
                        if helpers.get_xml_attr(connection, 'address') == pms_ip and \
                                helpers.get_xml_attr(connection, 'port') == str(pms_port):
                            server = get_connections(a)
                            break

                    if server.get('connections'):
                        break

        return server
Example #34
0
    def get_devices_list(self):
        devices = self.get_plextv_devices_list(output_format='xml')

        try:
            xml_head = devices.getElementsByTagName('Device')
        except Exception as e:
            logger.warn(
                u"Tautulli PlexTV :: Unable to parse XML for get_devices_list: %s."
                % e)
            return []

        devices_list = []
        for a in xml_head:
            device = {
                "device_name": helpers.get_xml_attr(a, 'name'),
                "product": helpers.get_xml_attr(a, 'product'),
                "product_version": helpers.get_xml_attr(a, 'productVersion'),
                "platform": helpers.get_xml_attr(a, 'platform'),
                "platform_version": helpers.get_xml_attr(a, 'platformVersion'),
                "device": helpers.get_xml_attr(a, 'device'),
                "model": helpers.get_xml_attr(a, 'model'),
                "vendor": helpers.get_xml_attr(a, 'vendor'),
                "provides": helpers.get_xml_attr(a, 'provides'),
                "device_identifier":
                helpers.get_xml_attr(a, 'clientIdentifier'),
                "device_id": helpers.get_xml_attr(a, 'id'),
                "token": helpers.get_xml_attr(a, 'token')
            }
            devices_list.append(device)

        return devices_list
Example #35
0
    def get_server_urls(self, include_https=True):

        if plexpy.CONFIG.PMS_IDENTIFIER:
            server_id = plexpy.CONFIG.PMS_IDENTIFIER
        else:
            logger.error(
                u"PlexPy PlexTV :: Unable to retrieve server identity.")
            return []

        plextv_resources = self.get_plextv_resources(
            include_https=include_https)

        try:
            xml_parse = minidom.parseString(plextv_resources)
        except Exception as e:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_server_urls: %s"
                % e)
            return []
        except:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_server_urls.")
            return []

        try:
            xml_head = xml_parse.getElementsByTagName('Device')
        except Exception as e:
            logger.warn(
                u"PlexPy PlexTV :: Unable to parse XML for get_server_urls: %s."
                % e)
            return []

        # Function to get all connections for a device
        def get_connections(device):
            conn = []
            connections = device.getElementsByTagName('Connection')

            for c in connections:
                server_details = {
                    "protocol": helpers.get_xml_attr(c, 'protocol'),
                    "address": helpers.get_xml_attr(c, 'address'),
                    "port": helpers.get_xml_attr(c, 'port'),
                    "uri": helpers.get_xml_attr(c, 'uri'),
                    "local": helpers.get_xml_attr(c, 'local')
                }
                conn.append(server_details)

            return conn

        server_urls = []

        # Try to match the device
        for a in xml_head:
            if helpers.get_xml_attr(a, 'clientIdentifier') == server_id:
                server_urls = get_connections(a)
                break

        # Else no device match found
        if not server_urls:
            # Try to match the PMS_IP and PMS_PORT
            for a in xml_head:
                if helpers.get_xml_attr(a, 'provides') == 'server':
                    connections = a.getElementsByTagName('Connection')

                    for connection in connections:
                        if helpers.get_xml_attr(connection, 'address') == plexpy.CONFIG.PMS_IP and \
                            int(helpers.get_xml_attr(connection, 'port')) == plexpy.CONFIG.PMS_PORT:

                            plexpy.CONFIG.PMS_IDENTIFIER = helpers.get_xml_attr(
                                a, 'clientIdentifier')
                            plexpy.CONFIG.write()

                            logger.info(u"PlexPy PlexTV :: PMS identifier changed from %s to %s." % \
                                        (server_id, plexpy.CONFIG.PMS_IDENTIFIER))

                            server_urls = get_connections(a)
                            break

                    if server_urls:
                        break

        return server_urls
Example #36
0
    def get_synced_items(self,
                         machine_id=None,
                         client_id_filter=None,
                         user_id_filter=None,
                         rating_key_filter=None,
                         sync_id_filter=None,
                         server_id_filter=None):

        if isinstance(rating_key_filter, list):
            rating_key_filter = [str(k) for k in rating_key_filter]
        elif rating_key_filter:
            rating_key_filter = [str(rating_key_filter)]

        if isinstance(user_id_filter, list):
            user_id_filter = [str(k) for k in user_id_filter]
        elif user_id_filter:
            user_id_filter = [str(user_id_filter)]

        user_data = users.Users()

        synced_items = []

        for server in plexpy.PMS_SERVERS:
            if server_id_filter and int(server_id_filter) != server.CONFIG.ID:
                continue
            if not session.allow_session_server(server.CONFIG.ID):
                continue

            machine_id = server.CONFIG.PMS_IDENTIFIER
            sync_list = self.get_plextv_sync_lists(machine_id,
                                                   output_format='xml')

            try:
                xml_head = sync_list.getElementsByTagName('SyncList')
            except Exception as e:
                logger.warn(
                    u"Tautulli PlexTV :: Unable to parse XML for get_synced_items: %s."
                    % e)
                return {}

            for a in xml_head:
                client_id = helpers.get_xml_attr(a, 'clientIdentifier')

                # Filter by client_id
                if client_id_filter and str(client_id_filter) != client_id:
                    continue

                sync_list_id = helpers.get_xml_attr(a, 'id')
                sync_device = a.getElementsByTagName('Device')

                for device in sync_device:
                    device_user_id = helpers.get_xml_attr(device, 'userID')
                    try:
                        device_username = user_data.get_details(
                            user_id=device_user_id)['username']
                        device_friendly_name = user_data.get_details(
                            user_id=device_user_id)['friendly_name']
                    except:
                        device_username = ''
                        device_friendly_name = ''
                    device_name = helpers.get_xml_attr(device, 'name')
                    device_product = helpers.get_xml_attr(device, 'product')
                    device_product_version = helpers.get_xml_attr(
                        device, 'productVersion')
                    device_platform = helpers.get_xml_attr(device, 'platform')
                    device_platform_version = helpers.get_xml_attr(
                        device, 'platformVersion')
                    device_type = helpers.get_xml_attr(device, 'device')
                    device_model = helpers.get_xml_attr(device, 'model')
                    device_last_seen = helpers.get_xml_attr(
                        device, 'lastSeenAt')

                # Filter by user_id
                if user_id_filter and device_user_id not in user_id_filter:
                    continue

                for synced in a.getElementsByTagName('SyncItems'):
                    sync_item = synced.getElementsByTagName('SyncItem')
                    for item in sync_item:

                        for location in item.getElementsByTagName('Location'):
                            clean_uri = helpers.get_xml_attr(
                                location, 'uri').split('%2F')

                        rating_key = next(
                            (clean_uri[(idx + 1) % len(clean_uri)]
                             for idx, item in enumerate(clean_uri)
                             if item == 'metadata'), None)

                        # Filter by rating_key
                        if rating_key_filter and rating_key not in rating_key_filter:
                            continue

                        sync_id = helpers.get_xml_attr(item, 'id')

                        # Filter by sync_id
                        if sync_id_filter and str(sync_id_filter) != sync_id:
                            continue

                        sync_version = helpers.get_xml_attr(item, 'version')
                        sync_root_title = helpers.get_xml_attr(
                            item, 'rootTitle')
                        sync_title = helpers.get_xml_attr(item, 'title')
                        sync_metadata_type = helpers.get_xml_attr(
                            item, 'metadataType')
                        sync_content_type = helpers.get_xml_attr(
                            item, 'contentType')

                        for status in item.getElementsByTagName('Status'):
                            status_failure_code = helpers.get_xml_attr(
                                status, 'failureCode')
                            status_failure = helpers.get_xml_attr(
                                status, 'failure')
                            status_state = helpers.get_xml_attr(
                                status, 'state')
                            status_item_count = helpers.get_xml_attr(
                                status, 'itemsCount')
                            status_item_complete_count = helpers.get_xml_attr(
                                status, 'itemsCompleteCount')
                            status_item_downloaded_count = helpers.get_xml_attr(
                                status, 'itemsDownloadedCount')
                            status_item_ready_count = helpers.get_xml_attr(
                                status, 'itemsReadyCount')
                            status_item_successful_count = helpers.get_xml_attr(
                                status, 'itemsSuccessfulCount')
                            status_total_size = helpers.get_xml_attr(
                                status, 'totalSize')
                            status_item_download_percent_complete = helpers.get_percent(
                                status_item_downloaded_count,
                                status_item_count)

                        for settings in item.getElementsByTagName(
                                'MediaSettings'):
                            settings_video_bitrate = helpers.get_xml_attr(
                                settings, 'maxVideoBitrate')
                            settings_video_quality = helpers.get_xml_attr(
                                settings, 'videoQuality')
                            settings_video_resolution = helpers.get_xml_attr(
                                settings, 'videoResolution')
                            settings_audio_boost = helpers.get_xml_attr(
                                settings, 'audioBoost')
                            settings_audio_bitrate = helpers.get_xml_attr(
                                settings, 'musicBitrate')
                            settings_photo_quality = helpers.get_xml_attr(
                                settings, 'photoQuality')
                            settings_photo_resolution = helpers.get_xml_attr(
                                settings, 'photoResolution')

                        sync_details = {
                            "device_name": helpers.sanitize(device_name),
                            "server_id": server.CONFIG.ID,
                            "server_name": server.CONFIG.PMS_NAME,
                            "platform": helpers.sanitize(device_platform),
                            "user_id": device_user_id,
                            "user": helpers.sanitize(device_friendly_name),
                            "username": helpers.sanitize(device_username),
                            "root_title": helpers.sanitize(sync_root_title),
                            "sync_title": helpers.sanitize(sync_title),
                            "metadata_type": sync_metadata_type,
                            "content_type": sync_content_type,
                            "rating_key": rating_key,
                            "state": status_state,
                            "item_count": status_item_count,
                            "item_complete_count": status_item_complete_count,
                            "item_downloaded_count":
                            status_item_downloaded_count,
                            "item_downloaded_percent_complete":
                            status_item_download_percent_complete,
                            "video_bitrate": settings_video_bitrate,
                            "audio_bitrate": settings_audio_bitrate,
                            "photo_quality": settings_photo_quality,
                            "video_quality": settings_video_quality,
                            "total_size": status_total_size,
                            "failure": status_failure,
                            "client_id": client_id,
                            "sync_id": sync_id
                        }

                        synced_items.append(sync_details)

        return session.filter_session_info(synced_items, filter_key='user_id')
Example #37
0
        try:
            xml_parse = minidom.parseString(own_account)
        except Exception, e:
            logger.warn("Error parsing XML for Plex account details: %s" % e)
            return []
        except:
            logger.warn("Error parsing XML for Plex account details.")
            return []

        xml_head = xml_parse.getElementsByTagName("user")
        if not xml_head:
            logger.warn("Error parsing XML for Plex account details.")
        else:
            for a in xml_head:
                own_details = {
                    "user_id": helpers.get_xml_attr(a, "id"),
                    "username": helpers.get_xml_attr(a, "username"),
                    "thumb": helpers.get_xml_attr(a, "thumb"),
                    "email": helpers.get_xml_attr(a, "email"),
                    "is_home_user": helpers.get_xml_attr(a, "home"),
                    "is_allow_sync": None,
                    "is_restricted": helpers.get_xml_attr(a, "restricted"),
                }

                users_list.append(own_details)

        try:
            xml_parse = minidom.parseString(friends_list)
        except Exception, e:
            logger.warn("Error parsing XML for Plex friends list: %s" % e)
        except:
Example #38
0
    def get_servers_list(self, include_cloud=True, all_servers=False):
        """ Query plex for all servers online. Returns the ones you own in a selectize format """

        # Try to discover localhost server
        local_server = {
            'pms_ssl': '0',
            'pms_ip': '127.0.0.1',
            'pms_port': '32400',
            'pms_name': 'Local',
            'pms_url': 'http://127.0.0.1:32400',
            'pms_is_remote': '0',
            'pms_is_cloud': '0',
            'pms_token': plexpy.CONFIG.PMS_TOKEN,
        }
        local_machine_identifier = None
        request_handler = http_handler.HTTPHandler(
            urls='http://127.0.0.1:32400',
            timeout=1,
            ssl_verify=False,
            silent=True)
        request = request_handler.make_request(uri='/identity',
                                               request_type='GET',
                                               output_format='xml')
        if request:
            xml_head = request.getElementsByTagName('MediaContainer')[0]
            local_machine_identifier = xml_head.getAttribute(
                'machineIdentifier')
            server = self.get_server_connections(
                pms_identifier=local_machine_identifier)
            if server:
                server.pop('pms_presence')
                conn = server.pop('connections')
                local_server['pms_uri'] = conn[0]['uri']
                local_server.update(server)

        servers = self.get_plextv_resources(include_https=True,
                                            output_format='xml')
        clean_servers = []

        try:
            xml_head = servers.getElementsByTagName('MediaContainer')
        except Exception as e:
            logger.warn(
                u"Tautulli PlexTV :: Failed to get servers from plex: %s." % e)
            return []

        for a in xml_head:
            if a.getAttribute('size'):
                if a.getAttribute('size') == '0':
                    return []

            if a.getElementsByTagName('Device'):
                devices = a.getElementsByTagName('Device')

                for d in devices:
                    if helpers.get_xml_attr(d, 'presence') == '1' and \
                            helpers.get_xml_attr(d, 'owned') == '1' and \
                            helpers.get_xml_attr(d, 'provides') == 'server':

                        is_cloud = (helpers.get_xml_attr(
                            d, 'platform').lower() == 'cloud')
                        if not include_cloud and is_cloud:
                            continue

                        connections = d.getElementsByTagName('Connection')

                        for c in connections:
                            if not all_servers:
                                # If this is a remote server don't show any local IPs.
                                if helpers.get_xml_attr(d, 'publicAddressMatches') == '0' and \
                                        helpers.get_xml_attr(c, 'local') == '1':
                                    continue

                                # If this is a local server don't show any remote IPs.
                                if helpers.get_xml_attr(d, 'publicAddressMatches') == '1' and \
                                        helpers.get_xml_attr(c, 'local') == '0':
                                    continue

                            server = {
                                'pms_ssl':
                                1 if is_cloud else int(
                                    helpers.get_xml_attr(d, 'httpsRequired')
                                    or 0),
                                'pms_identifier':
                                helpers.get_xml_attr(d, 'clientIdentifier'),
                                'pms_name':
                                helpers.get_xml_attr(d, 'name'),
                                'pms_ip':
                                helpers.get_xml_attr(c, 'address'),
                                'pms_port':
                                helpers.get_xml_attr(c, 'port'),
                                'pms_uri':
                                helpers.get_xml_attr(c, 'uri'),
                                'pms_is_remote':
                                int(not int(
                                    helpers.get_xml_attr(c, 'local') or 0)),
                                'pms_platform':
                                helpers.get_xml_attr(d, 'platform'),
                                'pms_version':
                                helpers.get_xml_attr(d, 'productVersion'),
                                'pms_is_cloud':
                                int(is_cloud or 0),
                                'pms_token':
                                plexpy.CONFIG.PMS_TOKEN,
                            }

                            pms_connect = pmsconnect.PmsConnect(
                                url=server['pms_uri'],
                                serverName=server['pms_name'])
                            pms_ssl_pref = pms_connect.get_server_pref(
                                'secureConnections')
                            if pms_ssl_pref:
                                server['pms_ssl_pref'] = int(pms_ssl_pref)

                            pms_url = 'http://{hostname}:{port}'.format(
                                hostname=helpers.get_xml_attr(c, 'address'),
                                port=helpers.get_xml_attr(c, 'port'))
                            if server['pms_ssl']:
                                server['pms_url'] = server['pms_uri']
                            else:
                                server['pms_url'] = pms_url

                            clean_servers.append(server)

        if local_machine_identifier:
            found = False
            for server in clean_servers:
                if server['pms_identifier'] == local_machine_identifier:
                    local_server.pop('pms_name')
                    server.update(local_server)
                    found = True
                    break
            if not found:
                local_server['pms_identifier'] = local_machine_identifier
                clean_servers.append(local_server)

        clean_servers.sort(key=lambda s: (s['pms_name'], -int(s[
            'pms_is_remote']), s['pms_ip']))

        return clean_servers
Example #39
0
    def discover(self):
        """ Query plex for all servers online. Returns the ones you own in a selectize format """
        servers = self.get_plextv_resources(include_https=True,
                                            output_format='xml')
        clean_servers = []

        try:
            xml_head = servers.getElementsByTagName('MediaContainer')
        except Exception as e:
            logger.warn(
                u"PlexPy PlexTV :: Failed to get servers from plex: %s." % e)
            return []

        for a in xml_head:
            if a.getAttribute('size'):
                if a.getAttribute('size') == '0':
                    return []

            if a.getElementsByTagName('Device'):
                devices = a.getElementsByTagName('Device')

                for d in devices:
                    if helpers.get_xml_attr(d, 'presence') == '1' and \
                        helpers.get_xml_attr(d, 'owned') == '1' and \
                        helpers.get_xml_attr(d, 'provides') == 'server':
                        connections = d.getElementsByTagName('Connection')

                        for c in connections:
                            # If this is a remote server don't show any local IPs.
                            if helpers.get_xml_attr(d, 'publicAddressMatches') == '0' and \
                                helpers.get_xml_attr(c, 'local') == '1':
                                continue

                            # If this is a local server don't show any remote IPs.
                            if helpers.get_xml_attr(d, 'publicAddressMatches') == '1' and \
                                helpers.get_xml_attr(c, 'local') == '0':
                                continue

                            server = {
                                'httpsRequired':
                                helpers.get_xml_attr(d, 'httpsRequired'),
                                'clientIdentifier':
                                helpers.get_xml_attr(d, 'clientIdentifier'),
                                'label':
                                helpers.get_xml_attr(d, 'name'),
                                'ip':
                                helpers.get_xml_attr(c, 'address'),
                                'port':
                                helpers.get_xml_attr(c, 'port'),
                                'local':
                                helpers.get_xml_attr(c, 'local'),
                                'value':
                                helpers.get_xml_attr(c, 'address')
                            }
                            clean_servers.append(server)

        return clean_servers
Example #40
0
    def get_metadata_details(self, rating_key=""):
        metadata = self.get_metadata(rating_key, output_format="xml")

        try:
            xml_head = metadata.getElementsByTagName("MediaContainer")
        except:
            logger.warn("Unable to parse XML for get_metadata.")
            return []

        metadata_list = []

        for a in xml_head:
            if a.getAttribute("size"):
                if a.getAttribute("size") != "1":
                    metadata_list = {"metadata": None}
                    return metadata_list

            if a.getElementsByTagName("Directory"):
                metadata_main = a.getElementsByTagName("Directory")[0]
                metadata_type = helpers.get_xml_attr(metadata_main, "type")
            elif a.getElementsByTagName("Video"):
                metadata_main = a.getElementsByTagName("Video")[0]
                metadata_type = helpers.get_xml_attr(metadata_main, "type")
            elif a.getElementsByTagName("Track"):
                metadata_main = a.getElementsByTagName("Track")[0]
                metadata_type = helpers.get_xml_attr(metadata_main, "type")
            else:
                logger.debug(u"Metadata failed")

        genres = []
        actors = []
        writers = []
        directors = []

        if metadata_main.getElementsByTagName("Genre"):
            for genre in metadata_main.getElementsByTagName("Genre"):
                genres.append(helpers.get_xml_attr(genre, "tag"))

        if metadata_main.getElementsByTagName("Role"):
            for actor in metadata_main.getElementsByTagName("Role"):
                actors.append(helpers.get_xml_attr(actor, "tag"))

        if metadata_main.getElementsByTagName("Writer"):
            for writer in metadata_main.getElementsByTagName("Writer"):
                writers.append(helpers.get_xml_attr(writer, "tag"))

        if metadata_main.getElementsByTagName("Director"):
            for director in metadata_main.getElementsByTagName("Director"):
                directors.append(helpers.get_xml_attr(director, "tag"))

        if metadata_type == "show":
            metadata = {
                "type": metadata_type,
                "rating_key": helpers.get_xml_attr(metadata_main, "ratingKey"),
                "grandparent_title": helpers.get_xml_attr(metadata_main, "grandparentTitle"),
                "parent_index": helpers.get_xml_attr(metadata_main, "parentIndex"),
                "parent_title": helpers.get_xml_attr(metadata_main, "parentTitle"),
                "index": helpers.get_xml_attr(metadata_main, "index"),
                "studio": helpers.get_xml_attr(metadata_main, "studio"),
                "title": helpers.get_xml_attr(metadata_main, "title"),
                "content_rating": helpers.get_xml_attr(metadata_main, "contentRating"),
                "summary": helpers.get_xml_attr(metadata_main, "summary"),
                "rating": helpers.get_xml_attr(metadata_main, "rating"),
                "duration": helpers.get_xml_attr(metadata_main, "duration"),
                "year": helpers.get_xml_attr(metadata_main, "year"),
                "thumb": helpers.get_xml_attr(metadata_main, "thumb"),
                "parent_thumb": helpers.get_xml_attr(metadata_main, "parentThumb"),
                "grandparent_thumb": helpers.get_xml_attr(metadata_main, "grandparentThumb"),
                "art": helpers.get_xml_attr(metadata_main, "art"),
                "originally_available_at": helpers.get_xml_attr(metadata_main, "originallyAvailableAt"),
                "added_at": helpers.get_xml_attr(metadata_main, "addedAt"),
                "updated_at": helpers.get_xml_attr(metadata_main, "updatedAt"),
                "last_viewed_at": helpers.get_xml_attr(metadata_main, "lastViewedAt"),
                "guid": helpers.get_xml_attr(metadata_main, "guid"),
                "writers": writers,
                "directors": directors,
                "genres": genres,
                "actors": actors,
            }
            metadata_list = {"metadata": metadata}
        elif metadata_type == "episode":
            metadata = {
                "type": metadata_type,
                "rating_key": helpers.get_xml_attr(metadata_main, "ratingKey"),
                "grandparent_title": helpers.get_xml_attr(metadata_main, "grandparentTitle"),
                "parent_index": helpers.get_xml_attr(metadata_main, "parentIndex"),
                "parent_title": helpers.get_xml_attr(metadata_main, "parentTitle"),
                "index": helpers.get_xml_attr(metadata_main, "index"),
                "studio": helpers.get_xml_attr(metadata_main, "studio"),
                "title": helpers.get_xml_attr(metadata_main, "title"),
                "content_rating": helpers.get_xml_attr(metadata_main, "contentRating"),
                "summary": helpers.get_xml_attr(metadata_main, "summary"),
                "rating": helpers.get_xml_attr(metadata_main, "rating"),
                "duration": helpers.get_xml_attr(metadata_main, "duration"),
                "year": helpers.get_xml_attr(metadata_main, "year"),
                "thumb": helpers.get_xml_attr(metadata_main, "thumb"),
                "parent_thumb": helpers.get_xml_attr(metadata_main, "parentThumb"),
                "grandparent_thumb": helpers.get_xml_attr(metadata_main, "grandparentThumb"),
                "art": helpers.get_xml_attr(metadata_main, "art"),
                "originally_available_at": helpers.get_xml_attr(metadata_main, "originallyAvailableAt"),
                "added_at": helpers.get_xml_attr(metadata_main, "addedAt"),
                "updated_at": helpers.get_xml_attr(metadata_main, "updatedAt"),
                "last_viewed_at": helpers.get_xml_attr(metadata_main, "lastViewedAt"),
                "guid": helpers.get_xml_attr(metadata_main, "guid"),
                "writers": writers,
                "directors": directors,
                "genres": genres,
                "actors": actors,
            }
            metadata_list = {"metadata": metadata}
        elif metadata_type == "movie":
            metadata = {
                "type": metadata_type,
                "rating_key": helpers.get_xml_attr(metadata_main, "ratingKey"),
                "grandparent_title": helpers.get_xml_attr(metadata_main, "grandparentTitle"),
                "parent_index": helpers.get_xml_attr(metadata_main, "parentIndex"),
                "parent_title": helpers.get_xml_attr(metadata_main, "parentTitle"),
                "index": helpers.get_xml_attr(metadata_main, "index"),
                "studio": helpers.get_xml_attr(metadata_main, "studio"),
                "title": helpers.get_xml_attr(metadata_main, "title"),
                "content_rating": helpers.get_xml_attr(metadata_main, "contentRating"),
                "summary": helpers.get_xml_attr(metadata_main, "summary"),
                "rating": helpers.get_xml_attr(metadata_main, "rating"),
                "duration": helpers.get_xml_attr(metadata_main, "duration"),
                "year": helpers.get_xml_attr(metadata_main, "year"),
                "thumb": helpers.get_xml_attr(metadata_main, "thumb"),
                "parent_thumb": helpers.get_xml_attr(metadata_main, "parentThumb"),
                "grandparent_thumb": helpers.get_xml_attr(metadata_main, "grandparentThumb"),
                "art": helpers.get_xml_attr(metadata_main, "art"),
                "originally_available_at": helpers.get_xml_attr(metadata_main, "originallyAvailableAt"),
                "added_at": helpers.get_xml_attr(metadata_main, "addedAt"),
                "updated_at": helpers.get_xml_attr(metadata_main, "updatedAt"),
                "last_viewed_at": helpers.get_xml_attr(metadata_main, "lastViewedAt"),
                "guid": helpers.get_xml_attr(metadata_main, "guid"),
                "genres": genres,
                "actors": actors,
                "writers": writers,
                "directors": directors,
            }
            metadata_list = {"metadata": metadata}
        elif metadata_type == "season":
            parent_rating_key = helpers.get_xml_attr(metadata_main, "parentRatingKey")
            show_details = self.get_metadata_details(parent_rating_key)
            metadata = {
                "type": metadata_type,
                "rating_key": helpers.get_xml_attr(metadata_main, "ratingKey"),
                "grandparent_title": helpers.get_xml_attr(metadata_main, "grandparentTitle"),
                "parent_index": helpers.get_xml_attr(metadata_main, "parentIndex"),
                "parent_title": helpers.get_xml_attr(metadata_main, "parentTitle"),
                "index": helpers.get_xml_attr(metadata_main, "index"),
                "studio": helpers.get_xml_attr(metadata_main, "studio"),
                "title": helpers.get_xml_attr(metadata_main, "title"),
                "content_rating": helpers.get_xml_attr(metadata_main, "contentRating"),
                "summary": show_details["metadata"]["summary"],
                "rating": helpers.get_xml_attr(metadata_main, "rating"),
                "duration": show_details["metadata"]["duration"],
                "year": helpers.get_xml_attr(metadata_main, "year"),
                "thumb": helpers.get_xml_attr(metadata_main, "thumb"),
                "parent_thumb": helpers.get_xml_attr(metadata_main, "parentThumb"),
                "grandparent_thumb": helpers.get_xml_attr(metadata_main, "grandparentThumb"),
                "art": helpers.get_xml_attr(metadata_main, "art"),
                "originally_available_at": helpers.get_xml_attr(metadata_main, "originallyAvailableAt"),
                "added_at": helpers.get_xml_attr(metadata_main, "addedAt"),
                "updated_at": helpers.get_xml_attr(metadata_main, "updatedAt"),
                "last_viewed_at": helpers.get_xml_attr(metadata_main, "lastViewedAt"),
                "guid": helpers.get_xml_attr(metadata_main, "guid"),
                "genres": genres,
                "actors": actors,
                "writers": writers,
                "directors": directors,
            }
            metadata_list = {"metadata": metadata}
        elif metadata_type == "track":
            metadata = {
                "type": metadata_type,
                "rating_key": helpers.get_xml_attr(metadata_main, "ratingKey"),
                "grandparent_title": helpers.get_xml_attr(metadata_main, "grandparentTitle"),
                "parent_index": helpers.get_xml_attr(metadata_main, "parentIndex"),
                "parent_title": helpers.get_xml_attr(metadata_main, "parentTitle"),
                "index": helpers.get_xml_attr(metadata_main, "index"),
                "studio": helpers.get_xml_attr(metadata_main, "studio"),
                "title": helpers.get_xml_attr(metadata_main, "title"),
                "content_rating": helpers.get_xml_attr(metadata_main, "contentRating"),
                "summary": helpers.get_xml_attr(metadata_main, "summary"),
                "rating": helpers.get_xml_attr(metadata_main, "rating"),
                "duration": helpers.get_xml_attr(metadata_main, "duration"),
                "year": helpers.get_xml_attr(metadata_main, "year"),
                "thumb": helpers.get_xml_attr(metadata_main, "thumb"),
                "parent_thumb": helpers.get_xml_attr(metadata_main, "parentThumb"),
                "grandparent_thumb": helpers.get_xml_attr(metadata_main, "grandparentThumb"),
                "art": helpers.get_xml_attr(metadata_main, "art"),
                "originally_available_at": helpers.get_xml_attr(metadata_main, "originallyAvailableAt"),
                "added_at": helpers.get_xml_attr(metadata_main, "addedAt"),
                "updated_at": helpers.get_xml_attr(metadata_main, "updatedAt"),
                "last_viewed_at": helpers.get_xml_attr(metadata_main, "lastViewedAt"),
                "guid": helpers.get_xml_attr(metadata_main, "guid"),
                "genres": genres,
                "actors": actors,
                "writers": writers,
                "directors": directors,
            }
            metadata_list = {"metadata": metadata}
        else:
            return None

        return metadata_list
Example #41
0
    def get_full_users_list(self):
        friends_list = self.get_plextv_friends()
        own_account = self.get_plextv_user_details()
        users_list = []

        try:
            xml_parse = minidom.parseString(own_account)
        except Exception as e:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list own account: %s" % e)
            return []
        except:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list own account.")
            return []

        xml_head = xml_parse.getElementsByTagName('user')
        if not xml_head:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list.")
        else:
            for a in xml_head:
                own_details = {"user_id": helpers.get_xml_attr(a, 'id'),
                               "username": helpers.get_xml_attr(a, 'username'),
                               "thumb": helpers.get_xml_attr(a, 'thumb'),
                               "email": helpers.get_xml_attr(a, 'email'),
                               "is_home_user": helpers.get_xml_attr(a, 'home'),
                               "is_allow_sync": None,
                               "is_restricted": helpers.get_xml_attr(a, 'restricted')
                               }

                users_list.append(own_details)

        try:
            xml_parse = minidom.parseString(friends_list)
        except Exception as e:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list friends list: %s" % e)
            return []
        except:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list friends list.")
            return []

        xml_head = xml_parse.getElementsByTagName('User')
        if not xml_head:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_full_users_list.")
        else:
            for a in xml_head:
                friend = {"user_id": helpers.get_xml_attr(a, 'id'),
                          "username": helpers.get_xml_attr(a, 'title'),
                          "thumb": helpers.get_xml_attr(a, 'thumb'),
                          "email": helpers.get_xml_attr(a, 'email'),
                          "is_home_user": helpers.get_xml_attr(a, 'home'),
                          "is_allow_sync": helpers.get_xml_attr(a, 'allowSync'),
                          "is_restricted": helpers.get_xml_attr(a, 'restricted')
                          }

                users_list.append(friend)

        return users_list
Example #42
0
    def get_recently_added_details(self, count='0'):
        recent = self.get_recently_added(count, output_format='xml')
        recents_list = []

        xml_head = recent.getElementsByTagName('MediaContainer')
        if not xml_head:
            logger.warn("Error parsing XML for Plex recently added.")
            return None

        for a in xml_head:
            if a.getAttribute('size'):
                if a.getAttribute('size') == '0':
                    output = {'recently_added': None}
                    return output

            if a.getElementsByTagName('Directory'):
                recents_main = a.getElementsByTagName('Directory')
                for item in recents_main:
                    recent_type = helpers.get_xml_attr(item, 'type')

                    if recent_type == 'season':
                        recent_items = {'type': recent_type,
                                        'ratingKey': helpers.get_xml_attr(item, 'ratingKey'),
                                        'title': helpers.get_xml_attr(item, 'title'),
                                        'thumb': helpers.get_xml_attr(item, 'thumb'),
                                        'addedAt': helpers.get_xml_attr(item, 'addedAt')
                                        }
                        recents_list.append(recent_items)
                    else:
                        recent_items = {}
                        recents_list.append(recent_items)
            if a.getElementsByTagName('Video'):
                recents_main = a.getElementsByTagName('Video')
                for item in recents_main:
                    recent_type = helpers.get_xml_attr(item, 'type')

                    if recent_type == 'movie':
                        recent_items = {'type': recent_type,
                                        'ratingKey': helpers.get_xml_attr(item, 'ratingKey'),
                                        'title': helpers.get_xml_attr(item, 'title'),
                                        'year': helpers.get_xml_attr(item, 'year'),
                                        'thumb': helpers.get_xml_attr(item, 'thumb'),
                                        'addedAt': helpers.get_xml_attr(item, 'addedAt')
                                        }
                        recents_list.append(recent_items)
                    else:
                        recent_items = {}
                        recents_list.append(recent_items)

        output = {'recently_added': sorted(recents_list, key=lambda k: k['addedAt'], reverse=True)}
        return output
Example #43
0
    def get_server_urls(self, include_https=True):

        if plexpy.CONFIG.PMS_IDENTIFIER:
            server_id = plexpy.CONFIG.PMS_IDENTIFIER
        else:
            logger.error(u"PlexPy PlexTV :: Unable to retrieve server identity.")
            return []

        plextv_resources = self.get_plextv_resources(include_https=include_https)
        server_urls = []

        try:
            xml_parse = minidom.parseString(plextv_resources)
        except Exception as e:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_server_urls: %s" % e)
            return []
        except:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_server_urls.")
            return []

        try:
            xml_head = xml_parse.getElementsByTagName('Device')
        except Exception as e:
            logger.warn(u"PlexPy PlexTV :: Unable to parse XML for get_server_urls: %s." % e)
            return []

        for a in xml_head:
            if helpers.get_xml_attr(a, 'clientIdentifier') == server_id:
                connections = a.getElementsByTagName('Connection')
                for connection in connections:
                    server_details = {"protocol": helpers.get_xml_attr(connection, 'protocol'),
                                      "address": helpers.get_xml_attr(connection, 'address'),
                                      "port": helpers.get_xml_attr(connection, 'port'),
                                      "uri": helpers.get_xml_attr(connection, 'uri'),
                                      "local": helpers.get_xml_attr(connection, 'local')
                                      }

                    server_urls.append(server_details)
            # Else try to match the PMS_IP and PMS_PORT
            else:
                connections = a.getElementsByTagName('Connection')
                for connection in connections:
                    if helpers.get_xml_attr(connection, 'address') == plexpy.CONFIG.PMS_IP and \
                        int(helpers.get_xml_attr(connection, 'port')) == plexpy.CONFIG.PMS_PORT:

                        plexpy.CONFIG.PMS_IDENTIFIER = helpers.get_xml_attr(a, 'clientIdentifier')

                        logger.info(u"PlexPy PlexTV :: PMS identifier changed from %s to %s." % \
                                    (server_id, plexpy.CONFIG.PMS_IDENTIFIER))

                        server_details = {"protocol": helpers.get_xml_attr(connection, 'protocol'),
                                          "address": helpers.get_xml_attr(connection, 'address'),
                                          "port": helpers.get_xml_attr(connection, 'port'),
                                          "uri": helpers.get_xml_attr(connection, 'uri'),
                                          "local": helpers.get_xml_attr(connection, 'local')
                                          }
                        break

        return server_urls
Example #44
0
def extract_plexwatch_xml(xml=None):
    output = {}
    clean_xml = helpers.latinToAscii(xml)
    try:
        xml_parse = minidom.parseString(clean_xml)
    except:
        logger.warn("Error parsing XML for Plexwatch database.")
        return None

    xml_head = xml_parse.getElementsByTagName("opt")
    if not xml_head:
        logger.warn("Error parsing XML for Plexwatch database.")
        return None

    for a in xml_head:
        added_at = helpers.get_xml_attr(a, "addedAt")
        art = helpers.get_xml_attr(a, "art")
        duration = helpers.get_xml_attr(a, "duration")
        grandparent_thumb = helpers.get_xml_attr(a, "grandparentThumb")
        grandparent_title = helpers.get_xml_attr(a, "grandparentTitle")
        guid = helpers.get_xml_attr(a, "guid")
        media_index = helpers.get_xml_attr(a, "index")
        originally_available_at = helpers.get_xml_attr(a, "originallyAvailableAt")
        last_viewed_at = helpers.get_xml_attr(a, "lastViewedAt")
        parent_media_index = helpers.get_xml_attr(a, "parentIndex")
        parent_thumb = helpers.get_xml_attr(a, "parentThumb")
        rating = helpers.get_xml_attr(a, "rating")
        thumb = helpers.get_xml_attr(a, "thumb")
        media_type = helpers.get_xml_attr(a, "type")
        updated_at = helpers.get_xml_attr(a, "updatedAt")
        view_offset = helpers.get_xml_attr(a, "viewOffset")
        year = helpers.get_xml_attr(a, "year")
        parent_title = helpers.get_xml_attr(a, "parentTitle")
        studio = helpers.get_xml_attr(a, "studio")
        title = helpers.get_xml_attr(a, "title")
        tagline = helpers.get_xml_attr(a, "tagline")

        directors = []
        if a.getElementsByTagName("Director"):
            director_elem = a.getElementsByTagName("Director")
            for b in director_elem:
                directors.append(helpers.get_xml_attr(b, "tag"))

        aspect_ratio = ""
        audio_channels = None
        audio_codec = ""
        bitrate = None
        container = ""
        height = None
        video_codec = ""
        video_framerate = ""
        video_resolution = ""
        width = None

        if a.getElementsByTagName("Media"):
            media_elem = a.getElementsByTagName("Media")
            for c in media_elem:
                aspect_ratio = helpers.get_xml_attr(c, "aspectRatio")
                audio_channels = helpers.get_xml_attr(c, "audioChannels")
                audio_codec = helpers.get_xml_attr(c, "audioCodec")
                bitrate = helpers.get_xml_attr(c, "bitrate")
                container = helpers.get_xml_attr(c, "container")
                height = helpers.get_xml_attr(c, "height")
                video_codec = helpers.get_xml_attr(c, "videoCodec")
                video_framerate = helpers.get_xml_attr(c, "videoFrameRate")
                video_resolution = helpers.get_xml_attr(c, "videoResolution")
                width = helpers.get_xml_attr(c, "width")

        machine_id = ""
        platform = ""
        player = ""

        if a.getElementsByTagName("Player"):
            player_elem = a.getElementsByTagName("Player")
            for d in player_elem:
                machine_id = helpers.get_xml_attr(d, "machineIdentifier")
                platform = helpers.get_xml_attr(d, "platform")
                player = helpers.get_xml_attr(d, "title")

        transcode_audio_channels = None
        transcode_audio_codec = ""
        audio_decision = "direct play"
        transcode_container = ""
        transcode_height = None
        transcode_protocol = ""
        transcode_video_codec = ""
        video_decision = "direct play"
        transcode_width = None

        if a.getElementsByTagName("TranscodeSession"):
            transcode_elem = a.getElementsByTagName("TranscodeSession")
            for e in transcode_elem:
                transcode_audio_channels = helpers.get_xml_attr(e, "audioChannels")
                transcode_audio_codec = helpers.get_xml_attr(e, "audioCodec")
                audio_decision = helpers.get_xml_attr(e, "audioDecision")
                transcode_container = helpers.get_xml_attr(e, "container")
                transcode_height = helpers.get_xml_attr(e, "height")
                transcode_protocol = helpers.get_xml_attr(e, "protocol")
                transcode_video_codec = helpers.get_xml_attr(e, "videoCodec")
                video_decision = helpers.get_xml_attr(e, "videoDecision")
                transcode_width = helpers.get_xml_attr(e, "width")

        user_id = None

        if a.getElementsByTagName("User"):
            user_elem = a.getElementsByTagName("User")
            for f in user_elem:
                user_id = helpers.get_xml_attr(f, "id")

        writers = []
        if a.getElementsByTagName("Writer"):
            writer_elem = a.getElementsByTagName("Writer")
            for g in writer_elem:
                writers.append(helpers.get_xml_attr(g, "tag"))

        actors = []
        if a.getElementsByTagName("Role"):
            actor_elem = a.getElementsByTagName("Role")
            for h in actor_elem:
                actors.append(helpers.get_xml_attr(h, "tag"))

        genres = []
        if a.getElementsByTagName("Genre"):
            genre_elem = a.getElementsByTagName("Genre")
            for i in genre_elem:
                genres.append(helpers.get_xml_attr(i, "tag"))

        output = {
            "added_at": added_at,
            "art": art,
            "duration": duration,
            "grandparent_thumb": grandparent_thumb,
            "grandparent_title": grandparent_title,
            "parent_title": parent_title,
            "title": title,
            "tagline": tagline,
            "guid": guid,
            "media_index": media_index,
            "originally_available_at": originally_available_at,
            "last_viewed_at": last_viewed_at,
            "parent_media_index": parent_media_index,
            "parent_thumb": parent_thumb,
            "rating": rating,
            "thumb": thumb,
            "media_type": media_type,
            "updated_at": updated_at,
            "view_offset": view_offset,
            "year": year,
            "directors": directors,
            "aspect_ratio": aspect_ratio,
            "audio_channels": audio_channels,
            "audio_codec": audio_codec,
            "bitrate": bitrate,
            "container": container,
            "height": height,
            "video_codec": video_codec,
            "video_framerate": video_framerate,
            "video_resolution": video_resolution,
            "width": width,
            "machine_id": machine_id,
            "platform": platform,
            "player": player,
            "transcode_audio_channels": transcode_audio_channels,
            "transcode_audio_codec": transcode_audio_codec,
            "audio_decision": audio_decision,
            "transcode_container": transcode_container,
            "transcode_height": transcode_height,
            "transcode_protocol": transcode_protocol,
            "transcode_video_codec": transcode_video_codec,
            "video_decision": video_decision,
            "transcode_width": transcode_width,
            "user_id": user_id,
            "writers": writers,
            "actors": actors,
            "genres": genres,
            "studio": studio,
        }

    return output
Example #45
0
    def get_recently_added_details(self, count='0'):
        recent = self.get_recently_added(count, output_format='xml')

        try:
            xml_head = recent.getElementsByTagName('MediaContainer')
        except:
            logger.warn("Unable to parse XML for get_recently_added.")
            return []

        recents_list = []

        for a in xml_head:
            if a.getAttribute('size'):
                if a.getAttribute('size') == '0':
                    output = {'recently_added': []}
                    return output

            if a.getElementsByTagName('Directory'):
                recents_main = a.getElementsByTagName('Directory')
                for item in recents_main:
                    recent_type = helpers.get_xml_attr(item, 'type')
                    recent_items = {'type': recent_type,
                                    'rating_key': helpers.get_xml_attr(item, 'ratingKey'),
                                    'title': helpers.get_xml_attr(item, 'title'),
                                    'thumb': helpers.get_xml_attr(item, 'thumb'),
                                    'added_at': helpers.get_xml_attr(item, 'addedAt')
                                    }
                    recents_list.append(recent_items)

            if a.getElementsByTagName('Video'):
                recents_main = a.getElementsByTagName('Video')
                for item in recents_main:
                    recent_type = helpers.get_xml_attr(item, 'type')

                    if recent_type == 'movie':
                        recent_items = {'type': recent_type,
                                        'rating_key': helpers.get_xml_attr(item, 'ratingKey'),
                                        'title': helpers.get_xml_attr(item, 'title'),
                                        'year': helpers.get_xml_attr(item, 'year'),
                                        'thumb': helpers.get_xml_attr(item, 'thumb'),
                                        'added_at': helpers.get_xml_attr(item, 'addedAt')
                                        }
                        recents_list.append(recent_items)
                    else:
                        pass

        output = {'recently_added': sorted(recents_list, key=lambda k: k['added_at'], reverse=True)}
        return output
Example #46
0
    def get_metadata_details(self, rating_key=''):
        metadata = self.get_metadata(rating_key, output_format='xml')

        try:
            xml_head = metadata.getElementsByTagName('MediaContainer')
        except:
            logger.warn("Unable to parse XML for get_metadata.")
            return []

        metadata_list = []

        for a in xml_head:
            if a.getAttribute('size'):
                if a.getAttribute('size') != '1':
                    metadata_list = {'metadata': None}
                    return metadata_list

            if a.getElementsByTagName('Directory'):
                metadata_main = a.getElementsByTagName('Directory')[0]
                metadata_type = helpers.get_xml_attr(metadata_main, 'type')
            elif a.getElementsByTagName('Video'):
                metadata_main = a.getElementsByTagName('Video')[0]
                metadata_type = helpers.get_xml_attr(metadata_main, 'type')
            elif a.getElementsByTagName('Track'):
                metadata_main = a.getElementsByTagName('Track')[0]
                metadata_type = helpers.get_xml_attr(metadata_main, 'type')
            else:
                logger.debug(u"Metadata failed")

        genres = []
        actors = []
        writers = []
        directors = []

        if metadata_main.getElementsByTagName('Genre'):
            for genre in metadata_main.getElementsByTagName('Genre'):
                genres.append(helpers.get_xml_attr(genre, 'tag'))

        if metadata_main.getElementsByTagName('Role'):
            for actor in metadata_main.getElementsByTagName('Role'):
                actors.append(helpers.get_xml_attr(actor, 'tag'))

        if metadata_main.getElementsByTagName('Writer'):
            for writer in metadata_main.getElementsByTagName('Writer'):
                writers.append(helpers.get_xml_attr(writer, 'tag'))

        if metadata_main.getElementsByTagName('Director'):
            for director in metadata_main.getElementsByTagName('Director'):
                directors.append(helpers.get_xml_attr(director, 'tag'))

        if metadata_type == 'show':
            metadata = {'type': metadata_type,
                        'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
                        'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
                        'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
                        'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
                        'index': helpers.get_xml_attr(metadata_main, 'index'),
                        'studio': helpers.get_xml_attr(metadata_main, 'studio'),
                        'title': helpers.get_xml_attr(metadata_main, 'title'),
                        'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
                        'summary': helpers.get_xml_attr(metadata_main, 'summary'),
                        'rating': helpers.get_xml_attr(metadata_main, 'rating'),
                        'duration': helpers.get_xml_attr(metadata_main, 'duration'),
                        'year': helpers.get_xml_attr(metadata_main, 'year'),
                        'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
                        'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
                        'grandparent_thumb': helpers.get_xml_attr(metadata_main, 'grandparentThumb'),
                        'art': helpers.get_xml_attr(metadata_main, 'art'),
                        'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
                        'added_at': helpers.get_xml_attr(metadata_main, 'addedAt'),
                        'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
                        'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
                        'guid': helpers.get_xml_attr(metadata_main, 'guid'),
                        'writers': writers,
                        'directors': directors,
                        'genres': genres,
                        'actors': actors
                        }
            metadata_list = {'metadata': metadata}
        elif metadata_type == 'episode':
            metadata = {'type': metadata_type,
                        'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
                        'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
                        'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
                        'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
                        'index': helpers.get_xml_attr(metadata_main, 'index'),
                        'studio': helpers.get_xml_attr(metadata_main, 'studio'),
                        'title': helpers.get_xml_attr(metadata_main, 'title'),
                        'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
                        'summary': helpers.get_xml_attr(metadata_main, 'summary'),
                        'rating': helpers.get_xml_attr(metadata_main, 'rating'),
                        'duration': helpers.get_xml_attr(metadata_main, 'duration'),
                        'year': helpers.get_xml_attr(metadata_main, 'year'),
                        'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
                        'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
                        'grandparent_thumb': helpers.get_xml_attr(metadata_main, 'grandparentThumb'),
                        'art': helpers.get_xml_attr(metadata_main, 'art'),
                        'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
                        'added_at': helpers.get_xml_attr(metadata_main, 'addedAt'),
                        'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
                        'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
                        'guid': helpers.get_xml_attr(metadata_main, 'guid'),
                        'writers': writers,
                        'directors': directors,
                        'genres': genres,
                        'actors': actors
                        }
            metadata_list = {'metadata': metadata}
        elif metadata_type == 'movie':
            metadata = {'type': metadata_type,
                        'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
                        'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
                        'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
                        'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
                        'index': helpers.get_xml_attr(metadata_main, 'index'),
                        'studio': helpers.get_xml_attr(metadata_main, 'studio'),
                        'title': helpers.get_xml_attr(metadata_main, 'title'),
                        'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
                        'summary': helpers.get_xml_attr(metadata_main, 'summary'),
                        'rating': helpers.get_xml_attr(metadata_main, 'rating'),
                        'duration': helpers.get_xml_attr(metadata_main, 'duration'),
                        'year': helpers.get_xml_attr(metadata_main, 'year'),
                        'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
                        'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
                        'grandparent_thumb': helpers.get_xml_attr(metadata_main, 'grandparentThumb'),
                        'art': helpers.get_xml_attr(metadata_main, 'art'),
                        'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
                        'added_at': helpers.get_xml_attr(metadata_main, 'addedAt'),
                        'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
                        'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
                        'guid': helpers.get_xml_attr(metadata_main, 'guid'),
                        'genres': genres,
                        'actors': actors,
                        'writers': writers,
                        'directors': directors
                        }
            metadata_list = {'metadata': metadata}
        elif metadata_type == 'season':
            parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey')
            show_details = self.get_metadata_details(parent_rating_key)
            metadata = {'type': metadata_type,
                        'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
                        'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
                        'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
                        'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
                        'index': helpers.get_xml_attr(metadata_main, 'index'),
                        'studio': helpers.get_xml_attr(metadata_main, 'studio'),
                        'title': helpers.get_xml_attr(metadata_main, 'title'),
                        'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
                        'summary': show_details['metadata']['summary'],
                        'rating': helpers.get_xml_attr(metadata_main, 'rating'),
                        'duration': show_details['metadata']['duration'],
                        'year': helpers.get_xml_attr(metadata_main, 'year'),
                        'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
                        'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
                        'grandparent_thumb': helpers.get_xml_attr(metadata_main, 'grandparentThumb'),
                        'art': helpers.get_xml_attr(metadata_main, 'art'),
                        'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
                        'added_at': helpers.get_xml_attr(metadata_main, 'addedAt'),
                        'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
                        'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
                        'guid': helpers.get_xml_attr(metadata_main, 'guid'),
                        'genres': genres,
                        'actors': actors,
                        'writers': writers,
                        'directors': directors
                        }
            metadata_list = {'metadata': metadata}
        elif metadata_type == 'track':
            metadata = {'type': metadata_type,
                        'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
                        'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
                        'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
                        'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
                        'index': helpers.get_xml_attr(metadata_main, 'index'),
                        'studio': helpers.get_xml_attr(metadata_main, 'studio'),
                        'title': helpers.get_xml_attr(metadata_main, 'title'),
                        'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
                        'summary': helpers.get_xml_attr(metadata_main, 'summary'),
                        'rating': helpers.get_xml_attr(metadata_main, 'rating'),
                        'duration': helpers.get_xml_attr(metadata_main, 'duration'),
                        'year': helpers.get_xml_attr(metadata_main, 'year'),
                        'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
                        'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
                        'grandparent_thumb': helpers.get_xml_attr(metadata_main, 'grandparentThumb'),
                        'art': helpers.get_xml_attr(metadata_main, 'art'),
                        'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
                        'added_at': helpers.get_xml_attr(metadata_main, 'addedAt'),
                        'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
                        'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
                        'guid': helpers.get_xml_attr(metadata_main, 'guid'),
                        'genres': genres,
                        'actors': actors,
                        'writers': writers,
                        'directors': directors
                        }
            metadata_list = {'metadata': metadata}
        else:
            return None

        return metadata_list
Example #47
0
        try:
            xml_parse = minidom.parseString(own_account)
        except Exception, e:
            logger.warn("Error parsing XML for Plex account details: %s" % e)
            return []
        except:
            logger.warn("Error parsing XML for Plex account details.")
            return []

        xml_head = xml_parse.getElementsByTagName('user')
        if not xml_head:
            logger.warn("Error parsing XML for Plex account details.")
        else:
            for a in xml_head:
                own_details = {"user_id": helpers.get_xml_attr(a, 'id'),
                               "username": helpers.get_xml_attr(a, 'username'),
                               "thumb": helpers.get_xml_attr(a, 'thumb'),
                               "email": helpers.get_xml_attr(a, 'email'),
                               "is_home_user": helpers.get_xml_attr(a, 'home'),
                               "is_allow_sync": None,
                               "is_restricted": helpers.get_xml_attr(a, 'restricted')
                               }

                users_list.append(own_details)

        try:
            xml_parse = minidom.parseString(friends_list)
        except Exception, e:
            logger.warn("Error parsing XML for Plex friends list: %s" % e)
        except:
Example #48
0
    def get_session_each(self, stream_type='', session=None):
        session_output = None
        plex_watch = plexwatch.PlexWatch()
        if stream_type == 'track':
            if session.getElementsByTagName('TranscodeSession'):
                transcode_session = session.getElementsByTagName('TranscodeSession')[0]
                audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision')
                audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels')
                audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec')
                duration = helpers.get_xml_attr(transcode_session, 'duration')
                progress = helpers.get_xml_attr(session, 'viewOffset')
            else:
                media_info = session.getElementsByTagName('Media')[0]
                audio_decision = 'direct play'
                audio_channels = helpers.get_xml_attr(media_info, 'audioChannels')
                audio_codec = helpers.get_xml_attr(media_info, 'audioCodec')
                duration = helpers.get_xml_attr(media_info, 'duration')
                progress = helpers.get_xml_attr(session, 'viewOffset')

            session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
                              'art': helpers.get_xml_attr(session, 'art'),
                              'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
                              'thumb': helpers.get_xml_attr(session, 'thumb'),
                              'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
                              'friendly_name': plex_watch.get_user_friendly_name(
                                  helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
                              'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
                              'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
                              'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
                              'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
                              'title': helpers.get_xml_attr(session, 'title'),
                              'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
                              'audio_decision': audio_decision,
                              'audio_channels': audio_channels,
                              'audio_codec': audio_codec,
                              'video_decision': '',
                              'video_codec': '',
                              'height': '',
                              'width': '',
                              'duration': duration,
                              'progress': progress,
                              'progress_percent': str(helpers.get_percent(progress, duration)),
                              'type': 'track',
                              'indexes': 0
                              }
        elif stream_type == 'video':
            if session.getElementsByTagName('TranscodeSession'):
                transcode_session = session.getElementsByTagName('TranscodeSession')[0]
                audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision')
                audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels')
                audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec')
                video_decision = helpers.get_xml_attr(transcode_session, 'videoDecision')
                video_codec = helpers.get_xml_attr(transcode_session, 'videoCodec')
                width = helpers.get_xml_attr(transcode_session, 'width')
                height = helpers.get_xml_attr(transcode_session, 'height')
                duration = helpers.get_xml_attr(session, 'duration')
                progress = helpers.get_xml_attr(session, 'viewOffset')
            else:
                media_info = session.getElementsByTagName('Media')[0]
                audio_decision = 'direct play'
                audio_channels = helpers.get_xml_attr(media_info, 'audioChannels')
                audio_codec = helpers.get_xml_attr(media_info, 'audioCodec')
                video_decision = 'direct play'
                video_codec = helpers.get_xml_attr(media_info, 'videoCodec')
                width = helpers.get_xml_attr(media_info, 'width')
                height = helpers.get_xml_attr(media_info, 'height')
                duration = helpers.get_xml_attr(media_info, 'duration')
                progress = helpers.get_xml_attr(session, 'viewOffset')

            media_info = session.getElementsByTagName('Media')[0]
            if media_info.getElementsByTagName('Part'):
                indexes = helpers.get_xml_attr(media_info.getElementsByTagName('Part')[0], 'indexes')
                part_id = helpers.get_xml_attr(media_info.getElementsByTagName('Part')[0], 'id')
                if indexes == 'sd':
                    bif_thumb = '/library/parts/' + part_id + '/indexes/sd/' + progress
                else:
                    bif_thumb = ''
            else:
                indexes = ''
                bif_thumb = ''

            if plexpy.CONFIG.PMS_USE_BIF and indexes == 'sd':
                thumb = bif_thumb
                use_indexes = 1
            else:
                thumb = helpers.get_xml_attr(session, 'thumb')
                use_indexes = 0

            if helpers.get_xml_attr(session, 'type') == 'episode':
                session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
                                  'art': helpers.get_xml_attr(session, 'art'),
                                  'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
                                  'thumb': thumb,
                                  'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
                                  'friendly_name': plex_watch.get_user_friendly_name(
                                      helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
                                  'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
                                  'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
                                  'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
                                  'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
                                  'title': helpers.get_xml_attr(session, 'title'),
                                  'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
                                  'audio_decision': audio_decision,
                                  'audio_channels': audio_channels,
                                  'audio_codec': audio_codec,
                                  'video_decision': video_decision,
                                  'video_codec': video_codec,
                                  'height': height,
                                  'width': width,
                                  'duration': duration,
                                  'progress': progress,
                                  'progress_percent': str(helpers.get_percent(progress, duration)),
                                  'type': helpers.get_xml_attr(session, 'type'),
                                  'indexes': use_indexes
                                  }
            elif helpers.get_xml_attr(session, 'type') == 'movie':
                session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
                                  'art': helpers.get_xml_attr(session, 'art'),
                                  'thumb': thumb,
                                  'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
                                  'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
                                  'friendly_name': plex_watch.get_user_friendly_name(
                                      helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
                                  'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
                                  'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
                                  'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
                                  'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
                                  'title': helpers.get_xml_attr(session, 'title'),
                                  'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
                                  'audio_decision': audio_decision,
                                  'audio_channels': audio_channels,
                                  'audio_codec': audio_codec,
                                  'video_decision': video_decision,
                                  'video_codec': video_codec,
                                  'height': height,
                                  'width': width,
                                  'duration': duration,
                                  'progress': progress,
                                  'progress_percent': str(helpers.get_percent(progress, duration)),
                                  'type': helpers.get_xml_attr(session, 'type'),
                                  'indexes': use_indexes
                                  }
            elif helpers.get_xml_attr(session, 'type') == 'clip':
                session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
                                  'art': helpers.get_xml_attr(session, 'art'),
                                  'thumb': thumb,
                                  'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
                                  'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
                                  'friendly_name': plex_watch.get_user_friendly_name(
                                      helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
                                  'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
                                  'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
                                  'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
                                  'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
                                  'title': helpers.get_xml_attr(session, 'title'),
                                  'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
                                  'audio_decision': audio_decision,
                                  'audio_channels': audio_channels,
                                  'audio_codec': audio_codec,
                                  'video_decision': video_decision,
                                  'video_codec': video_codec,
                                  'height': height,
                                  'width': width,
                                  'duration': duration,
                                  'progress': progress,
                                  'progress_percent': str(helpers.get_percent(progress, duration)),
                                  'type': helpers.get_xml_attr(session, 'type'),
                                  'indexes': 0
                                  }
        else:
            logger.warn(u"No known stream types found in session list.")

        return session_output
Example #49
0
def extract_plexwatch_xml(xml=None):
    output = {}
    clean_xml = helpers.latinToAscii(xml)
    try:
        xml_parse = minidom.parseString(clean_xml)
    except:
        logger.warn(
            u"PlexPy Importer :: Error parsing XML for Plexwatch database.")
        return None

    xml_head = xml_parse.getElementsByTagName('opt')
    if not xml_head:
        logger.warn(
            u"PlexPy Importer :: Error parsing XML for Plexwatch database.")
        return None

    for a in xml_head:
        added_at = helpers.get_xml_attr(a, 'addedAt')
        art = helpers.get_xml_attr(a, 'art')
        duration = helpers.get_xml_attr(a, 'duration')
        grandparent_thumb = helpers.get_xml_attr(a, 'grandparentThumb')
        grandparent_title = helpers.get_xml_attr(a, 'grandparentTitle')
        guid = helpers.get_xml_attr(a, 'guid')
        section_id = helpers.get_xml_attr(a, 'librarySectionID')
        media_index = helpers.get_xml_attr(a, 'index')
        originally_available_at = helpers.get_xml_attr(
            a, 'originallyAvailableAt')
        last_viewed_at = helpers.get_xml_attr(a, 'lastViewedAt')
        parent_media_index = helpers.get_xml_attr(a, 'parentIndex')
        parent_thumb = helpers.get_xml_attr(a, 'parentThumb')
        rating = helpers.get_xml_attr(a, 'rating')
        thumb = helpers.get_xml_attr(a, 'thumb')
        media_type = helpers.get_xml_attr(a, 'type')
        updated_at = helpers.get_xml_attr(a, 'updatedAt')
        view_offset = helpers.get_xml_attr(a, 'viewOffset')
        year = helpers.get_xml_attr(a, 'year')
        parent_title = helpers.get_xml_attr(a, 'parentTitle')
        studio = helpers.get_xml_attr(a, 'studio')
        title = helpers.get_xml_attr(a, 'title')
        tagline = helpers.get_xml_attr(a, 'tagline')

        directors = []
        if a.getElementsByTagName('Director'):
            director_elem = a.getElementsByTagName('Director')
            for b in director_elem:
                directors.append(helpers.get_xml_attr(b, 'tag'))

        aspect_ratio = ''
        audio_channels = None
        audio_codec = ''
        bitrate = None
        container = ''
        height = None
        video_codec = ''
        video_framerate = ''
        video_resolution = ''
        width = None

        if a.getElementsByTagName('Media'):
            media_elem = a.getElementsByTagName('Media')
            for c in media_elem:
                aspect_ratio = helpers.get_xml_attr(c, 'aspectRatio')
                audio_channels = helpers.get_xml_attr(c, 'audioChannels')
                audio_codec = helpers.get_xml_attr(c, 'audioCodec')
                bitrate = helpers.get_xml_attr(c, 'bitrate')
                container = helpers.get_xml_attr(c, 'container')
                height = helpers.get_xml_attr(c, 'height')
                video_codec = helpers.get_xml_attr(c, 'videoCodec')
                video_framerate = helpers.get_xml_attr(c, 'videoFrameRate')
                video_resolution = helpers.get_xml_attr(c, 'videoResolution')
                width = helpers.get_xml_attr(c, 'width')

        machine_id = ''
        platform = ''
        player = ''

        if a.getElementsByTagName('Player'):
            player_elem = a.getElementsByTagName('Player')
            for d in player_elem:
                machine_id = helpers.get_xml_attr(d, 'machineIdentifier')
                platform = helpers.get_xml_attr(d, 'platform')
                player = helpers.get_xml_attr(d, 'title')

        transcode_audio_channels = None
        transcode_audio_codec = ''
        audio_decision = 'direct play'
        transcode_container = ''
        transcode_height = None
        transcode_protocol = ''
        transcode_video_codec = ''
        video_decision = 'direct play'
        transcode_width = None

        if a.getElementsByTagName('TranscodeSession'):
            transcode_elem = a.getElementsByTagName('TranscodeSession')
            for e in transcode_elem:
                transcode_audio_channels = helpers.get_xml_attr(
                    e, 'audioChannels')
                transcode_audio_codec = helpers.get_xml_attr(e, 'audioCodec')
                audio_decision = helpers.get_xml_attr(e, 'audioDecision')
                transcode_container = helpers.get_xml_attr(e, 'container')
                transcode_height = helpers.get_xml_attr(e, 'height')
                transcode_protocol = helpers.get_xml_attr(e, 'protocol')
                transcode_video_codec = helpers.get_xml_attr(e, 'videoCodec')
                video_decision = helpers.get_xml_attr(e, 'videoDecision')
                transcode_width = helpers.get_xml_attr(e, 'width')

        user_id = None

        if a.getElementsByTagName('User'):
            user_elem = a.getElementsByTagName('User')
            for f in user_elem:
                user_id = helpers.get_xml_attr(f, 'id')

        writers = []
        if a.getElementsByTagName('Writer'):
            writer_elem = a.getElementsByTagName('Writer')
            for g in writer_elem:
                writers.append(helpers.get_xml_attr(g, 'tag'))

        actors = []
        if a.getElementsByTagName('Role'):
            actor_elem = a.getElementsByTagName('Role')
            for h in actor_elem:
                actors.append(helpers.get_xml_attr(h, 'tag'))

        genres = []
        if a.getElementsByTagName('Genre'):
            genre_elem = a.getElementsByTagName('Genre')
            for i in genre_elem:
                genres.append(helpers.get_xml_attr(i, 'tag'))

        output = {
            'added_at': added_at,
            'art': art,
            'duration': duration,
            'grandparent_thumb': grandparent_thumb,
            'grandparent_title': grandparent_title,
            'parent_title': parent_title,
            'title': title,
            'tagline': tagline,
            'guid': guid,
            'section_id': section_id,
            'media_index': media_index,
            'originally_available_at': originally_available_at,
            'last_viewed_at': last_viewed_at,
            'parent_media_index': parent_media_index,
            'parent_thumb': parent_thumb,
            'rating': rating,
            'thumb': thumb,
            'media_type': media_type,
            'updated_at': updated_at,
            'view_offset': view_offset,
            'year': year,
            'directors': directors,
            'aspect_ratio': aspect_ratio,
            'audio_channels': audio_channels,
            'audio_codec': audio_codec,
            'bitrate': bitrate,
            'container': container,
            'height': height,
            'video_codec': video_codec,
            'video_framerate': video_framerate,
            'video_resolution': video_resolution,
            'width': width,
            'machine_id': machine_id,
            'platform': platform,
            'player': player,
            'transcode_audio_channels': transcode_audio_channels,
            'transcode_audio_codec': transcode_audio_codec,
            'audio_decision': audio_decision,
            'transcode_container': transcode_container,
            'transcode_height': transcode_height,
            'transcode_protocol': transcode_protocol,
            'transcode_video_codec': transcode_video_codec,
            'video_decision': video_decision,
            'transcode_width': transcode_width,
            'user_id': user_id,
            'writers': writers,
            'actors': actors,
            'genres': genres,
            'studio': studio
        }

    return output
Example #50
0
    def get_recently_added_details(self, count="0"):
        recent = self.get_recently_added(count, output_format="xml")

        try:
            xml_head = recent.getElementsByTagName("MediaContainer")
        except:
            logger.warn("Unable to parse XML for get_recently_added.")
            return []

        recents_list = []

        for a in xml_head:
            if a.getAttribute("size"):
                if a.getAttribute("size") == "0":
                    output = {"recently_added": []}
                    return output

            if a.getElementsByTagName("Directory"):
                recents_main = a.getElementsByTagName("Directory")
                for item in recents_main:
                    recent_type = helpers.get_xml_attr(item, "type")
                    recent_items = {
                        "type": recent_type,
                        "rating_key": helpers.get_xml_attr(item, "ratingKey"),
                        "title": helpers.get_xml_attr(item, "title"),
                        "thumb": helpers.get_xml_attr(item, "thumb"),
                        "added_at": helpers.get_xml_attr(item, "addedAt"),
                    }
                    recents_list.append(recent_items)

            if a.getElementsByTagName("Video"):
                recents_main = a.getElementsByTagName("Video")
                for item in recents_main:
                    recent_type = helpers.get_xml_attr(item, "type")

                    if recent_type == "movie":
                        recent_items = {
                            "type": recent_type,
                            "rating_key": helpers.get_xml_attr(item, "ratingKey"),
                            "title": helpers.get_xml_attr(item, "title"),
                            "year": helpers.get_xml_attr(item, "year"),
                            "thumb": helpers.get_xml_attr(item, "thumb"),
                            "added_at": helpers.get_xml_attr(item, "addedAt"),
                        }
                        recents_list.append(recent_items)
                    else:
                        pass

        output = {"recently_added": sorted(recents_list, key=lambda k: k["added_at"], reverse=True)}
        return output