async def async_browse_search(self, query: str) -> BrowseMediaSource: """Return all media items found by the query string.""" assert self._device result = await self._device.async_search_directory( container_id=ROOT_OBJECT_ID, search_criteria=query, metadata_filter=DLNA_BROWSE_FILTER, ) children = [ self._didl_to_media_source(child) for child in result.result if isinstance(child, didl_lite.DidlObject) ] media_source = BrowseMediaSource( domain=DOMAIN, identifier=self._make_identifier(Action.SEARCH, query), media_class=MEDIA_CLASS_DIRECTORY, media_content_type="", title="Search results", can_play=False, can_expand=True, children=children, ) if media_source.children: media_source.calculate_children_class() return media_source
def _didl_to_media_source( self, item: didl_lite.DidlObject, browsed_children: DmsDevice.BrowseResult | None = None, ) -> BrowseMediaSource: """Convert a DIDL-Lite object to a browse media source.""" children: list[BrowseMediaSource] | None = None if browsed_children: children = [ self._didl_to_media_source(child) for child in browsed_children.result if isinstance(child, didl_lite.DidlObject) ] # Can expand if it has children (even if we don't have them yet), or its # a container type. Otherwise the front-end will try to play it (even if # can_play is False). try: child_count = int(item.child_count) except (AttributeError, TypeError, ValueError): child_count = 0 can_expand = (bool(children) or child_count > 0 or isinstance(item, didl_lite.Container)) # Can play if item has any resource that can be streamed over the network can_play = any(_resource_is_streaming(res) for res in item.res) # Use server name for root object, not "root" title = self.name if item.id == ROOT_OBJECT_ID else item.title mime_type = _resource_mime_type(item.res[0]) if item.res else None media_content_type = mime_type or item.upnp_class media_source = BrowseMediaSource( domain=DOMAIN, identifier=self._make_identifier(Action.OBJECT, item.id), media_class=MEDIA_CLASS_MAP.get(item.upnp_class, ""), media_content_type=media_content_type, title=title, can_play=can_play, can_expand=can_expand, children=children, thumbnail=self._didl_thumbnail_url(item), ) if media_source.children: media_source.calculate_children_class() return media_source