Sorry about that. Thanks for the heads up. I will have a fix for this in the next release.
Interesting... I was reading about FastChannels recently so I could pickup the MotoGP FAST channel, and I saw the conversations about extending to other providers.
@turtletank Text match not detecting the Prime Video profile screen on Android TV (TS4K)
Setup: ADBTuner with the FruitDeepLinks - Prime Video v3.0 (FireTV and AndroidTV) config by bnhf, tuning a TiVo Stream 4K (192.168.68.109) through an HDMI encoder.
Problem: Prime opens to the "Who's watching?" profile screen and stays there. The config's tune match text is ["who's watching", 'watch live', 'new', 'guest'] with DPAD_CENTER as the command, but ADBTuner never finds a match. In the attached log, 26 checks run from +10s to +1:21 and every one returns "Matches found: None." Playback failure is flagged at +32s.
What's been ruled out:
- The deeplink is correct. ADBTuner receives the Prime Video: Get the app format, and selecting a profile manually goes straight to the correct splash screen for the event.
- The text is readable. bnhf captured the same profile screen on an ONN 4K stick and ran it through tesseract with default settings; it returned the profile names, Guest and New at 96% confidence.
- The config is right. The match list covers the words on both the profile and splash screens.
- On a FireStick, the profile screen doesn't appear at all, so this only affects generic Android TV devices.
So the screen captures cleanly and tesseract reads it outside ADBTuner, but ADBTuner's text matching returns nothing. Another user reported a similar tesseract issue here recently, which may be the same root cause.
Attached: tune log, and a screenshot of the TS4K on the profile screen.
Any ideas, or is there a debug setting that would show what text ADBTuner's OCR is actually extracting?
log:
Prime Test on TS4K at Oct 24, 2026, 1:19 PM
+0.00s 192.168.68.124:5592 | channels-dvr/2026.10.21.2302 Go-http-client/1.1 (linux-x86_64)
+0.00s No active tuners found for Prime Test. Reserving a new tuner.
+0.00s Attempting to reserve tuner for: ['com.amazon.firebat', 'com.amazon.amazonvideo.livingroom'].
+0.50s Attempting to reserve tuner for: ['com.amazon.firebat', 'com.amazon.amazonvideo.livingroom'].
+1.01s Attempting to reserve tuner for: ['com.amazon.firebat', 'com.amazon.amazonvideo.livingroom'].
+1.51s Attempting to reserve tuner for: ['com.amazon.firebat', 'com.amazon.amazonvideo.livingroom'].
+2.02s Attempting to reserve tuner for: ['com.amazon.firebat', 'com.amazon.amazonvideo.livingroom'].
+2.52s Attempting to reserve tuner for: ['com.amazon.firebat', 'com.amazon.amazonvideo.livingroom'].
+3.03s Attempting to reserve tuner for: ['com.amazon.firebat', 'com.amazon.amazonvideo.livingroom'].
+3.53s Attempting to reserve tuner for: ['com.amazon.firebat', 'com.amazon.amazonvideo.livingroom'].
+3.53s Available Tuners:
+3.54s Name: TS4K Priority: 0
+3.54s Using first available tuner (by priority).
+3.54s Reserved Tuner: Name: TS4K Priority: 0
+3.54s Tuning to Prime Test on TS4K
+3.54s Using channel configuration: FruitDeepLinks - Prime Video v3.0 (FireTV and AndroidTV) (bnhf) (a176643f-b3b6-47fb-8527-47908d089695)
+3.58s MPEG null packets mode: Redirecting immediately to /proxy/1?requestKey=E6PG5dUCEDuNuAYKZnBTBJ
+3.84s ADB: 192.168.68.109 - pidof com.amazon.amazonvideo.livingroom
+3.93s Using https://app.primevideo.com/detail?gti=amzn1.dv.gti.2ca173b4-1d07-4930-bcee-32452c49c0ff to load channel.
+3.93s Executing pre-tune commands: [{'type': 'ADB', 'command': 'input keyevent KEYCODE_MEDIA_STOP'}, {'type': 'ADB', 'command': 'input keyevent KEYCODE_HOME'}]
+3.93s ADB: 192.168.68.109 - input keyevent KEYCODE_MEDIA_STOP
+3.99s ADB: 192.168.68.109 - input keyevent KEYCODE_HOME
+4.10s Executing tune commands: [{'type': 'ADB', 'command': "am start -n $(dumpsys package 'com.amazon.amazonvideo.livingroom' 2>/dev/null | awk '/https:/{getline; print $2; exit}') -d 'https://app.primevideo.com/detail?gti=amzn1.dv.gti.2ca173b4-1d07-4930-bcee-32452c49c0ff'"}]
+4.10s ADB: 192.168.68.109 - am start -n $(dumpsys package 'com.amazon.amazonvideo.livingroom' 2>/dev/null | awk '/https:/{getline; print $2; exit}') -d 'https://app.primevideo.com/detail?gti=amzn1.dv.gti.2ca173b4-1d07-4930-bcee-32452c49c0ff'
+4.43s Starting tune match text monitoring. Match commands: [{'match_text': ["who's watching", 'watch live', 'new', 'guest'], 'commands': [{'type': 'ADB', 'command': 'input keyevent KEYCODE_DPAD_CENTER'}], 'check_after_seconds': 5}]
+5.00s Fixed delay (5s) elapsed; starting real stream.
+9.43s Tuning completed after 9.43 seconds. Display was on, application (com.amazon.amazonvideo.livingroom) was running.
+9.43s Initializing keep active command schedule for tuner TS4K (1).
+10.46s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+12.47s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+15.35s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+18.15s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+21.14s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+24.20s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+27.17s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+30.21s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+32.49s Possible video playback failure (type 1)
+33.26s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+36.25s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+39.23s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+42.42s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+45.25s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+48.33s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+51.30s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+54.30s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+57.34s Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+1:00 Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+1:03 Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+1:06 Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+1:10 Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+1:12 Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+1:15 Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+1:18 Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+1:21 Text match result: Text to match: ["who's watching", 'watch live', 'new', 'guest']. Matches found: None.
+3:25 Releasing tuner 1 as it has been inactive for 10 seconds.
+3:25 Releasing tuner: {'lock_obtained': 1792862364, 'tuner_name': 'TS4K', 'name': 'Prime Test', 'number': 9599, 'provider_name': '', 'tuner_id': 1, 'channel_id': 150, 'url_or_identifier': 'https://app.primevideo.com/detail?gti=amzn1.dv.gti.2ca173b4-1d07-4930-bcee-32452c49c0ff', 'tuning_status': 'tuned', 'request_key': 'E6PG5dUCEDuNuAYKZnBTBJ', 'target_package': 'com.amazon.amazonvideo.livingroom', 'playback_monitor': {'last': 3560682158984581, 'stalled_since': 1792862375.4381542, 'reported': True}}
+3:25 Using configuration: FruitDeepLinks - Prime Video v3.0 (FireTV and AndroidTV) (bnhf) (a176643f-b3b6-47fb-8527-47908d089695) for channel cleanup.
+3:25 Post tune commands: [{'type': 'ADB', 'command': 'input keyevent KEYCODE_MEDIA_STOP'}, {'type': 'ADB', 'command': 'input keyevent KEYCODE_HOME'}]
+3:25 [Pool 1] ADB: 192.168.68.109 - input keyevent KEYCODE_MEDIA_STOP
+3:26 [Pool 1] ADB: 192.168.68.109 - input keyevent KEYCODE_HOME
+3:26 Released tuner (1).
+3:26 Cleanup complete. TS4K (Prime Test)
Can you share the screenshot? I will look into this. Thanks!
Update: Prime Video working on TS4K
I got Prime lanes working on my TiVo Stream 4K (Android TV) with two adult Household profiles. On the TS4K, ADBTuner's text matching reads no on-screen text once Prime is open, so the v3.0 config never detected the "Who's watching?" screen.
The fix/hack was to replace text matching with timed key presses: launch the deep link, wait 7 seconds and press Select to pick the top profile, then wait 5 seconds and press Select on Watch Live.
"tune_commands": [
"am start -n $(dumpsys package '||TARGET_PACKAGE_NAME||' 2>/dev/null | awk '/https:/{getline; print $2; exit}') -d '||TARGET_URL_OR_IDENTIFIER||'",
"sleep 7",
"input keyevent KEYCODE_DPAD_CENTER",
"sleep 5",
"input keyevent KEYCODE_DPAD_CENTER"
],
"tune_match_text_commands": [],
Timing related solutions can work, but are not ideal -- as such timings can vary by device, or other factors.
Fixing the identification and selection of profiles, or other prompts is the real fix.
Totally agree hence the hack reference.
Did you delete your Guest profile? With that gone, New is the only potential match word left.
Also, did you try adding J. and Lauren to your match words?
Yes, guest was deleted and I added J. and Lauren to the match words.
- Screen shows "J.", "Lauren", and "New" (screenshots based on the screenshots from ADBTuner's tuning start and playback start).
- Every check returns "Matches found: None", and no "On screen text" is logged while the picker is up.
- Plain Tesseract reads "Lauren" from the same screenshot.
So the capture looks fine, but the text matching isn't reading it.
What resolution is the Android device running at? And what is the encoder outputting? And where did this image come from (ADBTuner log, video frame, adb screenshot)?
ADBTuner matches the string "Lauren" in the image here.
Edit: This one is interesting, Tesseract sees the text when the image is downsized to 540p, but misses when it's 1080p. Looking into a fix.
Both the Android device and encoder are running at 1080.
I copied the image from the ADBTuner webadmin page.
I just pushed a new development build 20261026-1. Can you try that and let me know if it fixes this issue for you?
This is also fixed in 20261026-1.
It worked and selected the correct profile, once I realized I had to modify @bnhf's config to include both profile names in the match text. Unfortunately there's no live event right now to confirm it clicks all the way through to playback. I'll test it Thursday during TNF and report back.
Actually, adding real profile names is certainly an option, but it should also work using Guest (not sure why you removed that profile) and New. The idea with using those match words is that customization should not be required.
Hard copy; removed that profile years ago. Honestly, no clue why. I guess it was to make things harder on myself in the future 
Thanks for help and the quick responses to figure this out.
Issue: ADBTuner redirects stream before Hulu tuning completes.
I'm running 20260505-1 ADBTuner on Docker on Synology NAS with ~90% reliability and troubleshooting intermittent Hulu Live TV recording failures. I'm using ONN 4K streaming devices, JTech HDMI encoders.
My logs show:
- ADBTuner redirects Channels DVR to the encoder after 19.02 seconds.
- The log explicitly says:
Tuning is still in progress. - Hulu is still displaying startup/profile-selection screens during this period.
- ADBTuner doesn't complete tuning until approximately 33.93 seconds.
- Increasing the tuning delay to 30 seconds did not resolve the issue.
I have a few questions:
- Is there a configurable setting that controls when ADBTuner redirects the client to the encoder while tuning is still in progress?
- Can ADBTuner wait until playback is detected before redirecting Channels DVR to the encoder?
- If this isn't configurable, would correcting the behavior require a change to ADBTuner's stream-handling logic?
- What exactly does
use_fixed_delaycontrol? Does it affect the initial stream redirection or only the tuning/playback-detection process? - Is there a recommended approach for preventing Channels DVR from recording Hulu startup screens or error messages when tuning is delayed or fails?
My goal is reliable unattended recordings without introducing unnecessary delays to successful tunes.
disregard. Just updated to 20261026-1. recordings are no longer showing hulu menus. Love this! Thanks for all you are doing to enable us to access the many streaming service choices while still using CDVR.
