mirror of
https://github.com/home-assistant/core.git
synced 2026-08-24 10:13:52 -05:00
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: balloob <1444314+balloob@users.noreply.github.com> Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
"""Services for the Jellyfin integration."""
|
|
|
|
from typing import Any
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.media_player import (
|
|
ATTR_MEDIA,
|
|
ATTR_MEDIA_CONTENT_ID,
|
|
DOMAIN as MP_DOMAIN,
|
|
MediaPlayerEntityFeature,
|
|
)
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import config_validation as cv, service
|
|
|
|
from .const import DOMAIN
|
|
|
|
JELLYFIN_PLAY_MEDIA_SHUFFLE_SCHEMA = {
|
|
vol.Required(ATTR_MEDIA_CONTENT_ID): cv.string,
|
|
}
|
|
|
|
|
|
def _promote_media_fields(data: dict[str, Any]) -> dict[str, Any]:
|
|
"""If 'media' key exists, promote its fields to the top level."""
|
|
if ATTR_MEDIA in data and isinstance(data[ATTR_MEDIA], dict):
|
|
if ATTR_MEDIA_CONTENT_ID in data:
|
|
raise vol.Invalid(
|
|
"Play media cannot contain both"
|
|
f" '{ATTR_MEDIA}' and"
|
|
f" '{ATTR_MEDIA_CONTENT_ID}'"
|
|
)
|
|
media_data = data[ATTR_MEDIA]
|
|
|
|
if ATTR_MEDIA_CONTENT_ID in media_data:
|
|
data[ATTR_MEDIA_CONTENT_ID] = media_data[ATTR_MEDIA_CONTENT_ID]
|
|
|
|
del data[ATTR_MEDIA]
|
|
return data
|
|
|
|
|
|
async def async_setup_services(hass: HomeAssistant) -> None:
|
|
"""Set up services for the Jellyfin component."""
|
|
|
|
service.async_register_platform_entity_service(
|
|
hass,
|
|
DOMAIN,
|
|
"play_media_shuffle",
|
|
entity_domain=MP_DOMAIN,
|
|
schema=vol.All(
|
|
_promote_media_fields,
|
|
cv.make_entity_service_schema(JELLYFIN_PLAY_MEDIA_SHUFFLE_SCHEMA),
|
|
),
|
|
func="play_media_shuffle",
|
|
required_features=MediaPlayerEntityFeature.PLAY_MEDIA,
|
|
)
|