媒体播放器实体
支持的功能
支持的功能通过使用 MediaPlayerEntityFeature 枚举中的值来定义
和 使用按位或 (|) 运算符进行组合。
状态
媒体播放器的状态是通过使用 MediaPlayerState 枚举中的值来定义的,并且可以采用以下可能的值。
Note
媒体播放器在待机状态下无法控制的情况很常见。如果 Home Assistant 可以使用其他协议或方法打开设备,即使用于控制设备的主通道当前不可用,它也应显示为 off。如果 Home Assistant 无法打开设备,则应显示为 unavailable。有关更多详细信息,请参阅实体不可用的异常。
方法
播放媒体
告诉媒体播放器播放媒体。使用以下方法实现它:
class MyMediaPlayer(MediaPlayerEntity):
def play_media(
self,
media_type: str,
media_id: str,
enqueue: MediaPlayerEnqueue | None = None,
announce: bool | None = None, **kwargs: Any
) -> None:
"""Play a piece of media."""
async def async_play_media(
self,
media_type: str,
media_id: str,
enqueue: MediaPlayerEnqueue | None = None,
announce: bool | None = None, **kwargs: Any
) -> None:
"""Play a piece of media."""
enqueue 属性是字符串枚举 MediaPlayerEnqueue:
add:将给定媒体项添加到队列末尾
next:接下来播放给定的媒体项目,保持队列
play:立即播放给定的媒体项目,保持队列
replace:立即播放给定的媒体项目,清除队列
当 announce 布尔属性设置为 true 时,媒体播放器应尝试暂停当前音乐,向用户宣布媒体,然后恢复音乐。
浏览媒体
如果媒体播放器支持浏览媒体,则应实现以下方法:
class MyMediaPlayer(MediaPlayerEntity):
async def async_browse_media(
self, media_content_type: str | None = None, media_content_id: str | None = None
) -> BrowseMedia:
"""Implement the websocket media browsing helper."""
return await media_source.async_browse_media(
self.hass,
media_content_id,
content_filter=lambda item: item.media_content_type.startswith("audio/"),
)
如果媒体播放器还允许从 URL 播放媒体,您还可以添加对浏览的支持
Home Assistant 媒体源。这些来源可以通过任何集成来提供。示例提供
文本转语音和本地媒体。
from homeassistant.components import media_source
from homeassistant.components.media_player.browse_media import (
async_process_play_media_url,
)
class MyMediaPlayer(MediaPlayerEntity):
async def async_browse_media(
self, media_content_type: str | None = None, media_content_id: str | None = None
) -> BrowseMedia:
"""Implement the websocket media browsing helper."""
# If your media player has no own media sources to browse, route all browse commands
# to the media source integration.
return await media_source.async_browse_media(
self.hass,
media_content_id,
# This allows filtering content. In this case it will only show audio sources.
content_filter=lambda item: item.media_content_type.startswith("audio/"),
)
async def async_play_media(
self,
media_type: str,
media_id: str,
enqueue: MediaPlayerEnqueue | None = None,
announce: bool | None = None, **kwargs: Any
) -> None:
"""Play a piece of media."""
if media_source.is_media_source_id(media_id):
media_type = MediaType.MUSIC
play_item = await media_source.async_resolve_media(self.hass, media_id, self.entity_id)
# play_item returns a relative URL if it has to be resolved on the Home Assistant host
# This call will turn it into a full URL
media_id = async_process_play_media_url(self.hass, play_item.url)
# Replace this with calling your media player play media function.
await self._media_player.play_url(media_id)
搜索媒体
如果媒体播放器支持搜索媒体,则应实现以下方法:
class MyMediaPlayer(MediaPlayerEntity):
async def async_search_media(
self,
query: SearchMediaQuery,
) -> SearchMedia:
"""Search the media player."""
# search for the requested media on your library client.
result = await my_client.search(query=query.search_query)
return SearchMedia(result=result)
SearchMediaQuery 是一个具有以下属性的数据类:
选择声音模式
可选。切换媒体播放器的声音模式。
class MyMediaPlayer(MediaPlayerEntity):
# Implement one of these methods.
def select_sound_mode(self, sound_mode):
"""Switch the sound mode of the entity."""
def async_select_sound_mode(self, sound_mode):
"""Switch the sound mode of the entity."""
选择来源
可选。切换媒体播放器的选定输入源。
class MyMediaPlayer(MediaPlayerEntity):
# Implement one of these methods.
def select_source(self, source):
"""Select input source."""
def async_select_source(self, source):
"""Select input source."""
媒体类型
必需的。返回 MediaType 枚举中与媒体类型匹配的值之一
class MyMediaPlayer(MediaPlayerEntity):
# Implement the following method.
@property
def media_content_type(self):
"""Content type of current playing media."""
Info
如果集成提供的处理不映射到定义的常量,则在 play_media 服务操作中使用集成名称作为 media_content_type 也是可以接受的。
可用设备类别
可选。这是什么类型的媒体设备。它可能会映射为 Google 设备类型。
媒体浏览器的代理专辑封面
可选。如果您的媒体播放器只能从内部网络访问,则需要通过Home Assistant代理专辑封面,以便能够在外出时或通过移动应用程序工作。
要通过 Home Assistant 代理图像,请将 BrowseMedia 项目的 thumbnail 属性设置为 self.get_browse_image_url(media_content_type, media_content_id, media_image_id=None) 方法生成的 url。然后浏览器将获取此 url,这将导致对 async_get_browse_image(media_content_type, media_content_id, media_image_id=None) 的调用。
Info
如果 Web 请求源自网络外部,则仅对缩略图使用代理。您可以使用从 homeassistant.helpers.network 导入的 is_local_request(hass) 进行测试。
在 async_get_browse_image 中,使用 self._async_fetch_image(url) 从本地网络获取图像。不要使用 self._async_fetch_image_from_cache(url),它只能用于当前播放的艺术作品。
Info
不要将 URL 作为 media_image_id 传递。这可能允许攻击者从本地网络获取任何数据。
class MyMediaPlayer(MediaPlayerEntity):
# Implement the following method.
async def async_get_browse_image(self, media_content_type, media_content_id, media_image_id=None):
"""Serve album art. Returns (content, content_type)."""
image_url = ...
return await self._async_fetch_image(image_url)
将玩家实体分组在一起
可选。如果您的播放器支持将播放器实体分组在一起以进行同步播放(由 SUPPORT_GROUPING 指示),则需要定义一种加入方法和一种取消加入方法。
class MyMediaPlayer(MediaPlayerEntity):
# Implement one of these join methods:
def join_players(self, group_members):
"""Join `group_members` as a player group with the current player."""
async def async_join_players(self, group_members):
"""Join `group_members` as a player group with the current player."""
# Implement one of these unjoin methods:
def unjoin_player(self):
"""Remove this player from any group."""
async def async_unjoin_player(self):
"""Remove this player from any group."""