def __init__(self, url, node=None, parent=None, dump=''):
        self.__parent = parent
        self.__services = {}
        self.__devices = {}
        self.__icons = {}

        icons = node.find('iconList')
        if icons is None:
            icons = []
        services = node.find('serviceList')
        if services is None:
            services = []
        devices = node.find('deviceList')
        if devices is None:
            devices = []

        self.__node = node

        for icon in icons:
            icon = Icon(self, url, icon)
            self.__icons[icon.__name__] = icon

        for service in services:
            scpdurl = service.find('SCPDURL').text.replace(url, '')
            control_url = service.find('controlURL').text.replace(url, '')
            service_id = service.find('serviceId').text
            service_type = service.find('serviceType').text

            service = Service(
                self,
                url,
                scpdurl,
                service_type,
                control_url,
                dump=dump
            )

            name = service_id.split(':')[-1]
            service.__name__ = name
            self.__services[name] = service

        for device in devices:
            device = EmbeddedDevice(
                url,
                node=device,
                parent=self,
                dump=dump
            )

            self.__devices[device.__name__] = device

        self.url = url
        self.__name__ = self.friendly_name.replace(' ', '_').replace('-', '')
示例#2
0
    def __init__(self, ip, locations, dump=''):
        self.ip_address = ip

        cls_name = None
        self._devices = {}
        self._services = {}
        for location in locations:
            parsed_url = urlparse(location)

            url = parsed_url.scheme + '://' + parsed_url.netloc
            response = requests.get(location)

            if dump:
                path = location
                if path.startswith('/'):
                    path = path[1:]

                if '/' in path:
                    path, file_name = path.rsplit('/', 1)
                    path = os.path.join(dump, path)
                else:
                    file_name = path
                    path = dump

                if not os.path.exists(path):
                    os.makedirs(path)

                if not file_name.endswith('.xml'):
                    file_name += '.xml'

                if isinstance(response.content, bytes):
                    content = response.content.decode('utf-8')
                else:
                    content = response.content

                with open(os.path.join(path, file_name), 'w') as f:
                    f.write(content)

            root = etree.fromstring(response.content)
            root = strip_xmlns(root)

            node = root.find('device')

            services = node.find('serviceList')
            if services is None:
                services = []

            devices = node.find('deviceList')
            if devices is None:
                devices = []

            for service in services:
                scpdurl = service.find('SCPDURL').text.replace(url, '')

                control_url = service.find('controlURL').text
                if control_url is None:
                    if scpdurl.endswith('.xml'):
                        control_url = scpdurl.rsplit('/', 1)[0]
                        if control_url == scpdurl:
                            control_url = ''
                    else:
                        control_url = scpdurl
                else:
                    control_url = control_url.replace(url, '')

                service_id = service.find('serviceId').text
                service_type = service.find('serviceType').text

                service = Service(
                    self,
                    url,
                    scpdurl,
                    service_type,
                    control_url,
                    node,
                    dump=dump
                )
                name = service_id.split(':')[-1]
                service.__name__ = name
                self._services[name] = service

            for device in devices:
                device = EmbeddedDevice(
                    url,
                    node=device,
                    parent=self,
                    dump=dump
                )
                self._devices[device.__name__] = device

            if cls_name is None:
                cls_name = node.find('modelName')
                if cls_name is not None and cls_name.text:
                    cls_name = cls_name.text.replace(' ', '_').replace('-', '')

        self.__name__ = cls_name
    def build(self, ip_address, locations, dump=''):
        self._devices.clear()
        self._services.clear()
        self.ip_address = ip_address

        for location in locations:
            parsed = urlparse(location)
            url = '{0}://{1}:{2}/'.format(parsed.scheme, parsed.hostname,
                                          parsed.port)

            logger.debug(self.ip_address + ' <-- (' + location + ') ""')
            response = requests.get(location)

            logger.debug(self.ip_address + ' --> (' + location + ') ' +
                         response.content.decode('utf-8'))

            path = parsed.path
            if path.startswith('/'):
                path = path[1:]

            if '/' in path:
                path, file_name = path.rsplit('/', 1)
            else:
                file_name = path
                path = ''

            if not file_name.endswith('.xml'):
                file_name += '.xml'

            if dump:
                content = response.content.decode('utf-8')
                if path:
                    output = os.path.join(dump, path)

                    if not os.path.exists(output):
                        os.makedirs(output)
                else:
                    output = dump

                indent_count = 0

                for line in content.split('\n'):
                    for char in list(line):
                        if not line:
                            continue

                        if char != ' ' and not indent_count:
                            break
                        if char == ' ':
                            indent_count += 1
                        else:
                            if indent_count != 2:
                                indent_count = 0
                            break
                    if indent_count:
                        break

                with open(os.path.join(output, file_name), 'w') as f:
                    for line in content.split('\n'):
                        if not line.strip():
                            continue
                        line = line.replace('\t', '    ')
                        if indent_count:
                            count = 0
                            for char in list(line):
                                if char != ' ':
                                    break
                                count += 1
                            line = '    ' * (count / 2) + line.strip()
                        f.write(line + '\n')

            try:
                root = etree.fromstring(response.content.decode('utf-8'))
            except etree.XMLSyntaxError:
                return
            except ValueError:
                try:
                    root = etree.fromstring(response.content)
                except etree.XMLSyntaxError:
                    return

            root = strip_xmlns(root)
            node = root.find('device')
            if node is None:
                services = []
                devices = []

            else:
                services = node.find('serviceList')

                if services is None:
                    services = []

                devices = node.find('deviceList')
                if devices is None:
                    devices = []

            for service in services:
                scpdurl = service.find('SCPDURL').text.replace(url, '')

                if '/' not in scpdurl and path and path not in scpdurl:
                    scpdurl = path + '/' + scpdurl

                control_url = service.find('controlURL').text
                if control_url is None:
                    if scpdurl.endswith('.xml'):
                        control_url = scpdurl.rsplit('/', 1)[0]
                        if control_url == scpdurl:
                            control_url = ''
                    else:
                        control_url = scpdurl
                else:
                    control_url = control_url.replace(url, '')

                if control_url.startswith('/'):
                    control_url = control_url[1:]

                if scpdurl.startswith('/'):
                    scpdurl = scpdurl[1:]

                service_id = service.find('serviceId').text
                service_type = service.find('serviceType').text

                service = Service(self,
                                  url,
                                  scpdurl,
                                  service_type,
                                  control_url,
                                  node,
                                  dump=dump)
                name = service_id.split(':')[-1]
                service.__name__ = name
                self._services[name] = service

            for device in devices:
                device = EmbeddedDevice(url,
                                        node=device,
                                        parent=self,
                                        dump=dump)
                self._devices[device.__name__] = device