With the help of my new best friend, Claude, I was able to figure out the following regarding the Spectrum app for Android TV:
I was able to launch the application using:
adb shell am start -n com.spectrum.stva.androidtv/.ui.HostedMainActivity
After some tinkering, Claude determined that "there are no deeplink intent filters at all — no custom scheme, no HTTPS app links. This tells us the app handles navigation internally after launch, not via external URIs," and, "Since it's a WebView app, channel navigation almost certainly happens via JavaScript/web routing inside the WebView, not Android intents. The URI you pass gets handed to the web layer, which decides what to render."
After a few more tests, we determined that the app will tune using channel numbers. After launching the app, we were able to use ADB to tune like this:
# KEYCODE map for digits
# 0=7, 1=8, 2=9, 3=10, 4=11, 5=12, 6=13, 7=14, 8=15, 9=16
# Example: Tune to channel 20 (press 2, then 0)
adb shell input keyevent 9 # press "2"
adb shell input keyevent 7 # press "0"`
We also tried the following, but the app only received the last digit of the sent text:
# Channel 35
adb shell input text "35"`
Long story short, we created a script that works reliably using ADBTuner:
JSON{
"name": "Spectrum TV",
"author": "Custom",
"version": "2.1",
"description": "Tunes Spectrum TV via channel number keyevents. Set TARGET_URL_OR_IDENTIFIER to the channel number (e.g. 35 for CNN). Spectrum uses an internal WebView router with no deeplink support — channels are tuned via keyevents after app launch.",
"uuid": "f4a7b2c9-d831-4e56-9f0a-7c3e8b1d2a45",
"global_options": {
"wait_for_video_playback_detection": true,
"use_fixed_delay": false,
"fixed_delay_seconds": 0,
"wait_after_post_playback_start_commands_seconds": 0
},
"pre_tune_commands": [
"input keyevent KEYCODE_MEDIA_STOP",
"am force-stop com.spectrum.stva.androidtv",
"input keyevent KEYCODE_HOME"
],
"tune_commands": [
"adbtuner_open_app com.spectrum.stva.androidtv",
"sleep 8",
"input keyevent KEYCODE_DPAD_CENTER",
"for digit in $(echo '||TARGET_URL_OR_IDENTIFIER||' | grep -o '.'); do input keyevent KEYCODE_$digit; sleep 0.4; done",
"sleep 1"
],
"tune_match_text_commands": [
{
"match_text": [
"who's watching",
"choose an account",
"edit profiles",
"sign in"
],
"commands": [
"input keyevent KEYCODE_DPAD_CENTER"
],
"start_checking_after_seconds": 3
}
],
"post_playback_start_commands": [],
"post_tune_commands": [
"input keyevent KEYCODE_MEDIA_STOP",
"am force-stop com.spectrum.stva.androidtv",
"input keyevent KEYCODE_HOME"
],
"timed_keep_active_commands": []
}
It is slow, but it works.
I hope this somehow helps the community.

