1 """Support for media browsing."""
5 from afsapi
import AFSAPI, FSApiException, OutOfRangeException, Preset
14 from .const
import MEDIA_CONTENT_ID_CHANNELS, MEDIA_CONTENT_ID_PRESET
16 TOP_LEVEL_DIRECTORIES = {
17 MEDIA_CONTENT_ID_CHANNELS:
"Channels",
18 MEDIA_CONTENT_ID_PRESET:
"Presets",
21 FSAPI_ITEM_TYPE_TO_MEDIA_CLASS = {
22 0: MediaClass.DIRECTORY,
23 1: MediaClass.CHANNEL,
24 2: MediaClass.CHANNEL,
27 _LOGGER = logging.getLogger(__name__)
31 """Create response payload for a single media item.
33 Used by async_browse_media.
37 media_class=MediaClass.CHANNEL,
38 media_content_type=MediaType.CHANNEL,
41 media_content_id=f
"{player_mode}/{MEDIA_CONTENT_ID_PRESET}/{int(preset.key)+1}",
48 key, item: dict[str, str], player_mode: str, parent_keys: list[str]
50 """Create response payload for a single media item.
52 Used by async_browse_media.
54 assert "label" in item
or "name" in item
57 title = item.get(
"label")
or item.get(
"name")
or "Unknown"
60 media_content_id =
"/".join(
61 [player_mode, MEDIA_CONTENT_ID_CHANNELS, *parent_keys, key]
64 FSAPI_ITEM_TYPE_TO_MEDIA_CLASS.get(
int(item[
"type"]))
or MediaClass.CHANNEL
69 media_class=media_class,
70 media_content_type=MediaClass.CHANNEL,
71 media_content_id=media_content_id,
72 can_play=(media_class != MediaClass.DIRECTORY),
73 can_expand=(media_class == MediaClass.DIRECTORY),
78 """Create response payload to describe contents of a specific library.
80 Used by async_browse_media.
86 media_class=MediaClass.DIRECTORY,
87 media_content_type=MediaType.CHANNELS,
89 f
"{current_mode or 'unknown'}/{top_level_media_content_id}"
94 for top_level_media_content_id, name
in TOP_LEVEL_DIRECTORIES.items()
98 media_class=MediaClass.DIRECTORY,
99 media_content_id=
"library",
100 media_content_type=MediaType.CHANNELS,
101 title=
"Media Library",
105 children_media_class=MediaClass.DIRECTORY,
114 """List the contents of a navigation directory (or preset list)."""
116 player_mode, browse_type, *parent_keys = media_content_id.split(
"/")
118 title = TOP_LEVEL_DIRECTORIES.get(browse_type,
"Unknown")
122 if browse_type == MEDIA_CONTENT_ID_PRESET:
127 for preset
in await afsapi.get_presets()
132 await afsapi.nav_select_folder_via_path(parent_keys)
136 _item_payload(key, item, player_mode, parent_keys=parent_keys)
137 async
for key, item
in await afsapi.nav_list()
139 except OutOfRangeException
as err:
140 raise BrowseError(
"The requested item is out of range")
from err
141 except FSApiException
as err:
142 raise BrowseError(
str(err))
from err
146 media_content_id=media_content_id,
147 media_content_type=MediaType.CHANNELS,
148 media_class=MediaClass.DIRECTORY,
152 children_media_class=MediaType.CHANNEL,