Skip to content

Commit dfba585

Browse files
Liborsafalexmohr
authored andcommitted
More system info
+ set_value helper + config file version tests
1 parent 737382f commit dfba585

File tree

4 files changed

+1521
-5
lines changed

4 files changed

+1521
-5
lines changed

sonyapilib/device.py

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,16 @@ def __init__(self, host, nickname, psk=None,
156156
self.dmr_port = dmr_port
157157
self.ircc_port = ircc_port
158158

159+
# information about target system
160+
self.friendly_name = None
161+
self.manufacturer = None
162+
self.manufacturer_url = None
163+
self.model_description = None
164+
self.model_name = None
165+
self.model_url = None
166+
self.model_number = None
167+
self.icons = None
168+
159169
# actions are thing like getting status
160170
self.actions = {}
161171
self.headers = {}
@@ -168,16 +178,17 @@ def __init__(self, host, nickname, psk=None,
168178
self.mac = None
169179
self.api_version = 0
170180

171-
self.dmr_url = f"http://{self.host}:{self.dmr_port}/dmr.xml"
181+
self.dmr_base = f"http://{self.host}:{self.dmr_port}"
182+
self.dmr_url = f"{self.dmr_base}/dmr.xml"
172183
self.app_url = f"http://{self.host}:{self.app_port}"
173184
self.base_url = f"http://{self.host}/sony/"
174-
ircc_base = f"http://{self.host}:{self.ircc_port}"
185+
self.ircc_base = f"http://{self.host}:{self.ircc_port}"
175186
if self.ircc_port == self.dmr_port:
176187
self.ircc_url = self.dmr_url
177188
else:
178-
self.ircc_url = urljoin(ircc_base, "/Ircc.xml")
189+
self.ircc_url = urljoin(self.ircc_base, "/Ircc.xml")
179190

180-
self.irccscpd_url = urljoin(ircc_base, "/IRCCSCPD.xml")
191+
self.irccscpd_url = urljoin(self.ircc_base, "/IRCCSCPD.xml")
181192
self._ircc_categories = set()
182193
self._add_headers()
183194

@@ -272,6 +283,12 @@ def _parse_ircc(self):
272283
self.ircc_url, method=HttpMethod.GET, raise_errors=True)
273284

274285
upnp_device = f"{URN_UPNP_DEVICE}device"
286+
287+
self._set_value('ircc_base', f"http://{self.host}:{self.ircc_port}")
288+
289+
self._parse_system_info(response.text, self.ircc_base,
290+
upnp_device=upnp_device)
291+
275292
# the action list contains everything the device supports
276293
self.actionlist_url = find_in_xml(
277294
response.text,
@@ -320,6 +337,62 @@ def _parse_ircc(self):
320337

321338
self._ircc_categories.add(category_info.text)
322339

340+
def _parse_system_info(self, text, base_url, upnp_device=None):
341+
upnp_device = upnp_device or f"{URN_UPNP_DEVICE}device"
342+
343+
self._set_value('friendly_name', self._find_device_info(
344+
text, "friendlyName",
345+
upnp_device=upnp_device
346+
))
347+
self._set_value('manufacturer', self._find_device_info(
348+
text, "manufacturer",
349+
upnp_device=upnp_device
350+
))
351+
self._set_value('manufacturer_url', self._find_device_info(
352+
text, "manufacturerURL",
353+
upnp_device=upnp_device
354+
))
355+
self._set_value('model_description', self._find_device_info(
356+
text, "modelDescription",
357+
upnp_device=upnp_device
358+
))
359+
self._set_value('model_name', self._find_device_info(
360+
text, "modelName",
361+
upnp_device=upnp_device
362+
))
363+
self._set_value('model_url', self._find_device_info(
364+
text, "modelURL",
365+
upnp_device=upnp_device
366+
))
367+
self._set_value('model_number', self._find_device_info(
368+
text, "modelNumber",
369+
upnp_device=upnp_device
370+
))
371+
372+
if hasattr(self, 'icons') and self.icons:
373+
return
374+
375+
icons = find_in_xml(
376+
text,
377+
[upnp_device,
378+
f"{URN_UPNP_DEVICE}iconList",
379+
(f"{URN_UPNP_DEVICE}icon", True),
380+
f"{URN_UPNP_DEVICE}url"])
381+
382+
self.icons = [f"{base_url}{icon.text}" for icon in icons]
383+
384+
@staticmethod
385+
def _find_device_info(text, info, upnp_device=None):
386+
upnp_device = upnp_device or f"{URN_UPNP_DEVICE}device"
387+
388+
element = find_in_xml(
389+
text,
390+
[upnp_device,
391+
f"{URN_UPNP_DEVICE}{info}"]
392+
)
393+
394+
return element.text if element is not None else None
395+
323396
def _parse_system_information_v4(self):
324397
url = urljoin(self.base_url, "system")
325398
json_data = self._create_api_json("getSystemSupportedFunction")
@@ -350,6 +423,10 @@ def _parse_system_information(self):
350423
"functionItem").attrib["value"]
351424

352425
def _parse_dmr(self, data):
426+
self._set_value('dmr_base', f"http://{self.host}:{self.dmr_port}")
427+
428+
self._parse_system_info(data, self.dmr_base)
429+
353430
lirc_url = urlparse(self.ircc_url)
354431
xml_data = xml.etree.ElementTree.fromstring(data)
355432

@@ -694,6 +771,12 @@ def _recreate_auth_cookie(self):
694771
cookies.set("auth", self.cookies.get("auth"))
695772
return cookies
696773

774+
def _set_value(self, attribute, value):
775+
if not hasattr(self, attribute):
776+
setattr(self, attribute, value)
777+
elif value and not getattr(self, attribute):
778+
setattr(self, attribute, value)
779+
697780
def register(self):
698781
"""Register at the api.
699782

0 commit comments

Comments
 (0)