Add media browser integration for Home Assistant
- Implement async_browse_media() to enable browsing media folders through HA Media Browser UI - Add async_play_media() to handle file playback from media browser - Add play_media_file service for automation support - Add BROWSE_MEDIA and PLAY_MEDIA feature flags - Implement media browser API client methods (get_media_folders, browse_folder, play_media_file) - Fix path separator handling for cross-platform compatibility Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,7 @@ from homeassistant.helpers import config_validation as cv
|
||||
|
||||
from .api_client import MediaServerClient, MediaServerError
|
||||
from .const import (
|
||||
ATTR_FILE_PATH,
|
||||
ATTR_SCRIPT_ARGS,
|
||||
ATTR_SCRIPT_NAME,
|
||||
CONF_HOST,
|
||||
@@ -21,6 +22,7 @@ from .const import (
|
||||
CONF_TOKEN,
|
||||
DOMAIN,
|
||||
SERVICE_EXECUTE_SCRIPT,
|
||||
SERVICE_PLAY_MEDIA_FILE,
|
||||
)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@@ -37,6 +39,13 @@ SERVICE_EXECUTE_SCRIPT_SCHEMA = vol.Schema(
|
||||
}
|
||||
)
|
||||
|
||||
# Service schema for play_media_file
|
||||
SERVICE_PLAY_MEDIA_FILE_SCHEMA = vol.Schema(
|
||||
{
|
||||
vol.Required(ATTR_FILE_PATH): cv.string,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
"""Set up Remote Media Player from a config entry.
|
||||
@@ -111,6 +120,29 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
schema=SERVICE_EXECUTE_SCRIPT_SCHEMA,
|
||||
)
|
||||
|
||||
# Register play_media_file service if not already registered
|
||||
if not hass.services.has_service(DOMAIN, SERVICE_PLAY_MEDIA_FILE):
|
||||
async def async_play_media_file(call: ServiceCall) -> None:
|
||||
"""Handle play_media_file service call."""
|
||||
file_path = call.data[ATTR_FILE_PATH]
|
||||
_LOGGER.debug("Service play_media_file called with path: %s", file_path)
|
||||
|
||||
# Execute on all configured media server instances
|
||||
for entry_id, data in hass.data[DOMAIN].items():
|
||||
client: MediaServerClient = data["client"]
|
||||
try:
|
||||
await client.play_media_file(file_path)
|
||||
_LOGGER.info("Started playback of %s on %s", file_path, entry_id)
|
||||
except MediaServerError as err:
|
||||
_LOGGER.error("Failed to play %s on %s: %s", file_path, entry_id, err)
|
||||
|
||||
hass.services.async_register(
|
||||
DOMAIN,
|
||||
SERVICE_PLAY_MEDIA_FILE,
|
||||
async_play_media_file,
|
||||
schema=SERVICE_PLAY_MEDIA_FILE_SCHEMA,
|
||||
)
|
||||
|
||||
# Forward setup to platforms
|
||||
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
|
||||
|
||||
@@ -149,6 +181,7 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||
# Remove services if this was the last entry
|
||||
if not hass.data[DOMAIN]:
|
||||
hass.services.async_remove(DOMAIN, SERVICE_EXECUTE_SCRIPT)
|
||||
hass.services.async_remove(DOMAIN, SERVICE_PLAY_MEDIA_FILE)
|
||||
|
||||
return unload_ok
|
||||
|
||||
|
||||
Reference in New Issue
Block a user