1 """Support for media browsing."""
3 from __future__
import annotations
5 from typing
import NamedTuple
7 from xbox.webapi.api.client
import XboxLiveClient
8 from xbox.webapi.api.provider.catalog.const
import HOME_APP_IDS, SYSTEM_PFN_ID_MAP
9 from xbox.webapi.api.provider.catalog.models
import (
15 from xbox.webapi.api.provider.smartglass.models
import (
17 InstalledPackagesList,
24 """Details for media type."""
43 client: XboxLiveClient,
46 media_content_type: str,
47 media_content_id: str,
48 ) -> BrowseMedia |
None:
49 """Create response payload for the provided media query."""
50 apps: InstalledPackagesList = await client.smartglass.get_installed_apps(device_id)
52 if media_content_type
in (
None,
"library"):
53 children: list[BrowseMedia] = []
55 media_class=MediaClass.DIRECTORY,
56 media_content_id=
"library",
57 media_content_type=
"library",
58 title=
"Installed Applications",
65 id_type = AlternateIdType.LEGACY_XBOX_PRODUCT_ID
66 home_catalog: CatalogResponse = (
67 await client.catalog.get_product_from_alternate_id(
68 HOME_APP_IDS[id_type], id_type
72 home_catalog.products[0].localized_properties[0].images
76 media_class=MediaClass.APP,
77 media_content_id=
"Home",
78 media_content_type=MediaType.APP,
82 thumbnail=
None if home_thumb
is None else home_thumb.uri,
88 tv_catalog: CatalogResponse = (
89 await client.catalog.get_product_from_alternate_id(
90 SYSTEM_PFN_ID_MAP[
"Microsoft.Xbox.LiveTV_8wekyb3d8bbwe"][id_type],
95 tv_catalog.products[0].localized_properties[0].images
99 media_class=MediaClass.APP,
100 media_content_id=
"TV",
101 media_content_type=MediaType.APP,
105 thumbnail=
None if tv_thumb
is None else tv_thumb.uri,
109 content_types = sorted(
110 {app.content_type
for app
in apps.result
if app.content_type
in TYPE_MAP}
114 media_class=MediaClass.DIRECTORY,
115 media_content_id=c_type,
116 media_content_type=TYPE_MAP[c_type].type,
120 children_media_class=TYPE_MAP[c_type].cls,
122 for c_type
in content_types
127 app_details = await client.catalog.get_products(
129 app.one_store_product_id
130 for app
in apps.result
131 if app.content_type == media_content_id
and app.one_store_product_id
133 FieldsTemplate.BROWSE,
137 prod.product_id: prod.localized_properties[0].images
138 for prod
in app_details.products
142 media_class=MediaClass.DIRECTORY,
143 media_content_id=media_content_id,
144 media_content_type=media_content_type,
145 title=f
"{media_content_id}s",
150 for app
in apps.result
151 if app.content_type == media_content_id
and app.one_store_product_id
153 children_media_class=TYPE_MAP[media_content_id].cls,
157 def item_payload(item: InstalledPackage, images: dict[str, list[Image]]):
158 """Create response payload for a single media item."""
161 if image
is not None:
162 thumbnail = image.uri
163 if thumbnail[0] ==
"/":
164 thumbnail = f
"https:{thumbnail}"
167 media_class=TYPE_MAP[item.content_type].cls,
168 media_content_id=item.one_store_product_id,
169 media_content_type=TYPE_MAP[item.content_type].type,
178 purpose_order = [
"Poster",
"Tile",
"Logo",
"BoxArt"]
179 for purpose
in purpose_order:
181 if image.image_purpose == purpose
and image.width >= 300: