129 lines
4.6 KiB
Python
129 lines
4.6 KiB
Python
"""Constants for the Nvidia Shield integration."""
|
|
|
|
# Re-export shared Media DAG constants
|
|
from .ha_adb_common.const import ( # noqa: F401
|
|
ATTR_MEDIA_DAG_JELLYFIN_ENTITY,
|
|
ATTR_MEDIA_DAG_NOW_PLAYING,
|
|
ATTR_MEDIA_DAG_RECEIVER_ENTITY,
|
|
ATTR_MEDIA_DAG_RECEIVER_INPUT,
|
|
ATTR_MEDIA_DAG_ROLE,
|
|
ATTR_MEDIA_DAG_RUNNING_APPS,
|
|
)
|
|
|
|
DOMAIN = "nvidia_shield"
|
|
|
|
CONF_ANDROIDTV_ENTITY = "androidtv_entity"
|
|
CONF_JELLYFIN_ENTITY = "jellyfin_entity"
|
|
CONF_RECEIVER_ENTITY = "receiver_entity"
|
|
CONF_RECEIVER_INPUT = "receiver_input"
|
|
CONF_POWER_ENTITY = "power_entity"
|
|
CONF_ADB_ENABLED = "adb_enabled"
|
|
CONF_ADB_STORE_APP_INFO = "adb_store_app_info"
|
|
CONF_ADB_HOST = "adb_host"
|
|
CONF_ADB_PORT = "adb_port"
|
|
|
|
# Remote-protocol transport (androidtvremote2) — Phase 2
|
|
CONF_PROTOCOL_ENABLED = "protocol_enabled"
|
|
CONF_PROTOCOL_HOST = "protocol_host"
|
|
CONF_PAIRING_CODE = "pairing_code"
|
|
DEFAULT_PROTOCOL_API_PORT = 6466
|
|
DEFAULT_PROTOCOL_PAIR_PORT = 6467
|
|
|
|
ADB_POLL_INTERVAL = 10 # seconds
|
|
ADB_RETRY_INTERVAL = 300 # seconds before retrying a failed ADB connection
|
|
DEFAULT_ADB_PORT = 5555
|
|
|
|
# Persistent-connection manager timing (Phase 1, docs/MVP_PLAN.md §2):
|
|
# watchdog reconnects with exponential backoff + jitter; ADB-derived store
|
|
# fields expire (B5) instead of clinging to stale values.
|
|
ADB_RECONNECT_BACKOFF_START = 5 # seconds before the first reconnect retry
|
|
ADB_RECONNECT_BACKOFF_CAP = 300 # seconds; backoff never sleeps longer
|
|
ADB_RECONNECT_JITTER = 0.25 # ±25 % randomization against reconnect storms
|
|
STATE_STORE_TTL = 60 # ADB-sourced fields older than this are stale
|
|
|
|
DEFAULT_NAME = "Nvidia Shield"
|
|
|
|
# Emotiva DAG attribute we read to get available inputs
|
|
ATTR_MEDIA_DAG_INPUT_MAP = "media_dag_input_map"
|
|
|
|
# Known Jellyfin app package IDs (used to route Jellyfin-family clients
|
|
# — including Wholphin, a Jellyfin client — to the rich-metadata path).
|
|
JELLYFIN_APP_IDS = [
|
|
"org.jellyfin.androidtv",
|
|
"org.jellyfin.mobile",
|
|
"com.github.damontecres.wholphin",
|
|
]
|
|
|
|
# Remote-protocol key names (RemoteKeyCode enum in remotemessage.proto).
|
|
# HA service kind → protocol keycode string.
|
|
PROTOCOL_MEDIA_KEYS = {
|
|
"media_play": "KEYCODE_MEDIA_PLAY",
|
|
"media_pause": "KEYCODE_MEDIA_PAUSE",
|
|
"media_stop": "KEYCODE_MEDIA_STOP",
|
|
"media_next_track": "KEYCODE_MEDIA_NEXT",
|
|
"media_previous_track": "KEYCODE_MEDIA_PREVIOUS",
|
|
}
|
|
PROTOCOL_VOLUME_KEYS = {
|
|
"volume_up": "KEYCODE_VOLUME_UP",
|
|
"volume_down": "KEYCODE_VOLUME_DOWN",
|
|
"volume_mute": "KEYCODE_VOLUME_MUTE",
|
|
}
|
|
PROTOCOL_REMOTE_KEYS = {
|
|
**PROTOCOL_VOLUME_KEYS,
|
|
"play": "KEYCODE_MEDIA_PLAY",
|
|
"pause": "KEYCODE_MEDIA_PAUSE",
|
|
"stop": "KEYCODE_MEDIA_STOP",
|
|
"up": "KEYCODE_DPAD_UP",
|
|
"down": "KEYCODE_DPAD_DOWN",
|
|
"left": "KEYCODE_DPAD_LEFT",
|
|
"right": "KEYCODE_DPAD_RIGHT",
|
|
"enter": "KEYCODE_DPAD_CENTER",
|
|
"home": "KEYCODE_HOME",
|
|
"back": "KEYCODE_BACK",
|
|
"menu": "KEYCODE_MENU",
|
|
"search": "KEYCODE_SEARCH",
|
|
"power": "KEYCODE_POWER",
|
|
"channel_up": "KEYCODE_CHANNEL_UP",
|
|
"channel_down": "KEYCODE_CHANNEL_DOWN",
|
|
}
|
|
|
|
# §7 channel selection: digits only, ~0.1 s apart, no ENTER by default
|
|
# (replicates HA core androidtv_remote's verified behavior).
|
|
# Zeroconf discovery (Phase 4): the Android TV remote service type.
|
|
ZEROCONF_SERVICE_TYPE = "_androidtvremote2._tcp.local."
|
|
|
|
# P4-1 apps name/icon map (options flow editor): package → friendly name,
|
|
# consumed by app_name after the androidtv-entity and protocol-push tiers.
|
|
CONF_APP_NAME_MAP = "app_name_map"
|
|
|
|
# P4-2a adb_command service: rawADB shell on this entry — OFF by default
|
|
# (same security posture as the core androidtv integration).
|
|
CONF_ADB_COMMAND_ENABLED = "adb_command_enabled"
|
|
SERVICE_ADB_COMMAND = "adb_command"
|
|
|
|
# P4-2c BrowseMedia app directory fallback when the options map is empty
|
|
# (curated; the packages are the plan's reference apps).
|
|
DEFAULT_APP_DIRECTORY = {
|
|
"ar.tvplayer.tv": "TiviMate",
|
|
"com.github.damontecres.wholphin": "Wholphin",
|
|
"com.netflix.ninja": "Netflix",
|
|
"com.google.android.youtube.tv": "YouTube",
|
|
}
|
|
|
|
CHANNEL_DIGIT_DELAY = 0.1
|
|
CONF_CHANNEL_DIGIT_DELAY = "channel_digit_delay"
|
|
CONF_CHANNEL_SEND_ENTER = "channel_send_enter"
|
|
|
|
# Verified on-device package names (docs/RESEARCH_SHIELD.md): TiviMate does
|
|
# not publish a MediaSession on Shield Android 11 — it is the headline
|
|
# Phase-3 fallback app.
|
|
TIVIMATE_PACKAGE = "ar.tvplayer.tv"
|
|
|
|
# Packages to ignore when parsing foreground/audio-playback identities
|
|
SYSTEM_MEDIA_PACKAGES = [
|
|
"com.google.android.apps.mediashell", # Chromecast receiver process
|
|
"com.android.systemui",
|
|
"com.android.tv.settings",
|
|
"com.nvidia.diagtools",
|
|
]
|