got it... the data already exists in the DB so just a matter of finding a way to grab it easy for new hybrid approach. on the case.
Is the idea that ADBTuner would get the actual deep link URL by querying another URL?
Does anybody know how to combine ESPN with another service (ie. DTV Stream)? I have been moving around lately but I would love to have this combined with DTV Stream. I don't record much so I have 2 HDMI devices on hand. I don't want to limit espn-ah4c or ah4c to 1 device each...
check this test out.. is this what you'd like to see? this was relatively easy to grab. i just had to edit the vc_resolver script. any other format u want, i can provide. ill push to git under ESPN4CC4C.
curl -sS "http://127.0.0.1:8094/whatson/9?format=txt"
8fca688b-e27b-4352-a188-4a5438c21eac
example for your script
LANE=9
PLAYID=$(curl -sS "http://<resolver-host>:8094/whatson/$LANE?format=txt")
if [ -n "$PLAYID" ]; then
adb -s 192.168.86.37:5555 shell am start -n com.espn.gtv/com.espn.startup.presentation.StartupActivity -d "sportscenter://x-callback-url/showWatchStream?playID=$PLAYID"
else
echo "No active event on lane $LANE"
fi
Yes.
The deeplink IDs ESPN+ uses for live events are always changing, as are the events. @KineticMan has already established a structure (for use with cc4c), that sets up a fixed number of channels, and then slots those events into those channels.
So my thinking is, in ADBTuner, we set each one of the virtual channels up in ADBTuner and then when someone wants to watch that event, we know that whatever is currently showing in the guide on channel x is what they want -- and we can get the deeplink using a curl command in an ADBTuner Custom Config to get the correct deeplink UUID.
Seems easy enough (as @KineticMan demo'd just above) -- unless you have another idea?
Perfect-o. Nice work.
Stay tuned. I think we'll have something along these lines very soon, using ADBTuner.
Sounds pretty straightforward. I was thinking I could help out by adding support for dynamic URLs such as this so it wouldn't necessarily require a custom configuration.
Merged into main. Put some documentation too. Let me know if you need anything else.
I don't know that it would be necessary because @bnhf is working on something with ADBTuner configurations, but if you could include the full deeplink url in the response I could have ADBTuner parse it natively.
{
"ok": true,
"lane": 6,
"event_uid": "3355a8ae-9719-472c-9017-1f0be2b774ce:dbc4b7c1b7d56ea7f2c4e10118cb8126",
"at": "2025-11-06T22:26:20+00:00",
"deeplink_url": "sportscenter://x-callback-url/showWatchStream?playID=3355a8ae-9719-472c-9017-1f0be2b774ce:dbc4b7c1b7d56ea7f2c4e10118cb8126"
}
With this perhaps we could have an ADBTuner URL configured like this?
http://x.x.x.x:8094/whatson/6?dynamic=1¶m=deeplink_url
sure - just so we're clear - i'm applying this to ESPN4CC4C. DeepLinks doesnt do any "lane/channel planning"
-
/whatson/{lane}and/whatson_allnow include adeeplink_urlin JSON. - You can also grab just the deeplink as plain text for easier parsing.
- Add
dynamic=1if you want it resolved live (what’s playable right now).
Quick examples
JSON (includes deeplink_url):
http://<host>:8094/whatson/6?dynamic=1
Sample response:
{
"ok": true,
"lane": 6,
"event_uid": "3355a8ae-...8126",
"at": "2025-11-06T22:26:20+00:00",
"deeplink_url": "sportscenter://x-callback-url/showWatchStream?playID=3355a8ae-...8126"
}
Plain text (short form; good for ADBTuner “open URL”):
http://<host>:8094/whatson/6?dynamic=1&fmt=txt¶m=deeplink_url
Returns:
sportscenter://x-callback-url/showWatchStream?playID=3355a8ae-...8126
Plain text (explicit “full” form; same URL today, but locked for future):
http://<host>:8094/whatson/6?dynamic=1&fmt=txt¶m=deeplink_url_full
Empty when nothing playable (TXT comes back blank; JSON has deeplink_url: null):
http://<host>:8094/whatson/6?dynamic=1&fmt=txt¶m=deeplink_url
Returns:
<empty>
I'm really sorry, I probably should have explained better. That's my fault.
The url query string args "dynamic" and "param" were for ADBTuner's use. You did far more work than I was asking for.
All I was looking for was to have the "deeplink_url" added to the response from http://<host>:8094/whatson/6. However, if you would prefer that we request that by including a specific parameter I can understand that.
For reference, I was thinking that ADBTuner would just do something like the following. If "dynamic" and "param" are included in the query string then ADBTuner would strip those parameters from the URL and then query the ESPN4CC4C endpoint. ADBTuner would use the value of the "param" argument to find the value in the returned JSON.
ESPN4CC would only see http://<host>:8094/whatson/6 in the request.
if {"dynamic", "param"} <= set(query_params):
clean_url = url_query_cleaner(tuning_url, ["dynamic", "param"], remove=True)
url_data = httpx.get(clean_url, timeout=5).json()
if url_data:
dynamic_url = url_data.get(query_params["param"][0], None)
if dynamic_url:
tuning_url = dynamic_url
Edit: This is just one parameter ("dynamic_url_json_key") in ADBTuner now.
If you want, I could submit a pull request, I had just figured it was a one-liner so I didn't bother. Thanks again.
ahhhhh... i wondered why you wanted that dynamic param..
you want it in json output, or plain text? way easier lol....
JSON is fine. If your existing response just included that field that would be awesome.
{
"ok": true,
"lane": 1,
"event_uid": "7be1c665-b635-4e6e-95ad-8a6ba6b13018:59018f34f0de2248cc92d1c0909924b3",
"at": "2025-11-07T19:43:51+00:00",
"deeplink_url": "sportscenter://x-callback-url/showWatchStream?playID=7be1c665-b635-4e6e-95ad-8a6ba6b13018:59018f34f0de2248cc92d1c0909924b3"
}
For testing purposes I had just added it to vc_resolver.py in the whatson() function. I didn't take a deep dive or anything so it's very possible I'm over simplifying it.
if kind == "event" and eid:
...
deeplink_url = f"sportscenter://x-callback-url/showWatchStream?playID={eid}"
return JSONResponse(
{
"ok": True,
"lane": normalized_lane,
"event_uid": eid,
"at": when_iso,
"deeplink_url": deeplink_url,
},
status_code=200,
)
this work?
# Plain-text deeplink (short)
curl -sS "http://192.168.86.72:8094/deeplink/6"
sportscenter://x-callback-url/showWatchStream?playID=7be1c665-b635-4e6e-95ad-8a6ba6b13018
# JSON with short deeplink included
curl -sS "http://192.168.86.72:8094/whatson/6" | jq .
```json
{
"ok": true,
"lane": 6,
"event_uid": "7be1c665-b635-4e6e-95ad-8a6ba6b13018:59018f34f0de2248cc92d1c0909924b3",
"at": "2025-11-07T19:43:51+00:00",
"deeplink_url": "sportscenter://x-callback-url/showWatchStream?playID=7be1c665-b635-4e6e-95ad-8a6ba6b13018"
}
This would work. Thanks!
And here are the steps to set it up:
@tmm1 do you still think a new "redirect://" STRMLNK protocol might be possible? This would allow programs like this and FruitDeepLinks — Universal Sports Aggregator for Channels DVR to more easily deliver changing content on virtual channels.
Can someone provide a list of the ESPN app deeplinks for all their linear channels (hopefully including ESPN on ABC)? I use my own scripts to launch and monitor apps with ADB control similar to how ah4c works because I created them long before ah4c was initiated. Just need to have the links to set up my own launcher.
This would be for Android TV.
So just to respond to my own post, did some digging and got the app to launch on a Fire Stick 4k Max with this command:
am start -S -a android.intent.action.VIEW -d sportscenter://x-callback-url/showWatchStream?playChannel=espn com.espn.gtv/com.espn.startup.presentation.StartupActivity
But it just launches the app to home screen, doesn't play channel. What am I missing?
EDIT: just to close this out - after some testing and confirmation with Claude decompiling and probing the ESPN APK, no way to get these via deeplinks.