1 """Implementation of DLNA DMS as a media source.
3 URIs look like "media-source://dlna_dms/<source_id>/<media_identifier>"
5 Media identifiers can look like:
6 * `/path/to/file`: slash-separated path through the Content Directory
7 * `:ObjectID`: colon followed by a server-assigned ID for an object
8 * `?query`: question mark followed by a query string to search for,
9 see [DLNA ContentDirectory SearchCriteria](http://www.upnp.org/specs/av/UPnP-av-ContentDirectory-v1-Service.pdf)
13 from __future__
import annotations
24 from .const
import DOMAIN, LOGGER, PATH_OBJECT_ID_FLAG, ROOT_OBJECT_ID, SOURCE_SEP
25 from .dms
import DidlPlayMedia, get_domain_data
29 """Set up DLNA DMS media source."""
30 LOGGER.debug(
"Setting up DLNA media sources")
35 """Provide DLNA Media Servers as media sources."""
39 def __init__(self, hass: HomeAssistant) ->
None:
40 """Initialize DLNA source."""
46 """Resolve a media item to a playable item."""
48 if not dms_data.sources:
49 raise Unresolvable(
"No sources have been configured")
53 raise Unresolvable(f
"No source ID in {item.identifier}")
55 raise Unresolvable(f
"No media ID in {item.identifier}")
58 source = dms_data.sources[source_id]
59 except KeyError
as err:
60 raise Unresolvable(f
"Unknown source ID: {source_id}")
from err
62 return await source.async_resolve_media(media_id)
67 if not dms_data.sources:
68 raise BrowseError(
"No sources have been configured")
71 LOGGER.debug(
"Browsing for %s / %s", source_id, media_id)
73 if not source_id
and len(dms_data.sources) > 1:
76 base = BrowseMediaSource(
79 media_class=MediaClass.DIRECTORY,
80 media_content_type=MediaType.CHANNELS,
84 children_media_class=MediaClass.CHANNEL,
90 identifier=f
"{source_id}/{PATH_OBJECT_ID_FLAG}{ROOT_OBJECT_ID}",
91 media_class=MediaClass.CHANNEL,
92 media_content_type=MediaType.CHANNEL,
96 thumbnail=source.icon,
98 for source_id, source
in dms_data.sources.items()
105 source_id = next(iter(dms_data.sources))
108 source = dms_data.sources[source_id]
109 except KeyError
as err:
110 raise BrowseError(f
"Unknown source ID: {source_id}")
from err
112 return await source.async_browse_media(media_id)
116 """Parse the source_id and media identifier from a media source item."""
117 if not item.identifier:
119 source_id, _, media_id = item.identifier.partition(SOURCE_SEP)
120 return source_id
or None, media_id
or None
DlnaDmrData get_domain_data(HomeAssistant hass)