Support playback of videos in Fully Kiosk Browser (#119496)

pull/121623/head
tronikos 2024-06-22 03:05:39 -07:00 committed by GitHub
parent 1bbfe7854f
commit 9002d85f9b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 82 additions and 3 deletions

View File

@ -14,6 +14,7 @@ from homeassistant.components.media_player import (
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import AUDIOMANAGER_STREAM_MUSIC, DOMAIN, MEDIA_SUPPORT_FULLYKIOSK
@ -54,13 +55,33 @@ class FullyMediaPlayer(FullyKioskEntity, MediaPlayerEntity):
)
media_id = async_process_play_media_url(self.hass, play_item.url)
await self.coordinator.fully.playSound(media_id, AUDIOMANAGER_STREAM_MUSIC)
if media_type.startswith("audio/"):
media_type = MediaType.MUSIC
elif media_type.startswith("video/"):
media_type = MediaType.VIDEO
if media_type == MediaType.MUSIC:
self._attr_media_content_type = MediaType.MUSIC
await self.coordinator.fully.playSound(media_id, AUDIOMANAGER_STREAM_MUSIC)
elif media_type == MediaType.VIDEO:
self._attr_media_content_type = MediaType.VIDEO
await self.coordinator.fully.sendCommand(
"playVideo",
url=media_id,
stream=AUDIOMANAGER_STREAM_MUSIC,
showControls=1,
exitOnCompletion=1,
)
else:
raise HomeAssistantError(f"Unsupported media type {media_type}")
self._attr_state = MediaPlayerState.PLAYING
self.async_write_ha_state()
async def async_media_stop(self) -> None:
"""Stop playing media."""
await self.coordinator.fully.stopSound()
if self._attr_media_content_type == MediaType.VIDEO:
await self.coordinator.fully.sendCommand("stopVideo")
else:
await self.coordinator.fully.stopSound()
self._attr_state = MediaPlayerState.IDLE
self.async_write_ha_state()
@ -81,7 +102,8 @@ class FullyMediaPlayer(FullyKioskEntity, MediaPlayerEntity):
return await media_source.async_browse_media(
self.hass,
media_content_id,
content_filter=lambda item: item.media_content_type.startswith("audio/"),
content_filter=lambda item: item.media_content_type.startswith("audio/")
or item.media_content_type.startswith("video/"),
)
@callback

View File

@ -2,11 +2,14 @@
from unittest.mock import MagicMock, Mock, patch
import pytest
from homeassistant.components import media_player
from homeassistant.components.fully_kiosk.const import DOMAIN, MEDIA_SUPPORT_FULLYKIOSK
from homeassistant.components.media_source import DOMAIN as MS_DOMAIN
from homeassistant.const import ATTR_ENTITY_ID
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.setup import async_setup_component
@ -97,6 +100,60 @@ async def test_media_player(
assert device_entry.sw_version == "1.42.5"
@pytest.mark.parametrize("media_content_type", ["video", "video/mp4"])
async def test_media_player_video(
hass: HomeAssistant,
mock_fully_kiosk: MagicMock,
init_integration: MockConfigEntry,
media_content_type: str,
) -> None:
"""Test Fully Kiosk media player for videos."""
await hass.services.async_call(
media_player.DOMAIN,
"play_media",
{
ATTR_ENTITY_ID: "media_player.amazon_fire",
"media_content_type": media_content_type,
"media_content_id": "test.mp4",
},
blocking=True,
)
assert len(mock_fully_kiosk.sendCommand.mock_calls) == 1
mock_fully_kiosk.sendCommand.assert_called_with(
"playVideo", url="test.mp4", stream=3, showControls=1, exitOnCompletion=1
)
await hass.services.async_call(
media_player.DOMAIN,
"media_stop",
{
ATTR_ENTITY_ID: "media_player.amazon_fire",
},
blocking=True,
)
mock_fully_kiosk.sendCommand.assert_called_with("stopVideo")
async def test_media_player_unsupported(
hass: HomeAssistant,
mock_fully_kiosk: MagicMock,
init_integration: MockConfigEntry,
) -> None:
"""Test Fully Kiosk media player for unsupported media."""
with pytest.raises(HomeAssistantError) as error:
await hass.services.async_call(
media_player.DOMAIN,
"play_media",
{
ATTR_ENTITY_ID: "media_player.amazon_fire",
"media_content_type": "playlist",
"media_content_id": "test.m4u",
},
blocking=True,
)
assert error.value.args[0] == "Unsupported media type playlist"
async def test_browse_media(
hass: HomeAssistant,
hass_ws_client: WebSocketGenerator,