예제 #1
0
파일: plextv.py 프로젝트: patschi/plexpy
    def __init__(self, username=None, password=None):
        self.protocol = 'HTTPS'
        self.username = username
        self.password = password

        self.request_handler = http_handler.HTTPHandler(host='plex.tv',
                                                        port=443,
                                                        token=plexpy.CONFIG.PMS_TOKEN)
예제 #2
0
    def delete_plextv_sync(self, client_id='', sync_id='', output_format=''):
        request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                   token=self.token,
                                                   timeout=self.timeout,
                                                   ssl_verify=self.ssl_verify,
                                                   headers=self.headers)
        uri = '/devices/%s/sync_items/%s' % (client_id, sync_id)
        request = request_handler.make_request(uri=uri,
                                               request_type='DELETE',
                                               output_format=output_format)

        return request
예제 #3
0
    def cloud_server_status(self, output_format=''):
        request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                   token=self.token,
                                                   timeout=self.timeout,
                                                   ssl_verify=self.ssl_verify,
                                                   headers=self.headers)
        uri = '/api/v2/cloud_server'
        request = request_handler.make_request(uri=uri,
                                               request_type='GET',
                                               output_format=output_format)

        return request
예제 #4
0
    def get_plextv_sync_lists(self, machine_id='', output_format=''):
        request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                   token=self.token,
                                                   timeout=self.timeout,
                                                   ssl_verify=self.ssl_verify,
                                                   headers=self.headers)
        uri = '/servers/%s/sync_lists' % machine_id
        request = request_handler.make_request(uri=uri,
                                               request_type='GET',
                                               output_format=output_format)

        return request
예제 #5
0
    def delete_plextv_device(self, device_id='', output_format=''):
        request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                   token=self.token,
                                                   timeout=self.timeout,
                                                   ssl_verify=self.ssl_verify,
                                                   headers=self.headers)
        uri = '/devices/%s.xml' % device_id
        request = request_handler.make_request(uri=uri,
                                               request_type='DELETE',
                                               output_format=output_format)

        return request
예제 #6
0
    def get_plextv_server_list(self, output_format=''):
        request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                   token=self.token,
                                                   timeout=self.timeout,
                                                   ssl_verify=self.ssl_verify,
                                                   headers=self.headers)
        uri = '/pms/servers.xml'
        request = request_handler.make_request(uri=uri,
                                               request_type='GET',
                                               output_format=output_format)

        return request
예제 #7
0
    def get_plextv_user_details(self, output_format=''):
        request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                   token=self.token,
                                                   timeout=self.timeout,
                                                   ssl_verify=self.ssl_verify,
                                                   headers=self.headers)
        uri = '/users/account'
        request = request_handler.make_request(uri=uri,
                                               request_type='GET',
                                               output_format=output_format)

        return request
예제 #8
0
    def get_plextv_downloads(self, plexpass=False, output_format=''):
        request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                   token=self.token,
                                                   timeout=self.timeout,
                                                   ssl_verify=self.ssl_verify,
                                                   headers=self.headers)
        if plexpass:
            uri = '/api/downloads/5.json?channel=plexpass'
        else:
            uri = '/api/downloads/1.json'
        request = request_handler.make_request(uri=uri,
                                               request_type='GET',
                                               output_format=output_format)

        return request
예제 #9
0
    def get_plextv_resources(self, include_https=False, output_format=''):
        request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                   token=self.token,
                                                   timeout=self.timeout,
                                                   ssl_verify=self.ssl_verify,
                                                   headers=self.headers)
        if include_https:
            uri = '/api/resources?includeHttps=1'
        else:
            uri = '/api/resources'
        request = request_handler.make_request(uri=uri,
                                               request_type='GET',
                                               output_format=output_format)

        return request
예제 #10
0
 def get_plextv_pin(self, pin='', output_format=''):
     request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                token=self.token,
                                                timeout=self.timeout,
                                                ssl_verify=self.ssl_verify,
                                                headers=self.headers)
     if pin:
         uri = '/api/v2/pins/' + pin
         request = request_handler.make_request(uri=uri,
                                                request_type='GET',
                                                output_format=output_format,
                                                no_token=True)
     else:
         uri = '/api/v2/pins?strong=true'
         request = request_handler.make_request(uri=uri,
                                                request_type='POST',
                                                output_format=output_format,
                                                no_token=True)
     return request
예제 #11
0
    def get_plex_auth(self, output_format='raw'):
        uri = '/users/sign_in.xml'
        base64string = base64.b64encode(
            ('%s:%s' % (self.username, self.password)).encode('utf-8'))
        headers = {
            'Content-Type': 'application/xml; charset=utf-8',
            'Authorization': 'Basic %s' % base64string
        }

        request_handler = http_handler.HTTPHandler(urls=self.urls,
                                                   token=self.token,
                                                   timeout=self.timeout,
                                                   ssl_verify=self.ssl_verify,
                                                   headers=self.headers)
        request = request_handler.make_request(uri=uri,
                                               request_type='POST',
                                               headers=headers,
                                               output_format=output_format,
                                               no_token=True)

        return request
예제 #12
0
    def __init__(self, username=None, password=None, token=None, headers=None):
        self.username = username
        self.password = password
        self.token = token
        self.headers = headers

        self.urls = 'https://plex.tv'
        self.timeout = plexpy.CONFIG.PMS_TIMEOUT
        self.ssl_verify = plexpy.CONFIG.VERIFY_SSL_CERT

        if self.username is None and self.password is None:
            if not self.token:
                # Check if we should use the admin token, or the guest server token
                if session.get_session_user_id():
                    user_data = users.Users()
                    user_tokens = user_data.get_tokens(
                        user_id=session.get_session_user_id())
                    self.token = user_tokens['server_token']
                else:
                    self.token = plexpy.CONFIG.PMS_TOKEN

            if not self.token:
                logger.error(
                    u"Tautulli PlexTV :: PlexTV called, but no token provided."
                )
                return

        self.http_handler = http_handler.HTTPHandler(
            urls=self.urls,
            token=self.token,
            timeout=self.timeout,
            ssl_verify=self.ssl_verify,
            headers=self.headers)

        plexpass = self.get_plexpass_status()
        plexpy.CONFIG.PMS_PLEXPASS = plexpass
        plexpy.CONFIG.write()
예제 #13
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
예제 #14
0
 def __init__(self):
     self.protocol = 'HTTPS'
     self.request_handler = http_handler.HTTPHandler(host=plexpy.CONFIG.PMS_IP,
                                                     port=plexpy.CONFIG.PMS_PORT,
                                                     token=plexpy.CONFIG.PMS_TOKEN)