"""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" # P5-1: device manifest label cache TTL (long — labels change with app # updates, not per poll). APP_LABEL_TTL = 24 * 3600 # 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", ]