"""Discover Yamaha Receivers."""
|
|
from . import SSDPDiscoverable
|
|
|
|
|
|
class Discoverable(SSDPDiscoverable):
|
|
"""Add support for discovering Yamaha Receivers."""
|
|
|
|
INCOMPATIBLE_MODELS = set('N301')
|
|
|
|
REMOTE_CONTROL_SPEC_TYPE =\
|
|
'urn:schemas-yamaha-com:service:X_YamahaRemoteControl:1'
|
|
|
|
def info_from_entry(self, entry):
|
|
"""Return the most important info from a uPnP entry."""
|
|
info = super().info_from_entry(entry)
|
|
|
|
yam = entry.description['X_device']
|
|
services = yam['X_serviceList']['X_service']
|
|
if isinstance(services, list):
|
|
service = next(
|
|
(s for s in services
|
|
if s['X_specType'] == self.REMOTE_CONTROL_SPEC_TYPE),
|
|
services[0])
|
|
else:
|
|
service = services
|
|
# do a slice of the second element so we don't have double /
|
|
info['control_url'] = yam['X_URLBase'] + service['X_controlURL'][1:]
|
|
info['description_url'] = (yam['X_URLBase'] +
|
|
service['X_unitDescURL'][1:])
|
|
|
|
return info
|
|
|
|
def get_entries(self):
|
|
"""Get all the Yamaha uPnP entries."""
|
|
devices = self.find_by_device_description({
|
|
"manufacturer": "Yamaha Corporation",
|
|
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1"
|
|
})
|
|
|
|
return [device for device in devices if
|
|
device.description['device'].get('modelNumber', '') not in
|
|
self.INCOMPATIBLE_MODELS]
|