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))
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), )
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), )
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) )
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) )
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