ADBTuner: A "channel tuning" application for networked Google TV / Android TV devices

Nothing that I can see. It's on the home screen reading the text, but the stream app never opens. Eventually:
2026-06-26 19:07:55.797 - stream - [Tune muaEWjnMgZaW4vGADi9HVb] Maximum wait time exceeded. Giving up after 40.39 seconds. [Tune muaEWjnMgZaW4vGADi9HVb] Display was on, application (com.xfinity.cloudtvr.tenfoot) was closed.

Then it'll flash the stream app for keepalive a few minutes later, so it's not like it's the wrong app name...

I'm not aware of the Xfinity app being particularly reliable with Keep Alive. I've always used it in "compatibility mode", where the app is stopped after tuning, and relaunched on each new tune. I remember experimenting with keeping the app loaded some time ago, and although I had some success with it -- it never reached the level of reliability I wanted.

It's been fine in my use case for months - compat mode, keep alive, 4 firesticks with various levels of priority. Now this week none can tune.

Probably not the issue, but there's no point in using Keep Alive with Compatibility Mode, as the app gets force stopped both before and after a tune:

{
    "name": "Deep Links - Compatibility Mode (ADBTuner)",
    "author": "ADBTuner",
    "version": "0",
    "description": "Load content via deep link URLs (where supported). Adds workarounds to help support apps that don't behave as expected. This should only be used if the default doesn't work correctly.",
    "uuid": "12dae68b-a55f-4992-a5da-781c695f8c70",
    "global_options": {
        "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 '||TARGET_PACKAGE_NAME||'",
        "sleep 2"
    ],
    "tune_commands": [
        "am start -W -a android.intent.action.VIEW -d '||TARGET_URL_OR_IDENTIFIER||' '||TARGET_PACKAGE_NAME||'"
    ],
    "tune_match_text_commands": [
        {
            "match_text": [
                "who's watching",
                "choose an account",
                "edit profiles"
            ],
            "commands": [
                "input keyevent KEYCODE_DPAD_CENTER"
            ],
            "start_checking_after_seconds": 5
        }
    ],
    "post_playback_start_commands": [],
    "post_tune_commands": [
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "input keyevent KEYCODE_HOME"
    ],
    "timed_keep_active_commands": [],
    "disabled_duplicate": false
}

If you could post the full tuning cycle for one of your failed tunes, it could be helpful. Here's an example (this is from a DTV tune I just did):

2026-06-26 20:51:00.800 - stream - [Tune LRENMdM4FyyJALhpRZYepG] htpc6:5592 | channels-dvr/2026.05.18.1824 Go-http-client/1.1 (windows-x86_64)
2026-06-26 20:51:00.801 - stream - [Tune (LRENMdM4FyyJALhpRZYepG)] No active tuners found for FOX-KDVR. Reserving a new tuner.
2026-06-26 20:51:00.801 - tuner_management - [Tune LRENMdM4FyyJALhpRZYepG] Attempting to reserve tuner for: ['com.att.tv', 'com.att.tv.openvideo'].
2026-06-26 20:51:00.802 - tuner_management - [Tune LRENMdM4FyyJALhpRZYepG] Available Tuners:
2026-06-26 20:51:00.803 - tuner_management - [Tune LRENMdM4FyyJALhpRZYepG] Name: firestick-rack3 Priority: 
2026-06-26 20:51:00.803 - tuner_management - [Tune LRENMdM4FyyJALhpRZYepG] Name: firestick-rack4 Priority: 
2026-06-26 20:51:00.803 - tuner_management - [Tune LRENMdM4FyyJALhpRZYepG] Selecting random tuner
2026-06-26 20:51:00.803 - tuner_management - [Tune LRENMdM4FyyJALhpRZYepG] Reserved Tuner: Name: firestick-rack3 Priority: 
2026-06-26 20:51:00.803 - stream - [Tune (LRENMdM4FyyJALhpRZYepG)] Tuning to FOX-KDVR on firestick-rack3
2026-06-26 20:51:00.803 - stream - [Tune (LRENMdM4FyyJALhpRZYepG)] Using channel configuration: DirecTV X (David B.) (3c7d5a19-6f2e-4b8a-9d3f-8e1c4b7a5f92)
2026-06-26 20:51:00.803 - lib.controller_pool - Pool: creating controller for tuner 1 (firestick-rack3).
2026-06-26 20:51:01.182 - lib.adb - [Tune LRENMdM4FyyJALhpRZYepG] ADB: firestick-rack3 - input keyevent KEYCODE_WAKEUP
2026-06-26 20:51:02.379 - lib.adb - [Tune LRENMdM4FyyJALhpRZYepG] ADB: firestick-rack3 - pidof com.att.tv
2026-06-26 20:51:02.533 - tuning - [Tune (LRENMdM4FyyJALhpRZYepG)] Using dtvnow://deeplink.directvnow.com/play/channel/KDVR/f685686e-f384-a5a0-a4eb-68fb7732e1ec to load channel.
2026-06-26 20:51:02.533 - tuning - [Tune (LRENMdM4FyyJALhpRZYepG)] Executing pre-tune commands: []
2026-06-26 20:51:02.533 - tuning - [Tune (LRENMdM4FyyJALhpRZYepG)] Executing tune commands: [{'type': 'ADB', 'command': "am start -S -W -n 'com.att.tv'/$(cmd package resolve-activity -a android.intent.action.MAIN 'com.att.tv' | awk -F= '/name=/{print $2; exit}') -a android.intent.action.VIEW -d 'dtvnow://deeplink.directvnow.com/play/channel/KDVR/f685686e-f384-a5a0-a4eb-68fb7732e1ec'"}]
2026-06-26 20:51:02.533 - lib.adb - [Tune LRENMdM4FyyJALhpRZYepG] ADB: firestick-rack3 - am start -S -W -n 'com.att.tv'/$(cmd package resolve-activity -a android.intent.action.MAIN 'com.att.tv' | awk -F= '/name=/{print $2; exit}') -a android.intent.action.VIEW -d 'dtvnow://deeplink.directvnow.com/play/channel/KDVR/f685686e-f384-a5a0-a4eb-68fb7732e1ec'
2026-06-26 20:51:05.178 - lib.adb - [Tune LRENMdM4FyyJALhpRZYepG] ADB: firestick-rack3 - Reconnected after: Reading from firestick-rack3:5555 timed out (2 seconds)
2026-06-26 20:51:07.575 - tuning - [Tune LRENMdM4FyyJALhpRZYepG] Waiting 3 seconds to allow sleeping device to setup.
2026-06-26 20:51:10.591 - server - 
--------------------------------------------------
Tuner "firestick-rack3" is currently in use and locked.

Tune ID: N/A
Channel: FOX-KDVR
Lock Obtained: 2026-06-26 20:51:00 (0.18 minutes ago)
Last Seen: N/A
Bytes Transferred: None
Remote User Agent:
N/A
--------------------------------------------------
2026-06-26 20:51:11.636 - tuning - [Tune LRENMdM4FyyJALhpRZYepG] Waiting for playback start. Status: unknown
2026-06-26 20:51:16.513 - lib.adb - Media session playback has started.
2026-06-26 20:51:16.513 - tuning - [Tune LRENMdM4FyyJALhpRZYepG] Tuning completed after 15.71 seconds. [Tune LRENMdM4FyyJALhpRZYepG] Display was off, application (com.att.tv) was closed.
2026-06-26 20:51:16.513 - tuning - Initializing keep active command schedule for tuner firestick-rack3 (1).
2026-06-26 20:51:16.513 - tuning - [Tune LRENMdM4FyyJALhpRZYepG] scheduled keep active commands:
[{'next_run_time': 1782510676, 'run_every_minutes': 60, 'commands': ['input keyevent KEYCODE_MEDIA_PLAY']}]
2026-06-26 20:51:16.518 - uvicorn.access - 100.xxx.xxx.xxx:0 - "GET /stream/226 HTTP/1.1" 307
2026/06/26 20:51:16 [PROXY] 100.xxx.xxx.xxx -> GET "/proxy/1?requestKey=LRENMdM4FyyJALhpRZYepG" -> "http://encoder_48007/8.ts"

Apologize ahead of time if i don't use the code tag correctly:

adbtuner            | 2026-06-26 23:41:39.328 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] 192.168.31.151:5592 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36
adbtuner            | 2026-06-26 23:41:39.334 - stream - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] No active tuners found for MeTV Toons. Reserving a new tuner.
adbtuner            | 2026-06-26 23:41:39.336 - tuner_management - [Tune Aq6BzAUV6th2y8KHz5cDzN] Attempting to reserve tuner for: ['com.xfinity.cloudtvr.tenfoot'].
adbtuner            | 2026-06-26 23:41:39.347 - tuner_management - [Tune Aq6BzAUV6th2y8KHz5cDzN] Available Tuners:
adbtuner            | 2026-06-26 23:41:39.347 - tuner_management - [Tune Aq6BzAUV6th2y8KHz5cDzN] Name: Firestick4K02 Priority: 0
adbtuner            | 2026-06-26 23:41:39.348 - tuner_management - [Tune Aq6BzAUV6th2y8KHz5cDzN] Name: Firestick01 Priority: 1
adbtuner            | 2026-06-26 23:41:39.349 - tuner_management - [Tune Aq6BzAUV6th2y8KHz5cDzN] Name: Firestick4K03 Priority: 1
adbtuner            | 2026-06-26 23:41:39.349 - tuner_management - [Tune Aq6BzAUV6th2y8KHz5cDzN] Name: Firestick4K01 Priority: 2
adbtuner            | 2026-06-26 23:41:39.349 - tuner_management - [Tune Aq6BzAUV6th2y8KHz5cDzN] Using first available tuner (by priority).
adbtuner            | 2026-06-26 23:41:39.350 - tuner_management - [Tune Aq6BzAUV6th2y8KHz5cDzN] Reserved Tuner: Name: Firestick4K02 Priority: 0
adbtuner            | 2026-06-26 23:41:39.351 - stream - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] Tuning to MeTV Toons on Firestick4K02
adbtuner            | 2026-06-26 23:41:39.354 - stream - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] Using channel configuration: Deep Links - Compatibility Mode (bb353259-17e0-4b38-a328-8629fb1ec2ca)
adbtuner            | 2026-06-26 23:41:39.692 - lib.adb - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] ADB: 192.168.31.115 - pidof com.xfinity.cloudtvr.tenfoot
adbtuner            | 2026-06-26 23:41:39.812 - stream - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] Using https://www.xfinity.com/stream/live/1736/7895878894359290105/METNS to load channel.
adbtuner            | 2026-06-26 23:41:39.813 - lib.adb - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] ADB: 192.168.31.115 - input keyevent KEYCODE_MEDIA_STOP
adbtuner            | 2026-06-26 23:41:40.829 - lib.adb - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] ADB: 192.168.31.115 - am force-stop 'com.xfinity.cloudtvr.tenfoot'
adbtuner            | 2026-06-26 23:41:40.914 - lib.adb - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] ADB: 192.168.31.115 - sleep 2
adbtuner            | 2026-06-26 23:41:40.914 - lib.adb - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] ADB: Sleeping for 2.0 seconds.
adbtuner            | 2026-06-26 23:41:42.915 - lib.adb - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] ADB: 192.168.31.115 - am start -W -a android.intent.action.VIEW -d 'https://www.xfinity.com/stream/live/1736/7895878894359290105/METNS' 'com.xfinity.cloudtvr.tenfoot'
adbtuner            | 2026-06-26 23:41:42.977 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Starting tune match text monitoring. Match commands: [{'match_text': ["who's watching", 'choose an account', 'edit profiles'], 'commands': ['input keyevent KEYCODE_DPAD_CENTER'], 'start_checking_after_seconds': 5}]
adbtuner            | 2026-06-26 23:41:45.874 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Waiting for playback start. Status: unknown
adbtuner            | 2026-06-26 23:41:51.006 - lib.adb - [Tune Aq6BzAUV6th2y8KHz5cDzN] On screen text: '= a [s) a = 5 ic) ed ® fire tv  home  m | * favorite aba: + \7¢. by franchises sarin  eacock: = stream now housewives?' learn more  a rg  a\\  sponsored  netflix  gb \oulube  ®@ try alexa+. just say "show me movies similar to the hangover"  amazon —)'
adbtuner            | 2026-06-26 23:41:51.007 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
adbtuner            | 2026-06-26 23:41:55.299 - lib.adb - [Tune Aq6BzAUV6th2y8KHz5cDzN] On screen text: 'home  =e @m=zcs ea 8b @ fire tv  thousands of prime day deals  shop on amazon and prime video  @ available to buy  learn more a  limited-time offer. terms apply.  l  es >  the r¢ =  chosen [ i minds  : . wf gw mpc netflix (sg ee nok aluna _musievideos fup)  ® try alexat. just say "show me movies similar to the hangover"  sponsored'
adbtuner            | 2026-06-26 23:41:55.299 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
adbtuner            | 2026-06-26 23:41:58.339 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Redirecting to stream after 19.01 seconds. Tuning is still in progress.
adbtuner            | 2026-06-26 23:41:58.340 - uvicorn.access - 192.168.31.48:0 - "GET /stream/59?web-preview HTTP/1.1" 307
adbtuner            | 2026/06/26 23:41:58 [PROXY] 192.168.31.48 -> GET "/proxy/3?requestKey=Aq6BzAUV6th2y8KHz5cDzN" -> "http://192.168.31.11/12.ts"
adbtuner            | 2026-06-26 23:42:00.658 - server - 
adbtuner            | 
adbtuner            | --------------------------------------------------
adbtuner            | Tuner "Firestick4K02" is currently in use and locked.
adbtuner            | Tune ID: N/A
adbtuner            | Channel: MeTV Toons
adbtuner            | Lock Obtained: 2026-06-26 23:41:39 (0.36 minutes ago)
adbtuner            | Last Seen: N/A
adbtuner            | Bytes Transferred: None
adbtuner            | Remote User Agent:
adbtuner            | N/A
adbtuner            | --------------------------------------------------
adbtuner            | 2026-06-26 23:42:01.027 - lib.adb - [Tune Aq6BzAUV6th2y8KHz5cDzN] On screen text: '= (s) e = a ic) ed ® fire ty  home  the athletic fc  daily cup  episode: usmnt vs turkey recap & mbappe-haaland clash freeon fire tv —7  watch free  the chosen re  sponsored  mee  now streamin for bundle subsc ol “helen on ~ soup tv-ma  the fi on 4 z terms apply'
adbtuner            | 2026-06-26 23:42:01.028 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
adbtuner            | 2026-06-26 23:42:07.167 - lib.adb - [Tune Aq6BzAUV6th2y8KHz5cDzN] On screen text: '=e @m=zacs eae fire ty  home  the athletic fc  daily cup  episode: usmnt vs turkey recap & mbappe-haaland clash a freeon fire tv —  watch free  ‘criminal eas) '  ; ee 3 1h $epe. | ae ls le ww  ms = os  ® try "find the show about a chemistry teacher turning criminal"  @ xbox'
adbtuner            | 2026-06-26 23:42:07.167 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
adbtuner            | 2026-06-26 23:42:12.880 - lib.adb - [Tune Aq6BzAUV6th2y8KHz5cDzN] On screen text: 'o@m=ascs# eo be fire ty  £  | |  power book ill: raising kanan 6 gi  the . chosen. ve  ‘\ar  as é = oe  g3 voulube <a  now streami =~ for bundie subscribers hulu on pyenep} — [tv-ma  terms apply © 2026 disney and its related entities.'
adbtuner            | 2026-06-26 23:42:12.880 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
adbtuner            | 2026-06-26 23:42:18.358 - lib.adb - [Tune Aq6BzAUV6th2y8KHz5cDzN] On screen text: '=e @mazacs ease fire ty  ba the bear  the final season  now streaming |  learn more  chosen  ‘hae netflix  ® find your next movie. try "find romance movies that are not sad"  i g3 voulube  bo —&'
adbtuner            | 2026-06-26 23:42:18.358 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
adbtuner            | 2026-06-26 23:42:21.640 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Maximum wait time exceeded. Giving up after 42.31 seconds. [Tune Aq6BzAUV6th2y8KHz5cDzN] Display was on, application (com.xfinity.cloudtvr.tenfoot) was running.
adbtuner            | 2026-06-26 23:42:21.641 - tuner_management - [Tune Aq6BzAUV6th2y8KHz5cDzN] Released tuner (3).
adbtuner            | 2026-06-26 23:42:21.642 - lib.adb - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] ADB: Stopping media playback.
adbtuner            | 2026-06-26 23:42:21.642 - lib.adb - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] ADB: 192.168.31.115 - input keyevent KEYCODE_MEDIA_STOP
adbtuner            | 2026-06-26 23:42:22.566 - lib.adb - [Tune (Aq6BzAUV6th2y8KHz5cDzN)] ADB: 192.168.31.115 - input keyevent KEYCODE_MEDIA_PAUSE
adbtuner            | 2026-06-26 23:42:23.657 - lib.adb - [Tune Aq6BzAUV6th2y8KHz5cDzN] On screen text: 'o@m==2s 5 © 8 @ fiety  fx the bear  the final season  now streaming |  learn more  @ find your next movie. try "find romance movies that are not sad"'
adbtuner            | 2026-06-26 23:42:23.657 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
adbtuner            | 2026-06-26 23:42:26.046 - stream - [Tune Aq6BzAUV6th2y8KHz5cDzN] Tuner is no longer active. Stopping tuning text match process.

It appears you're getting hung-up on choosing a user account, which is interesting, as that's not something I ever see. Probably because I don't have multiple users set up.

Based on the onscreen text that's being identified, it looks like you're just sitting on the FireTV home screen though? Is that the case?

If you don't have multiple users defined, I'd suggest creating a custom config that removes the tune_match_text_section. Also, if these are older FireStick 4Ks (some of which are 10 years old now), you may need to extend the sleep in the pre-tune commands by a second or so.

I assume you've rebooted the sticks, restarted the container, and have everything up-to-date? There's also a version of the compatibility mode config that allows you to see everything that's happening during the tune -- so that might be the config to clone and modify while you're sorting this issue out.

Also, can you confirm that you can connect to these sticks and tune manually? That would rule out a number of other possible issues...

Thank you. Where this user account came from i don't know. The primary tuner on this setup is a Firestick4K (edited this because i got mixed up what the new priorities were) which has been running fine until this week. I can, via the firestick remote, fire up the stream app and view channels. The log you are looking at was from me clicking the "preview" button on the ADBTuner Channel config for that particular channel. It won't let me manually tune a channel from teh Channels DVR lineup anymore. I also have 3 firestick4K's and a firestickHD that are doing the same thing, but I'll take a deeper look at their logs compared to what you see here.

And yes - it's just sitting on the home screen. and yes, they've all been rebooted along with the host running ADBtuner in docker-compose, and the stable image has been pulled as of today.

Well, I did some testing and I confirmed the Osprey issues I was noticing with ah4c seem specific to happening with ah4c and also sending direct ADB commands. It seems to be when you wake the device and immediately send a deep link without any sort of delay at all whatsoever is when it wedges, which never happened before. Now, here's my question. Does ADB Tuner in its logic have some sort of slight delay? Like even two to three seconds is enough to work around this, and if it's just built in, the issue would not manifest and no one using ADB Tuner would ever notice it.

ADBTuner waits 3 seconds before sending a command to a sleeping device.

Specifically, if the display is off it sends an input keyevent KEYCODE_WAKEUP command, waits 3 seconds, then continues.

1 Like

That was the exact window I found that got the Osprey boxes working, although I wrote a bit of a more robust check for ah4c so it would tune quicker and never keel over but the 3 second delay explains it!!

This is what I wrote for ah4c to check playback state before firing.

$adbTarget shell 'for i in $(seq 1 80); do dumpsys audio 2>/dev/null | grep -E "pack: com.att.tv.openvideo.*gain: GAIN " >/dev/null && break; dumpsys media_session 2>/dev/null | grep "PlaybackState {state=3" >/dev/null && break; sleep 0.1; done'

It looks like the app just never opens. Can you try updating to turtletank99/adbtuner:development and see if that changes anything, I'm not sure it will, but it might be helpful to be on the most recent version. We can continue troubleshooting from there after you have updated.

I'll check it out - thank you.

I'm beginning to think there's something network related goin on, but I gotta wait until the house full of teenagers is asleep and not online yelling at their friends until I can reboot the router...

Basically the same outcome. It woke up the firestick4k, but never launched the stream app.

adbtuner has been recreated
adbtuner exited with code 143
adbtuner            | Using database path: /app/.config/config.db
adbtuner            | INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
adbtuner            | INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
adbtuner            | INFO  [alembic.runtime.migration] Running upgrade e1f8d315f469 -> 7d4b685f175f, Add check connectivity option to tuners
adbtuner            | 2026/06/28 20:15:36 Loaded routes from file:
adbtuner            |   "/proxy/1" -> "http://192.168.31.10/ts/1_0"
adbtuner            |   "/proxy/2" -> "http://192.168.31.11/0.ts"
adbtuner            |   "/proxy/3" -> "http://192.168.31.11/12.ts"
adbtuner            |   "/proxy/4" -> "http://192.168.31.11/8.ts"
adbtuner            |   "/proxy/6" -> "http://192.168.31.11/4.ts"
adbtuner            |   "/proxy/7" -> "http://192.168.31.12/0.ts"
adbtuner            | INFO:     Started server process [10]
adbtuner            | INFO:     Waiting for application startup.
adbtuner            | 2026-06-28 20:15:42.099 - server - ADBTuner 20260531-3
adbtuner            | 2026-06-28 20:15:42.100 - schema_verification - Verifying database schema (/app/.config/config.db).
adbtuner            | 2026-06-28 20:15:42.107 - server - Database schema verification was successful.
adbtuner            | 2026/06/28 20:15:42 Received updated routes, but no changes detected.
adbtuner            | 2026-06-28 20:15:42.589 - tuner_management - Caching installed apps list for all tuners
adbtuner            | INFO:     Application startup complete.
adbtuner            | 2026-06-28 20:15:42.684 - lib.controller_pool - Pool: creating controller for tuner 3 (192.168.31.115).
adbtuner            | INFO:     Uvicorn running on http://0.0.0.0:5593 (Press CTRL+C to quit)
adbtuner            | 2026-06-28 20:15:42.964 - lib.controller_pool - Pool: creating controller for tuner 6 (192.168.31.227).
adbtuner            | 2026-06-28 20:15:43.546 - lib.controller_pool - Pool: creating controller for tuner 7 (192.168.31.80).
adbtuner            | 2026-06-28 20:15:43.903 - lib.controller_pool - Pool: creating controller for tuner 4 (192.168.31.80).
adbtuner            | 2026-06-28 20:15:44.169 - lib.controller_pool - Pool: creating controller for tuner 1 (192.168.31.64).
adbtuner            | 2026-06-28 20:15:45.146 - lib.controller_pool - Pool: creating controller for tuner 2 (192.168.31.87).
adbtuner            | 2026-06-28 20:17:12.591 - lib.controller_pool - Pool: evicting idle controller for tuner 3 (192.168.31.115).
adbtuner            | 2026-06-28 20:17:12.591 - lib.adb - [Pool 3] ADB: Closing connection - 192.168.31.115
adbtuner            | 2026-06-28 20:17:12.592 - lib.controller_pool - Pool: evicting idle controller for tuner 6 (192.168.31.227).
adbtuner            | 2026-06-28 20:17:12.593 - lib.adb - [Pool 6] ADB: Closing connection - 192.168.31.227
adbtuner            | 2026-06-28 20:17:12.594 - lib.controller_pool - Pool: evicting idle controller for tuner 7 (192.168.31.80).
adbtuner            | 2026-06-28 20:17:12.595 - lib.adb - [Pool 7] ADB: Closing connection - 192.168.31.80
adbtuner            | 2026-06-28 20:17:12.596 - lib.controller_pool - Pool: evicting idle controller for tuner 4 (192.168.31.80).
adbtuner            | 2026-06-28 20:17:12.597 - lib.adb - [Pool 4] ADB: Closing connection - 192.168.31.80
adbtuner            | 2026-06-28 20:17:12.598 - lib.controller_pool - Pool: evicting idle controller for tuner 1 (192.168.31.64).
adbtuner            | 2026-06-28 20:17:12.599 - lib.adb - [Pool 1] ADB: Closing connection - 192.168.31.64
adbtuner            | 2026-06-28 20:17:12.600 - lib.controller_pool - Pool: evicting idle controller for tuner 2 (192.168.31.87).
adbtuner            | 2026-06-28 20:17:12.601 - lib.adb - [Pool 2] ADB: Closing connection - 192.168.31.87
pluto-for-channels  | [INFO] Checking Scheduler Thread
tvapp2              |  tvapp2  ℹ️ [8:30:00 PM] core [schedule] ℹ️ <msg> Next IPTV data refresh at <schedule>  0 0 */3 * *  <nextrun>  07-01-2026 12:00 AM  <nextrunIso>  Wed Jul 01 2026 00:00:00 GMT+0000 (Coordinated Universal Time) 
adbtuner            | 2026-06-28 20:30:42.701 - maintenance - Skipping keep alive tasks as it's currently the top or middle of the hour.
pluto-for-channels  | [INFO] Checking Scheduler Thread
adbtuner            | 2026-06-28 20:54:21.526 - stream - [Tune fENVbYgYt4C5vjHmsHAQZw] 192.168.31.151:5592 | channels-dvr/2026.05.18.2126 Go-http-client/1.1 (linux-arm64)
adbtuner            | 2026-06-28 20:54:21.555 - stream - [Tune (fENVbYgYt4C5vjHmsHAQZw)] No active tuners found for MeTV Toons. Reserving a new tuner.
adbtuner            | 2026-06-28 20:54:21.558 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Attempting to reserve tuner for: ['com.xfinity.cloudtvr.tenfoot'].
adbtuner            | 2026-06-28 20:54:21.582 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Available Tuners:
adbtuner            | 2026-06-28 20:54:21.582 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Name: Firestick4K03-UN Priority: 0
adbtuner            | 2026-06-28 20:54:21.582 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Name: Firestick01 Priority: 1
adbtuner            | 2026-06-28 20:54:21.583 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Name: Firestick4K02 Priority: 1
adbtuner            | 2026-06-28 20:54:21.583 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Name: Firestick4K03 Priority: 1
adbtuner            | 2026-06-28 20:54:21.583 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Name: Firestick4K01 Priority: 2
adbtuner            | 2026-06-28 20:54:21.583 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Using first available tuner (by priority).
adbtuner            | 2026-06-28 20:54:21.583 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Reserved Tuner: Name: Firestick4K03-UN Priority: 0
adbtuner            | 2026-06-28 20:54:21.584 - stream - [Tune (fENVbYgYt4C5vjHmsHAQZw)] Tuning to MeTV Toons on Firestick4K03-UN
adbtuner            | 2026-06-28 20:54:21.588 - stream - [Tune (fENVbYgYt4C5vjHmsHAQZw)] Using channel configuration: Deep Links - Compatibility Mode (ADBTuner) (bb353259-17e0-4b38-a328-8629fb1ec2ca)
adbtuner            | 2026-06-28 20:54:21.590 - lib.controller_pool - Pool: creating controller for tuner 7 (192.168.31.80).
adbtuner            | 2026-06-28 20:54:22.167 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: 192.168.31.80 - input keyevent KEYCODE_WAKEUP
adbtuner            | 2026-06-28 20:54:24.100 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: 192.168.31.80 - pidof com.xfinity.cloudtvr.tenfoot
adbtuner            | 2026-06-28 20:54:24.289 - tuning - [Tune (fENVbYgYt4C5vjHmsHAQZw)] Using https://www.xfinity.com/stream/live/1736/7895878894359290105/METNS to load channel.
adbtuner            | 2026-06-28 20:54:24.289 - tuning - [Tune (fENVbYgYt4C5vjHmsHAQZw)] Executing pre-tune commands: [{'type': 'ADB', 'command': 'input keyevent KEYCODE_MEDIA_STOP'}, {'type': 'ADB', 'command': "am force-stop 'com.xfinity.cloudtvr.tenfoot'"}, {'type': 'ADB', 'command': 'sleep 2'}]
adbtuner            | 2026-06-28 20:54:24.290 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: 192.168.31.80 - input keyevent KEYCODE_MEDIA_STOP
adbtuner            | 2026-06-28 20:54:25.848 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: 192.168.31.80 - am force-stop 'com.xfinity.cloudtvr.tenfoot'
adbtuner            | 2026-06-28 20:54:26.030 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: 192.168.31.80 - sleep 2
adbtuner            | 2026-06-28 20:54:26.030 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: Sleeping for 2.0 seconds.
adbtuner            | 2026-06-28 20:54:28.030 - tuning - [Tune (fENVbYgYt4C5vjHmsHAQZw)] Executing tune commands: [{'type': 'ADB', 'command': "am start -W -a android.intent.action.VIEW -d 'https://www.xfinity.com/stream/live/1736/7895878894359290105/METNS' 'com.xfinity.cloudtvr.tenfoot'"}]
adbtuner            | 2026-06-28 20:54:28.030 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: 192.168.31.80 - am start -W -a android.intent.action.VIEW -d 'https://www.xfinity.com/stream/live/1736/7895878894359290105/METNS' 'com.xfinity.cloudtvr.tenfoot'
adbtuner            | 2026-06-28 20:54:28.231 - tuning - [Tune fENVbYgYt4C5vjHmsHAQZw] Starting tune match text monitoring. Match commands: [{'match_text': ["who's watching", 'choose an account', 'edit profiles'], 'commands': ['input keyevent KEYCODE_DPAD_CENTER'], 'start_checking_after_seconds': 5}]
adbtuner            | 2026-06-28 20:54:28.231 - tuning - [Tune fENVbYgYt4C5vjHmsHAQZw] Waiting 3 seconds to allow sleeping device to setup.
adbtuner            | 2026-06-28 20:54:33.247 - tuning - [Tune fENVbYgYt4C5vjHmsHAQZw] Waiting for playback start. Status: unknown
adbtuner            | 2026-06-28 20:54:40.548 - stream - [Tune fENVbYgYt4C5vjHmsHAQZw] Redirecting to stream after 19.02 seconds. Tuning is still in progress.
adbtuner            | 2026-06-28 20:54:40.551 - uvicorn.access - 192.168.31.151:0 - "GET /stream/59 HTTP/1.1" 307
adbtuner            | 2026/06/28 20:54:40 [PROXY] 192.168.31.151 -> GET "/proxy/7?requestKey=fENVbYgYt4C5vjHmsHAQZw" -> "http://192.168.31.12/0.ts"
adbtuner            | 2026-06-28 20:54:43.154 - server - 
adbtuner            | 
adbtuner            | --------------------------------------------------
adbtuner            | Tuner "Firestick4K03-UN" is currently in use and locked.
adbtuner            | Tune ID: N/A
adbtuner            | Channel: MeTV Toons
adbtuner            | Lock Obtained: 2026-06-28 20:54:21 (0.37 minutes ago)
adbtuner            | Last Seen: N/A
adbtuner            | Bytes Transferred: None
adbtuner            | Remote User Agent:
adbtuner            | N/A
adbtuner            | --------------------------------------------------
adbtuner            | 2026-06-28 20:55:04.236 - tuner_management - [Tune fENVbYgYt4C5vjHmsHAQZw] Released tuner (7).
adbtuner            | 2026-06-28 20:55:04.237 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: Stopping media playback.
adbtuner            | 2026-06-28 20:55:04.239 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: 192.168.31.80 - input keyevent KEYCODE_MEDIA_STOP
adbtuner            | 2026-06-28 20:55:05.180 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] ADB: 192.168.31.80 - input keyevent KEYCODE_MEDIA_PAUSE
adbtuner            | 2026-06-28 20:55:06.170 - tuning - [Tune fENVbYgYt4C5vjHmsHAQZw] Tuning completed after 44.64 seconds. Maximum wait time exceeded. [Tune fENVbYgYt4C5vjHmsHAQZw] Display was on, application (com.xfinity.cloudtvr.tenfoot) was closed.
adbtuner            | 2026-06-28 20:55:12.023 - lib.adb - [Tune fENVbYgYt4C5vjHmsHAQZw] On screen text: 'oo fire ty  we 8) tol no.  brilliant color. game-changing ex  mini led tv brand  ‘source: circana llc retail tracking service tv mini led unit sales 52 we jan 3 2026 shop now  “ds dma == o a='
adbtuner            | 2026-06-28 20:55:12.024 - tuning - [Tune fENVbYgYt4C5vjHmsHAQZw] Text match result: Text to match: ["who's watching", 'choose an account', 'edit profiles']. Matches found: None.
adbtuner            | 2026-06-28 20:55:13.027 - tuning - [Tune fENVbYgYt4C5vjHmsHAQZw] Tuner is no longer active. Stopping tuning text match process.
pluto-for-channels  | [INFO] Checking Scheduler Thread

It looks as though deep links are broken in the current FireTV version of the Xfinity app. I'm not a Comcast user so I can't fully test this, but I can confirm that the app just doesn't open.

Edit: updated below.

Something is not adding up about this, as Xfinity deeplinks still work fine with ah4c. I checked the version I have installed, which is 8.15.0.3646. I confirmed this is the most recent version by installing Xfinity Stream on a FireStick that hasn't had it installed before.

Let me dig in a bit further. Maybe it's something else.

I wonder if it could be related to using a different activity (com.xfinity.common.view.LaunchActivity)?

Here's a full tuning cycle debug from ah4c:

[EXECUTE] Stdout: 'Current PID for this script is 7182

Not a special channel (exit nor reboot)

Starting: Intent { act=android.intent.action.VIEW dat=https://www.xfinity.com/... cmp=com.xfinity.cloudtvr.tenfoot/com.xfinity.common.view.LaunchActivity }

bmitune.sh is exiting for 192.168.1.201:5555 with exit code 0

'

[EXECUTE] Stderr: '+ dvr=utheater-pc:8089

+ channelNameID=HCHD-7889068523651137105

++ echo HCHD-7889068523651137105

++ awk -F- '{print $2}'

+ channelID=7889068523651137105

++ echo HCHD-7889068523651137105

++ awk -F- '{print $1}'

+ channelName=HCHD

+ specialID=HCHD

+ streamerIP=192.168.1.201:5555

+ streamerNoPort=192.168.1.201

+ adbTarget='adb -s 192.168.1.201:5555'

+ packageName=com.xfinity.cloudtvr.tenfoot

+ packageAction=com.xfinity.common.view.LaunchActivity

+ m3uName=xfinity.m3u

++ grep -B1 /play/tuner/HCHD-7889068523651137105 /opt/m3u/xfinity.m3u

++ awk -F 'channel-id="' 'NF>1 {split($2, a, "\""); print a[1]}'

+ m3uChannelID=1458

++ curl -s http://utheater-pc:8089/api/v1/channels

++ jq -r '.[] | select(.id == "1458") | .number'

+ channelNumber=1458

+ [[ false == '' ]]

+ speedMode=false

+ read -a autoCropChannels

+ trap finish EXIT

+ main

+ updateReferenceFiles

+ mkdir -p 192.168.1.201

+ [[ -f 192.168.1.201/stream_stopped ]]

+ [[ -f 192.168.1.201/last_channel ]]

+ echo 7182

+ echo 'Current PID for this script is 7182'

+ matchEncoderURL

+ case "$streamerIP" in

+ encoderURL=http://192.168.1.52:8090/stream2

+ encoderStreamNumber=stream2

+ encoderIP=192.168.1.52:8090/stream2

+ encoderIP=192.168.1.52

+ specialChannels

+ '[' HCHD = exit ']'

+ '[' HCHD = reboot ']'

+ [[ -f 192.168.1.201/adbCommunicationFail ]]

+ echo 'Not a special channel (exit nor reboot)'

+ tuneChannel

+ adb -s 192.168.1.201:5555 shell am start -n com.xfinity.cloudtvr.tenfoot/com.xfinity.common.view.LaunchActivity https://www.xfinity.com/stream/live/HCHD/7889068523651137105/HCHD

+ echo -e '#!/bin/bash\n\nwhile true; do sleep 4h; adb -s 192.168.1.201:5555 shell input keyevent KEYCODE_DPAD_DOWN; done'

+ chmod +x ./192.168.1.201/keep_watching.sh

+ [[ -n 4h ]]

+ nohup ./192.168.1.201/keep_watching.sh

+ printf '%s\n' 1810 1812 1841 1842 1846 1848 1852 1862

+ grep -qx 1458

+ :

+ finish

+ echo 'bmitune.sh is exiting for 192.168.1.201:5555 with exit code 0'

Terminated

'

[EXECUTE] Finished running ./scripts/firetv/xfinity/bmitune.sh in 14m24.250505231s

[EXECUTE] Stdout: 'Streaming stopped for 192.168.1.201:5555

Sleep initiated for 192.168.1.201:5555

192.168.1.201/stream_stopped written with epoch stop time

'

[EXECUTE] Stderr: '+ dvr=utheater-pc:8089

+ streamerIP=192.168.1.201:5555

+ streamerNoPort=192.168.1.201

+ channelNameID=HCHD-7889068523651137105

+ adbTarget='adb -s 192.168.1.201:5555'

+ packageName=com.xfinity.cloudtvr.tenfoot

+ m3uName=xfinity.m3u

++ grep -B1 /play/tuner/HCHD-7889068523651137105 /opt/m3u/xfinity.m3u

++ awk -F 'channel-id="' 'NF>1 {split($2, a, "\""); print a[1]}'

+ m3uChannelID=1458

++ curl -s http://utheater-pc:8089/api/v1/channels

++ jq -r '.[] | select(.id == "1458") | .number'

+ channelNumber=1458

+ [[ false == '' ]]

+ speedMode=false

+ read -a autoCropChannels

+ printf '%s\n' 1810 1812 1841 1842 1846 1848 1852 1862

+ grep -qx 1458

+ main

+ [[ -n croppedChannel ]]

+ matchEncoderURL

+ case "$streamerIP" in

+ encoderURL=http://192.168.1.52:8090/stream2

+ encoderStreamNumber=stream2

+ encoderIP=192.168.1.52:8090/stream2

+ encoderIP=192.168.1.52

+ bmituneDone

+ bmitunePID=7182

++ pgrep -f 192.168.1.201/keep_watching.sh

+ keepWatchingPID=7202

++ pgrep -P 7202

+ keepWatchingCPID=7204

+ [[ -n '' ]]


+ ps -p 7182

+ [[ -n 4h ]]

+ kill 7202 7204

+ rm ./192.168.1.201/keep_watching.sh

+ [[ -n '' ]]

+ rm ./192.168.1.52/stream2.sh

rm: cannot remove './192.168.1.52/stream2.sh': No such file or directory



p

+ [[ false == \t\r\u\e ]]

+ stop='am force-stop com.xfinity.cloudtvr.tenfoot'

+ adb -s 192.168.1.201:5555 shell am force-stop com.xfinity.cloudtvr.tenfoot



2

+ echo 'Streaming stopped for 192.168.1.201:5555'

+ adbSleep

+ sleep='input keyevent KEYCODE_SLEEP'

+ adb -s 192.168.1.201:5555 shell input keyevent KEYCODE_SLEEP

+ echo 'Sleep initiated for 192.168.1.201:5555'

+ date +%s

+ echo '192.168.1.201/stream_stopped written with epoch stop time'

'

[EXECUTE] Finished running ./scripts/firetv/xfinity/stopbmitune.sh in 3.933105448s

[GIN-debug] Request: 100.xxx.xxx.xxx GET /play/tuner/HCHD-7889068523651137105, latency: 14m30.59648036s, status: 200

Thanks. This is helpful. Explicitly specifying the activity opens the app normally in the current version.
am start -n com.xfinity.cloudtvr.tenfoot/com.xfinity.common.view.LaunchActivity

A custom configuration that does this should solve the issue, but I'm going to see if I can't figure out how to avoid doing that.

Thank you both again for spending time on this.

An added datapoint is that I did have 2 of my firesticks displaying a failed update screen earlier in the week - probably around the time this all started. Guess I need to turn off auto updates.

Once I get back in front of my server I'll try the older version and see what version they're running.