def fill_out_missing_chromecast_info(self) -> ChromecastInfo: """Return a new ChromecastInfo object with missing attributes filled in. Uses blocking HTTP / HTTPS. """ if not self.is_audio_group or self.is_dynamic_group is not None: # We have all information, no need to check HTTP API. return self # Fill out missing group information via HTTP API. is_dynamic_group = False http_group_status = None http_group_status = dial.get_multizone_status( None, services=self.cast_info.services, zconf=ChromeCastZeroconf.get_zeroconf(), ) if http_group_status is not None: is_dynamic_group = any( g.uuid == self.cast_info.uuid for g in http_group_status.dynamic_groups ) return ChromecastInfo( cast_info=self.cast_info, is_dynamic_group=is_dynamic_group, )
def fill_out_missing_chromecast_info(self) -> ChromecastInfo: """Return a new ChromecastInfo object with missing attributes filled in. Uses blocking HTTP / HTTPS. """ cast_info = self.cast_info if self.cast_info.cast_type is None or self.cast_info.manufacturer is None: # Manufacturer and cast type is not available in mDNS data, get it over http cast_info = dial.get_cast_type( cast_info, zconf=ChromeCastZeroconf.get_zeroconf(), ) if not self.is_audio_group or self.is_dynamic_group is not None: # We have all information, no need to check HTTP API. return ChromecastInfo(cast_info=cast_info) # Fill out missing group information via HTTP API. is_dynamic_group = False http_group_status = None http_group_status = dial.get_multizone_status( None, services=self.cast_info.services, zconf=ChromeCastZeroconf.get_zeroconf(), ) if http_group_status is not None: is_dynamic_group = any(g.uuid == self.cast_info.uuid for g in http_group_status.dynamic_groups) return ChromecastInfo( cast_info=cast_info, is_dynamic_group=is_dynamic_group, )
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(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(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(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
def fill_out_missing_chromecast_info( self, hass: HomeAssistant) -> ChromecastInfo: """Return a new ChromecastInfo object with missing attributes filled in. Uses blocking HTTP / HTTPS. """ cast_info = self.cast_info if self.cast_info.cast_type is None or self.cast_info.manufacturer is None: unknown_models = hass.data[DOMAIN]["unknown_models"] if self.cast_info.model_name not in unknown_models: # Manufacturer and cast type is not available in mDNS data, get it over http cast_info = dial.get_cast_type( cast_info, zconf=ChromeCastZeroconf.get_zeroconf(), ) unknown_models[self.cast_info.model_name] = ( cast_info.cast_type, cast_info.manufacturer, ) report_issue = ( "create a bug report at " "https://github.com/home-assistant/core/issues?q=is%3Aopen+is%3Aissue" "+label%3A%22integration%3A+cast%22") _LOGGER.info( "Fetched cast details for unknown model '%s' manufacturer: '%s', type: '%s'. Please %s", cast_info.model_name, cast_info.manufacturer, cast_info.cast_type, report_issue, ) else: cast_type, manufacturer = unknown_models[ self.cast_info.model_name] cast_info = CastInfo( cast_info.services, cast_info.uuid, cast_info.model_name, cast_info.friendly_name, cast_info.host, cast_info.port, cast_type, manufacturer, ) if not self.is_audio_group or self.is_dynamic_group is not None: # We have all information, no need to check HTTP API. return ChromecastInfo(cast_info=cast_info) # Fill out missing group information via HTTP API. is_dynamic_group = False http_group_status = None http_group_status = dial.get_multizone_status( None, services=self.cast_info.services, zconf=ChromeCastZeroconf.get_zeroconf(), ) if http_group_status is not None: is_dynamic_group = any(g.uuid == self.cast_info.uuid for g in http_group_status.dynamic_groups) return ChromecastInfo( cast_info=cast_info, is_dynamic_group=is_dynamic_group, )