Exemplo n.º 1
0
def _fill_out_missing_chromecast_info(info: ChromecastInfo) -> ChromecastInfo:
    """Fill out missing attributes of ChromecastInfo using blocking HTTP."""
    if info.is_information_complete or info.is_audio_group:
        # We have all information, no need to check HTTP API. Or this is an
        # audio group, so checking via HTTP won't give us any new information.
        return info

    # Fill out missing information via HTTP dial.
    from pychromecast import dial

    http_device_status = dial.get_device_status(
        info.host,
        services=[info.service],
        zconf=ChromeCastZeroconf.get_zeroconf())
    if http_device_status is None:
        # HTTP dial didn't give us any new information.
        return info

    return ChromecastInfo(service=info.service,
                          host=info.host,
                          port=info.port,
                          uuid=(info.uuid or http_device_status.uuid),
                          friendly_name=(info.friendly_name
                                         or http_device_status.friendly_name),
                          manufacturer=(info.manufacturer
                                        or http_device_status.manufacturer),
                          model_name=(info.model_name
                                      or http_device_status.model_name))
Exemplo n.º 2
0
    def fill_out_missing_chromecast_info(self) -> "ChromecastInfo":
        """Return a new ChromecastInfo object with missing attributes filled in.

        Uses blocking HTTP.
        """
        if self.is_information_complete:
            # We have all information, no need to check HTTP API. Or this is an
            # audio group, so checking via HTTP won't give us any new information.
            return self

        # Fill out missing information via HTTP dial.
        if self.is_audio_group:
            is_dynamic_group = False
            http_group_status = None
            dynamic_groups = []
            if self.uuid:
                http_group_status = dial.get_multizone_status(
                    self.host,
                    services=[self.service],
                    zconf=ChromeCastZeroconf.get_zeroconf(),
                )
                if http_group_status is not None:
                    dynamic_groups = [
                        str(g.uuid) for g in http_group_status.dynamic_groups
                    ]
                    is_dynamic_group = self.uuid in dynamic_groups

            return ChromecastInfo(
                service=self.service,
                host=self.host,
                port=self.port,
                uuid=self.uuid,
                friendly_name=self.friendly_name,
                manufacturer=self.manufacturer,
                model_name=self.model_name,
                is_dynamic_group=is_dynamic_group,
            )

        http_device_status = dial.get_device_status(
            self.host,
            services=[self.service],
            zconf=ChromeCastZeroconf.get_zeroconf())
        if http_device_status is None:
            # HTTP dial didn't give us any new information.
            return self

        return ChromecastInfo(
            service=self.service,
            host=self.host,
            port=self.port,
            uuid=(self.uuid or http_device_status.uuid),
            friendly_name=(self.friendly_name
                           or http_device_status.friendly_name),
            manufacturer=(self.manufacturer
                          or http_device_status.manufacturer),
            model_name=(self.model_name or http_device_status.model_name),
        )
Exemplo n.º 3
0
    def fill_out_missing_chromecast_info(self) -> ChromecastInfo:
        """Return a new ChromecastInfo object with missing attributes filled in.

        Uses blocking HTTP / HTTPS.
        """
        if self.is_information_complete:
            # We have all information, no need to check HTTP API.
            return self

        # Fill out missing group information via HTTP API.
        if self.is_audio_group:
            is_dynamic_group = False
            http_group_status = None
            if self.uuid:
                http_group_status = dial.get_multizone_status(
                    self.host,
                    services=self.services,
                    zconf=ChromeCastZeroconf.get_zeroconf(),
                )
                if http_group_status is not None:
                    is_dynamic_group = any(
                        str(g.uuid) == self.uuid
                        for g in http_group_status.dynamic_groups)

            return ChromecastInfo(
                services=self.services,
                host=self.host,
                port=self.port,
                uuid=self.uuid,
                friendly_name=self.friendly_name,
                model_name=self.model_name,
                is_dynamic_group=is_dynamic_group,
            )

        # Fill out some missing information (friendly_name, uuid) via HTTP dial.
        http_device_status = dial.get_device_status(
            self.host,
            services=self.services,
            zconf=ChromeCastZeroconf.get_zeroconf())
        if http_device_status is None:
            # HTTP dial didn't give us any new information.
            return self

        return ChromecastInfo(
            services=self.services,
            host=self.host,
            port=self.port,
            uuid=(self.uuid or http_device_status.uuid),
            friendly_name=(self.friendly_name
                           or http_device_status.friendly_name),
            manufacturer=(self.manufacturer
                          or http_device_status.manufacturer),
            model_name=(self.model_name or http_device_status.model_name),
        )
Exemplo n.º 4
0
def _fill_out_missing_chromecast_info(info: ChromecastInfo) -> ChromecastInfo:
    """Fill out missing attributes of ChromecastInfo using blocking HTTP."""
    if info.is_information_complete:
        # We have all information, no need to check HTTP API. Or this is an
        # audio group, so checking via HTTP won't give us any new information.
        return info

    # Fill out missing information via HTTP dial.
    from pychromecast import dial

    if info.is_audio_group:
        is_dynamic_group = False
        http_group_status = None
        dynamic_groups = []
        if info.uuid:
            http_group_status = dial.get_multizone_status(
                info.host, services=[info.service],
                zconf=ChromeCastZeroconf.get_zeroconf())
            if http_group_status is not None:
                dynamic_groups = \
                    [str(g.uuid) for g in http_group_status.dynamic_groups]
                is_dynamic_group = info.uuid in dynamic_groups

        return ChromecastInfo(
            service=info.service, host=info.host, port=info.port,
            uuid=info.uuid,
            friendly_name=info.friendly_name,
            manufacturer=info.manufacturer,
            model_name=info.model_name,
            is_dynamic_group=is_dynamic_group
        )

    http_device_status = dial.get_device_status(
        info.host, services=[info.service],
        zconf=ChromeCastZeroconf.get_zeroconf())
    if http_device_status is None:
        # HTTP dial didn't give us any new information.
        return info

    return ChromecastInfo(
        service=info.service, host=info.host, port=info.port,
        uuid=(info.uuid or http_device_status.uuid),
        friendly_name=(info.friendly_name or http_device_status.friendly_name),
        manufacturer=(info.manufacturer or http_device_status.manufacturer),
        model_name=(info.model_name or http_device_status.model_name)
    )
Exemplo n.º 5
0
def _fill_out_missing_chromecast_info(info: ChromecastInfo) -> ChromecastInfo:
    """Fill out missing attributes of ChromecastInfo using blocking HTTP."""
    if info.is_information_complete or info.is_audio_group:
        # We have all information, no need to check HTTP API. Or this is an
        # audio group, so checking via HTTP won't give us any new information.
        return info

    # Fill out missing information via HTTP dial.
    from pychromecast import dial

    http_device_status = dial.get_device_status(info.host)
    if http_device_status is None:
        # HTTP dial didn't give us any new information.
        return info

    return ChromecastInfo(
        host=info.host, port=info.port,
        uuid=(info.uuid or http_device_status.uuid),
        friendly_name=(info.friendly_name or http_device_status.friendly_name),
        model_name=(info.model_name or http_device_status.model_name)
    )
Exemplo n.º 6
0
    def fill_out_missing_chromecast_info(self, zconf) -> None:
        """Lookup missing info for the Chromecast player."""
        http_device_status = None

        if self._info_requested:
            return

        # Fill out missing group information via HTTP API.
        if self.is_audio_group:
            http_group_status = None
            if self.uuid:
                http_group_status = dial.get_multizone_status(
                    None,
                    services=self.services,
                    zconf=zconf,
                )
                if http_group_status is not None:
                    self.is_dynamic_group = any(
                        str(g.uuid) == self.uuid
                        for g in http_group_status.dynamic_groups)
        else:
            # Fill out some missing information (friendly_name, uuid) via HTTP dial.
            http_device_status = dial.get_device_status(None,
                                                        services=self.services,
                                                        zconf=zconf)
        if http_device_status:
            self.uuid = str(http_device_status.uuid)
        if not self.friendly_name and http_device_status:
            self.friendly_name = http_device_status.friendly_name
        if not self.model_name and http_device_status:
            self.model_name = http_device_status.model_name
        if not self.manufacturer and http_device_status:
            self.manufacturer = http_device_status.manufacturer
        if not self.manufacturer and self.model_name:
            self.manufacturer = CAST_MANUFACTURERS.get(self.model_name.lower(),
                                                       "Google Inc.")

        self._info_requested = True