@@ -143,6 +143,7 @@ class ServiceInfo(RecordUpdateListener):
143143 "server" ,
144144 "server_key" ,
145145 "_properties" ,
146+ "_decoded_properties" ,
146147 "host_ttl" ,
147148 "other_ttl" ,
148149 "interface_index" ,
@@ -192,6 +193,7 @@ def __init__(
192193 self .server = server if server else None
193194 self .server_key = server .lower () if server else None
194195 self ._properties : Optional [Dict [bytes , Optional [bytes ]]] = None
196+ self ._decoded_properties : Optional [Dict [str , Optional [str ]]] = None
195197 if isinstance (properties , bytes ):
196198 self ._set_text (properties )
197199 else :
@@ -268,6 +270,15 @@ def properties(self) -> Dict[bytes, Optional[bytes]]:
268270 assert self ._properties is not None
269271 return self ._properties
270272
273+ @property
274+ def decoded_properties (self ) -> Dict [str , Optional [str ]]:
275+ """Return properties as strings."""
276+ if self ._decoded_properties is None :
277+ self ._generate_decoded_properties ()
278+ if TYPE_CHECKING :
279+ assert self ._decoded_properties is not None
280+ return self ._decoded_properties
281+
271282 def async_clear_cache (self ) -> None :
272283 """Clear the cache for this service info."""
273284 self ._dns_address_cache = None
@@ -384,6 +395,14 @@ def _set_text(self, text: bytes) -> None:
384395 self .text = text
385396 # Clear the properties cache
386397 self ._properties = None
398+ self ._decoded_properties = None
399+
400+ def _generate_decoded_properties (self ) -> None :
401+ """Generates decoded properties from the properties"""
402+ self ._decoded_properties = {
403+ k .decode ("ascii" , "replace" ): None if v is None else v .decode ("utf-8" , "replace" )
404+ for k , v in self .properties .items ()
405+ }
387406
388407 def _unpack_text_into_properties (self ) -> None :
389408 """Unpacks the text field into properties"""
0 commit comments