Files
HomeAssistance/custom_components/spotifyplus/intent.py
T
2026-06-05 22:34:31 -04:00

201 lines
8.5 KiB
Python

"""Intents for the spotifyplus integration."""
from typing import IO
from homeassistant.core import HomeAssistant
from homeassistant.helpers.intent import (
IntentHandler,
async_register as intent_async_register,
)
from homeassistant.util.json import JsonObjectType, json_loads_object
from home_assistant_intents import (
_DATA_DIR as HA_BUILT_IN_INTENTS_DATA_DIR,
get_intents,
)
from custom_components.spotifyplus.const import PLATFORM_SPOTIFYPLUS
from .appmessages import STAppMessages
from .intent_handlers import *
from .intent_loader import IntentLoader
import logging
_LOGGER = logging.getLogger(__name__)
# get smartinspect logger reference; create a new session for this module name.
from smartinspectpython.siauto import SIAuto, SILevel, SISession, SIMethodParmListContext, SIColors
_logsi:SISession = SIAuto.Si.GetSession(__name__)
if (_logsi == None):
_logsi = SIAuto.Si.AddSession(__name__, True)
_logsi.SystemLogger = _LOGGER
def json_load(fp: IO[str]) -> JsonObjectType:
"""Wrap json_loads for get_intents."""
return json_loads_object(fp.read())
async def async_setup_intents(hass: HomeAssistant) -> None:
"""
Set up voice assist intents.
Called by HA to register all intents that this integration supports.
Args:
hass (HomeAssistant):
HomeAssistant instance.
"""
try:
# trace.
_logsi.EnterMethod(SILevel.Debug, colorValue=SIColors.Khaki)
_logsi.LogVerbose("Component async_setup_intents starting", colorValue=SIColors.Khaki)
# get slot list of spotifyplus media player names and any defined aliases.
#player_name_list = await async_get_slot_list_player_name(hass)
# create intent loader instance.
# in our case, we will only load OUR platform intent data.
intentLoader:IntentLoader = IntentLoader(hass, PLATFORM_SPOTIFYPLUS)
# register all intents this component provides.
register_intent_handler(hass, SpotifyPlusFavoriteAddRemove_Handler(intentLoader))
register_intent_handler(hass, SpotifyPlusGetInfoArtistBio_Handler(intentLoader))
register_intent_handler(hass, SpotifyPlusGetNowPlayingInfo_Handler(intentLoader))
register_intent_handler(hass, SpotifyPlusPlayerDeckControl_Handler(intentLoader))
register_intent_handler(hass, SpotifyPlusPlayerSetRepeatMode_Handler(intentLoader))
register_intent_handler(hass, SpotifyPlusPlayerSetShuffleMode_Handler(intentLoader))
register_intent_handler(hass, SpotifyPlusPlayerTransferPlayback_Handler(intentLoader))
register_intent_handler(hass, SpotifyPlusPlayerVolumeControl_Handler(intentLoader))
register_intent_handler(hass, SpotifyPlusPlaylistCreate_Handler(intentLoader))
register_intent_handler(hass, SpotifyPlusSearchPlayControl_Handler(intentLoader))
# start listening for conversation.reload service call events.
await intentLoader.async_register_cache_reload_listener()
# # trace.
# # log information about built-in intents for this language variant.
# if (_logsi.IsOn(SILevel.Verbose)):
# try:
# _logsi.LogVerbose("Component - loading HA built-in intents from data path: \"%s\"" % HA_BUILT_IN_INTENTS_DATA_DIR, colorValue=SIColors.Khaki)
# language_variant = hass.config.language or "en"
# lang_variant_intents = await hass.async_add_executor_job(
# get_intents, language_variant, json_load
# )
# if lang_variant_intents:
# _logsi.LogDictionary(SILevel.Verbose, "Component - HA built-in intents (dictionary)", lang_variant_intents, prettyPrint=True, colorValue=SIColors.Khaki)
# else:
# _logsi.LogVerbose("Component - HA built-in intents not found for language variant: \"%s\"" % language_variant, colorValue=SIColors.Khaki)
# except Exception as ex:
# # log exception, but not to system logger as HA will take care of it.
# _logsi.LogException("Could not load HA built-in intents!", ex, logToSystemLogger=False, colorValue=SIColors.Khaki)
# indicate success.
_logsi.LogVerbose("Component async_setup_intents complete", colorValue=SIColors.Khaki)
return True
except Exception as ex:
# log exception, but not to system logger as HA will take care of it.
_logsi.LogException("Component async_setup_intents exception", ex, logToSystemLogger=False, colorValue=SIColors.Khaki)
raise
finally:
# trace.
_logsi.LeaveMethod(SILevel.Debug, colorValue=SIColors.Khaki)
def register_intent_handler(
hass: HomeAssistant,
intentObj:IntentHandler,
) -> None:
"""
Registers a voice assist intent, and trace logs the object.
"""
# register single intent this component provides.
_logsi.LogObject(SILevel.Verbose, STAppMessages.MSG_INTENT_HANDLER_REGISTER % intentObj.intent_type, intentObj, colorValue=SIColors.Khaki)
intent_async_register(hass, intentObj)
# async def async_get_slot_list_player_name(
# hass: HomeAssistant,
# ) -> object:
# """
# Builds a slot list of spotifyplus media player names and any defined aliases
# made via the HA Voice Assist UI.
# """
# try:
# # trace.
# _logsi.EnterMethod(SILevel.Debug, colorValue=SIColors.Khaki)
# _logsi.LogVerbose("Component async_get_list_player_name starting", colorValue=SIColors.Khaki)
# # prepare to access the entity registry.
# er = async_get(hass)
# slot_values: list[dict[str, Any]] = []
# # process all registry entities for spotifyplus media_player names and aliases.
# entityObj:RegistryEntry
# for entityObj in er.entities.values():
# # is this a spotifyplus media player?
# if (entityObj.domain == DOMAIN_MEDIA_PLAYER) and (entityObj.platform == PLATFORM_SPOTIFYPLUS) and (entityObj.disabled == False):
# #_logsi.LogObject(SILevel.Verbose, "Entity object: %s" % entityObj.entity_id, entityObj)
# entity_id = entityObj.entity_id
# friendly_name = entityObj.name or entityObj.original_name
# # include entity id without the underscores.
# slot_entry = {
# "in": entityObj.entity_id.split(".")[1].replace("_"," "),
# "out": entity_id,
# }
# slot_values.append(slot_entry)
# _logsi.LogDictionary(SILevel.Verbose, "Adding entity id without the underscores: %s = %s" % (entity_id, slot_entry["in"]), slot_entry, colorValue=SIColors.Khaki)
# # include primary name.
# if friendly_name:
# slot_entry = {
# "in": friendly_name.lower(),
# "out": entity_id,
# }
# if slot_entry not in slot_values:
# slot_values.append(slot_entry)
# _logsi.LogDictionary(SILevel.Verbose, "Adding entity primary name: %s = %s" % (entity_id, slot_entry["in"]), slot_entry, colorValue=SIColors.Khaki)
# # include aliases defined in voice assist ui.
# if hasattr(entityObj, "aliases") and entityObj.aliases:
# for alias in entityObj.aliases:
# slot_entry = {
# "in": alias.lower(),
# "out": entity_id,
# }
# if slot_entry not in slot_values:
# slot_values.append(slot_entry)
# _logsi.LogDictionary(SILevel.Verbose, "Adding entity voice ui alias: %s = %s" % (entity_id, slot_entry["in"]), slot_entry, colorValue=SIColors.Khaki)
# # trace.
# _logsi.LogArray(SILevel.Verbose, "Component async_get_list_player_name result (array)", slot_values, colorValue=SIColors.Khaki)
# # return value to caller.
# return {
# "player_name": { # slot name
# "values": slot_values
# }
# }
# except Exception as ex:
# # log exception, but not to system logger as HA will take care of it.
# _logsi.LogException("Component async_get_list_player_name exception", ex, logToSystemLogger=False)
# # ignore exceptions
# finally:
# # trace.
# _logsi.LeaveMethod(SILevel.Debug, colorValue=SIColors.Khaki)