@@ -156,6 +156,16 @@ def __init__(self, host, nickname, psk=None,
156
156
self .dmr_port = dmr_port
157
157
self .ircc_port = ircc_port
158
158
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
+
159
169
# actions are thing like getting status
160
170
self .actions = {}
161
171
self .headers = {}
@@ -168,16 +178,17 @@ def __init__(self, host, nickname, psk=None,
168
178
self .mac = None
169
179
self .api_version = 0
170
180
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"
172
183
self .app_url = f"http://{ self .host } :{ self .app_port } "
173
184
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 } "
175
186
if self .ircc_port == self .dmr_port :
176
187
self .ircc_url = self .dmr_url
177
188
else :
178
- self .ircc_url = urljoin (ircc_base , "/Ircc.xml" )
189
+ self .ircc_url = urljoin (self . ircc_base , "/Ircc.xml" )
179
190
180
- self .irccscpd_url = urljoin (ircc_base , "/IRCCSCPD.xml" )
191
+ self .irccscpd_url = urljoin (self . ircc_base , "/IRCCSCPD.xml" )
181
192
self ._ircc_categories = set ()
182
193
self ._add_headers ()
183
194
@@ -272,6 +283,12 @@ def _parse_ircc(self):
272
283
self .ircc_url , method = HttpMethod .GET , raise_errors = True )
273
284
274
285
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
+
275
292
# the action list contains everything the device supports
276
293
self .actionlist_url = find_in_xml (
277
294
response .text ,
@@ -320,6 +337,62 @@ def _parse_ircc(self):
320
337
321
338
self ._ircc_categories .add (category_info .text )
322
339
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
+
323
396
def _parse_system_information_v4 (self ):
324
397
url = urljoin (self .base_url , "system" )
325
398
json_data = self ._create_api_json ("getSystemSupportedFunction" )
@@ -350,6 +423,10 @@ def _parse_system_information(self):
350
423
"functionItem" ).attrib ["value" ]
351
424
352
425
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
+
353
430
lirc_url = urlparse (self .ircc_url )
354
431
xml_data = xml .etree .ElementTree .fromstring (data )
355
432
@@ -694,6 +771,12 @@ def _recreate_auth_cookie(self):
694
771
cookies .set ("auth" , self .cookies .get ("auth" ))
695
772
return cookies
696
773
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
+
697
780
def register (self ):
698
781
"""Register at the api.
699
782
0 commit comments