Config-flow for DLNA-DMR integration (#55267)
* Modernize dlna_dmr component: configflow, test, types
* Support config-flow with ssdp discovery
* Add unit tests
* Enforce strict typing
* Gracefully handle network devices (dis)appearing
* Fix Aiohttp mock response headers type to match actual response class
* Fixes from code review
* Fixes from code review
* Import device config in flow if unavailable at hass start
* Support SSDP advertisements
* Ignore bad BOOTID, fix ssdp:byebye handling
* Only listen for events on interface connected to device
* Release all listeners when entities are removed
* Warn about deprecated dlna_dmr configuration
* Use sublogger for dlna_dmr.config_flow for easier filtering
* Tests for dlna_dmr.data module
* Rewrite DMR tests for HA style
* Fix DMR strings: "Digital Media *Renderer*"
* Update DMR entity state and device info when changed
* Replace deprecated async_upnp_client State with TransportState
* supported_features are dynamic, based on current device state
* Cleanup fully when subscription fails
* Log warnings when device connection fails unexpectedly
* Set PARALLEL_UPDATES to unlimited
* Fix spelling
* Fixes from code review
* Simplify has & can checks to just can, which includes has
* Treat transitioning state as playing (not idle) to reduce UI jerking
* Test if device is usable
* Handle ssdp:update messages properly
* Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances
* Fix tests for transitioning state
* Mock DmrDevice.is_profile_device (added to support embedded devices)
* Use ST & NT SSDP headers to find DMR devices, not deviceType
The deviceType is extracted from the device's description XML, and will not
be what we want when dealing with embedded devices.
* Use UDN from SSDP headers, not device description, as unique_id
The SSDP headers have the UDN of the embedded device that we're interested
in, whereas the device description (`ATTR_UPNP_UDN`) field will always be
for the root device.
* Fix DMR string English localization
* Test config flow with UDN from SSDP headers
* Bump async-upnp-client==0.22.1, fix flake8 error
* fix test for remapping
* DMR HA Device connections based on root and embedded UDN
* DmrDevice's UpnpDevice is now named profile_device
* Use device type from SSDP headers, not device description
* Mark dlna_dmr constants as Final
* Use embedded device UDN and type for unique ID when connected via URL
* More informative connection error messages
* Also match SSDP messages on NT headers
The NT header is to ssdp:alive messages what ST is to M-SEARCH responses.
* Bump async-upnp-client==0.22.2
* fix merge
* Bump async-upnp-client==0.22.3
Co-authored-by: Steven Looman <steven.looman@gmail.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
|
|
|
"""Constants for the DLNA DMR component."""
|
2021-09-29 00:37:23 +00:00
|
|
|
from __future__ import annotations
|
Config-flow for DLNA-DMR integration (#55267)
* Modernize dlna_dmr component: configflow, test, types
* Support config-flow with ssdp discovery
* Add unit tests
* Enforce strict typing
* Gracefully handle network devices (dis)appearing
* Fix Aiohttp mock response headers type to match actual response class
* Fixes from code review
* Fixes from code review
* Import device config in flow if unavailable at hass start
* Support SSDP advertisements
* Ignore bad BOOTID, fix ssdp:byebye handling
* Only listen for events on interface connected to device
* Release all listeners when entities are removed
* Warn about deprecated dlna_dmr configuration
* Use sublogger for dlna_dmr.config_flow for easier filtering
* Tests for dlna_dmr.data module
* Rewrite DMR tests for HA style
* Fix DMR strings: "Digital Media *Renderer*"
* Update DMR entity state and device info when changed
* Replace deprecated async_upnp_client State with TransportState
* supported_features are dynamic, based on current device state
* Cleanup fully when subscription fails
* Log warnings when device connection fails unexpectedly
* Set PARALLEL_UPDATES to unlimited
* Fix spelling
* Fixes from code review
* Simplify has & can checks to just can, which includes has
* Treat transitioning state as playing (not idle) to reduce UI jerking
* Test if device is usable
* Handle ssdp:update messages properly
* Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances
* Fix tests for transitioning state
* Mock DmrDevice.is_profile_device (added to support embedded devices)
* Use ST & NT SSDP headers to find DMR devices, not deviceType
The deviceType is extracted from the device's description XML, and will not
be what we want when dealing with embedded devices.
* Use UDN from SSDP headers, not device description, as unique_id
The SSDP headers have the UDN of the embedded device that we're interested
in, whereas the device description (`ATTR_UPNP_UDN`) field will always be
for the root device.
* Fix DMR string English localization
* Test config flow with UDN from SSDP headers
* Bump async-upnp-client==0.22.1, fix flake8 error
* fix test for remapping
* DMR HA Device connections based on root and embedded UDN
* DmrDevice's UpnpDevice is now named profile_device
* Use device type from SSDP headers, not device description
* Mark dlna_dmr constants as Final
* Use embedded device UDN and type for unique ID when connected via URL
* More informative connection error messages
* Also match SSDP messages on NT headers
The NT header is to ssdp:alive messages what ST is to M-SEARCH responses.
* Bump async-upnp-client==0.22.2
* fix merge
* Bump async-upnp-client==0.22.3
Co-authored-by: Steven Looman <steven.looman@gmail.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
|
|
|
|
2021-09-29 00:37:23 +00:00
|
|
|
from collections.abc import Mapping
|
Config-flow for DLNA-DMR integration (#55267)
* Modernize dlna_dmr component: configflow, test, types
* Support config-flow with ssdp discovery
* Add unit tests
* Enforce strict typing
* Gracefully handle network devices (dis)appearing
* Fix Aiohttp mock response headers type to match actual response class
* Fixes from code review
* Fixes from code review
* Import device config in flow if unavailable at hass start
* Support SSDP advertisements
* Ignore bad BOOTID, fix ssdp:byebye handling
* Only listen for events on interface connected to device
* Release all listeners when entities are removed
* Warn about deprecated dlna_dmr configuration
* Use sublogger for dlna_dmr.config_flow for easier filtering
* Tests for dlna_dmr.data module
* Rewrite DMR tests for HA style
* Fix DMR strings: "Digital Media *Renderer*"
* Update DMR entity state and device info when changed
* Replace deprecated async_upnp_client State with TransportState
* supported_features are dynamic, based on current device state
* Cleanup fully when subscription fails
* Log warnings when device connection fails unexpectedly
* Set PARALLEL_UPDATES to unlimited
* Fix spelling
* Fixes from code review
* Simplify has & can checks to just can, which includes has
* Treat transitioning state as playing (not idle) to reduce UI jerking
* Test if device is usable
* Handle ssdp:update messages properly
* Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances
* Fix tests for transitioning state
* Mock DmrDevice.is_profile_device (added to support embedded devices)
* Use ST & NT SSDP headers to find DMR devices, not deviceType
The deviceType is extracted from the device's description XML, and will not
be what we want when dealing with embedded devices.
* Use UDN from SSDP headers, not device description, as unique_id
The SSDP headers have the UDN of the embedded device that we're interested
in, whereas the device description (`ATTR_UPNP_UDN`) field will always be
for the root device.
* Fix DMR string English localization
* Test config flow with UDN from SSDP headers
* Bump async-upnp-client==0.22.1, fix flake8 error
* fix test for remapping
* DMR HA Device connections based on root and embedded UDN
* DmrDevice's UpnpDevice is now named profile_device
* Use device type from SSDP headers, not device description
* Mark dlna_dmr constants as Final
* Use embedded device UDN and type for unique ID when connected via URL
* More informative connection error messages
* Also match SSDP messages on NT headers
The NT header is to ssdp:alive messages what ST is to M-SEARCH responses.
* Bump async-upnp-client==0.22.2
* fix merge
* Bump async-upnp-client==0.22.3
Co-authored-by: Steven Looman <steven.looman@gmail.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
|
|
|
import logging
|
|
|
|
from typing import Final
|
|
|
|
|
2021-09-29 00:37:23 +00:00
|
|
|
from homeassistant.components.media_player import const as _mp_const
|
|
|
|
|
Config-flow for DLNA-DMR integration (#55267)
* Modernize dlna_dmr component: configflow, test, types
* Support config-flow with ssdp discovery
* Add unit tests
* Enforce strict typing
* Gracefully handle network devices (dis)appearing
* Fix Aiohttp mock response headers type to match actual response class
* Fixes from code review
* Fixes from code review
* Import device config in flow if unavailable at hass start
* Support SSDP advertisements
* Ignore bad BOOTID, fix ssdp:byebye handling
* Only listen for events on interface connected to device
* Release all listeners when entities are removed
* Warn about deprecated dlna_dmr configuration
* Use sublogger for dlna_dmr.config_flow for easier filtering
* Tests for dlna_dmr.data module
* Rewrite DMR tests for HA style
* Fix DMR strings: "Digital Media *Renderer*"
* Update DMR entity state and device info when changed
* Replace deprecated async_upnp_client State with TransportState
* supported_features are dynamic, based on current device state
* Cleanup fully when subscription fails
* Log warnings when device connection fails unexpectedly
* Set PARALLEL_UPDATES to unlimited
* Fix spelling
* Fixes from code review
* Simplify has & can checks to just can, which includes has
* Treat transitioning state as playing (not idle) to reduce UI jerking
* Test if device is usable
* Handle ssdp:update messages properly
* Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances
* Fix tests for transitioning state
* Mock DmrDevice.is_profile_device (added to support embedded devices)
* Use ST & NT SSDP headers to find DMR devices, not deviceType
The deviceType is extracted from the device's description XML, and will not
be what we want when dealing with embedded devices.
* Use UDN from SSDP headers, not device description, as unique_id
The SSDP headers have the UDN of the embedded device that we're interested
in, whereas the device description (`ATTR_UPNP_UDN`) field will always be
for the root device.
* Fix DMR string English localization
* Test config flow with UDN from SSDP headers
* Bump async-upnp-client==0.22.1, fix flake8 error
* fix test for remapping
* DMR HA Device connections based on root and embedded UDN
* DmrDevice's UpnpDevice is now named profile_device
* Use device type from SSDP headers, not device description
* Mark dlna_dmr constants as Final
* Use embedded device UDN and type for unique ID when connected via URL
* More informative connection error messages
* Also match SSDP messages on NT headers
The NT header is to ssdp:alive messages what ST is to M-SEARCH responses.
* Bump async-upnp-client==0.22.2
* fix merge
* Bump async-upnp-client==0.22.3
Co-authored-by: Steven Looman <steven.looman@gmail.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
|
|
|
LOGGER = logging.getLogger(__package__)
|
|
|
|
|
|
|
|
DOMAIN: Final = "dlna_dmr"
|
|
|
|
|
|
|
|
CONF_LISTEN_PORT: Final = "listen_port"
|
|
|
|
CONF_CALLBACK_URL_OVERRIDE: Final = "callback_url_override"
|
|
|
|
CONF_POLL_AVAILABILITY: Final = "poll_availability"
|
|
|
|
|
|
|
|
DEFAULT_NAME: Final = "DLNA Digital Media Renderer"
|
|
|
|
|
|
|
|
CONNECT_TIMEOUT: Final = 10
|
2021-09-29 00:37:23 +00:00
|
|
|
|
|
|
|
# Map UPnP class to media_player media_content_type
|
|
|
|
MEDIA_TYPE_MAP: Mapping[str, str] = {
|
|
|
|
"object": _mp_const.MEDIA_TYPE_URL,
|
|
|
|
"object.item": _mp_const.MEDIA_TYPE_URL,
|
|
|
|
"object.item.imageItem": _mp_const.MEDIA_TYPE_IMAGE,
|
|
|
|
"object.item.imageItem.photo": _mp_const.MEDIA_TYPE_IMAGE,
|
|
|
|
"object.item.audioItem": _mp_const.MEDIA_TYPE_MUSIC,
|
|
|
|
"object.item.audioItem.musicTrack": _mp_const.MEDIA_TYPE_MUSIC,
|
|
|
|
"object.item.audioItem.audioBroadcast": _mp_const.MEDIA_TYPE_MUSIC,
|
|
|
|
"object.item.audioItem.audioBook": _mp_const.MEDIA_TYPE_PODCAST,
|
|
|
|
"object.item.videoItem": _mp_const.MEDIA_TYPE_VIDEO,
|
|
|
|
"object.item.videoItem.movie": _mp_const.MEDIA_TYPE_MOVIE,
|
|
|
|
"object.item.videoItem.videoBroadcast": _mp_const.MEDIA_TYPE_TVSHOW,
|
|
|
|
"object.item.videoItem.musicVideoClip": _mp_const.MEDIA_TYPE_VIDEO,
|
|
|
|
"object.item.playlistItem": _mp_const.MEDIA_TYPE_PLAYLIST,
|
|
|
|
"object.item.textItem": _mp_const.MEDIA_TYPE_URL,
|
|
|
|
"object.item.bookmarkItem": _mp_const.MEDIA_TYPE_URL,
|
|
|
|
"object.item.epgItem": _mp_const.MEDIA_TYPE_EPISODE,
|
|
|
|
"object.item.epgItem.audioProgram": _mp_const.MEDIA_TYPE_EPISODE,
|
|
|
|
"object.item.epgItem.videoProgram": _mp_const.MEDIA_TYPE_EPISODE,
|
|
|
|
"object.container": _mp_const.MEDIA_TYPE_PLAYLIST,
|
|
|
|
"object.container.person": _mp_const.MEDIA_TYPE_ARTIST,
|
|
|
|
"object.container.person.musicArtist": _mp_const.MEDIA_TYPE_ARTIST,
|
|
|
|
"object.container.playlistContainer": _mp_const.MEDIA_TYPE_PLAYLIST,
|
|
|
|
"object.container.album": _mp_const.MEDIA_TYPE_ALBUM,
|
|
|
|
"object.container.album.musicAlbum": _mp_const.MEDIA_TYPE_ALBUM,
|
|
|
|
"object.container.album.photoAlbum": _mp_const.MEDIA_TYPE_ALBUM,
|
|
|
|
"object.container.genre": _mp_const.MEDIA_TYPE_GENRE,
|
|
|
|
"object.container.genre.musicGenre": _mp_const.MEDIA_TYPE_GENRE,
|
|
|
|
"object.container.genre.movieGenre": _mp_const.MEDIA_TYPE_GENRE,
|
|
|
|
"object.container.channelGroup": _mp_const.MEDIA_TYPE_CHANNELS,
|
|
|
|
"object.container.channelGroup.audioChannelGroup": _mp_const.MEDIA_TYPE_CHANNELS,
|
|
|
|
"object.container.channelGroup.videoChannelGroup": _mp_const.MEDIA_TYPE_CHANNELS,
|
|
|
|
"object.container.epgContainer": _mp_const.MEDIA_TYPE_TVSHOW,
|
|
|
|
"object.container.storageSystem": _mp_const.MEDIA_TYPE_PLAYLIST,
|
|
|
|
"object.container.storageVolume": _mp_const.MEDIA_TYPE_PLAYLIST,
|
|
|
|
"object.container.storageFolder": _mp_const.MEDIA_TYPE_PLAYLIST,
|
|
|
|
"object.container.bookmarkFolder": _mp_const.MEDIA_TYPE_PLAYLIST,
|
|
|
|
}
|