From 112d232c2e2240acc895dee8da4fa17c7b38c3f3 Mon Sep 17 00:00:00 2001 From: jjlawren Date: Tue, 29 Mar 2022 04:08:26 -0500 Subject: [PATCH] Autoresume in-progress items from Plex media browser (#68494) --- .../components/plex/media_browser.py | 17 ++++++++++---- homeassistant/components/plex/services.py | 4 ++++ tests/components/plex/fixtures/media_1.xml | 2 +- tests/components/plex/test_browse_media.py | 2 ++ tests/components/plex/test_playback.py | 16 +++++++++++++ tests/components/plex/test_services.py | 23 ++++++++++++++++++- 6 files changed, 58 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/plex/media_browser.py b/homeassistant/components/plex/media_browser.py index 4b2bb502d69..1df624e265b 100644 --- a/homeassistant/components/plex/media_browser.py +++ b/homeassistant/components/plex/media_browser.py @@ -66,7 +66,7 @@ def browse_media( # noqa: C901 if media_content_type in ("plex_root", None): return root_payload(hass, is_internal, platform=platform) - def item_payload(item, short_name=False): + def item_payload(item, short_name=False, extra_params=None): """Create response payload for a single media item.""" try: media_class = ITEM_TYPE_MEDIA_CLASS[item.type] @@ -75,7 +75,9 @@ def browse_media( # noqa: C901 payload = { "title": pretty_title(item, short_name), "media_class": media_class, - "media_content_id": generate_plex_uri(server_id, item.ratingKey), + "media_content_id": generate_plex_uri( + server_id, item.ratingKey, params=extra_params + ), "media_content_type": item.type, "can_play": True, "can_expand": item.type in EXPANDABLES, @@ -209,7 +211,13 @@ def browse_media( # noqa: C901 continue payload["children"].append(station_payload(item)) else: - payload["children"].append(item_payload(item)) + extra_params = None + hub_context = hub.context.split(".")[-1] + if hub_context in ("continue", "inprogress", "ondeck"): + extra_params = {"resume": 1} + payload["children"].append( + item_payload(item, extra_params=extra_params) + ) return BrowseMedia(**payload) if special_folder: @@ -279,7 +287,7 @@ def browse_media( # noqa: C901 return response -def generate_plex_uri(server_id, media_id): +def generate_plex_uri(server_id, media_id, params=None): """Create a media_content_id URL for playable Plex media.""" if isinstance(media_id, int): media_id = str(media_id) @@ -290,6 +298,7 @@ def generate_plex_uri(server_id, media_id): scheme=DOMAIN, host=server_id, path=media_id, + query=params, ) ) diff --git a/homeassistant/components/plex/services.py b/homeassistant/components/plex/services.py index 5a6dd657942..8cf714b8823 100644 --- a/homeassistant/components/plex/services.py +++ b/homeassistant/components/plex/services.py @@ -112,6 +112,7 @@ def process_plex_payload( ) -> PlexMediaSearchResult: """Look up Plex media using media_player.play_media service payloads.""" plex_server = default_plex_server + extra_params = {} if content_id.startswith(PLEX_URI_SCHEME + "{"): # Handle the special payload of 'plex://{}' @@ -132,6 +133,7 @@ def process_plex_payload( else: # Handle legacy payloads without server_id in URL host position content = int(plex_url.host) # type: ignore[arg-type] + extra_params = dict(plex_url.query) else: content = json.loads(content_id) @@ -152,6 +154,8 @@ def process_plex_payload( content = {"plex_key": content} content_type = DOMAIN + content.update(extra_params) + if playqueue_id := content.pop("playqueue_id", None): if not supports_playqueues: raise HomeAssistantError("Plex playqueues are not supported on this device") diff --git a/tests/components/plex/fixtures/media_1.xml b/tests/components/plex/fixtures/media_1.xml index 838afb2959c..7392eaeef92 100644 --- a/tests/components/plex/fixtures/media_1.xml +++ b/tests/components/plex/fixtures/media_1.xml @@ -1,4 +1,4 @@ -