APITuner — ADB-free virtual tuner for Android TV / Google TV

APITuner v0.1.15

Docker: ghcr.io/matthewfkoch/apituner:0.1.15 (or :latest)
Agent: Release APITuner v0.1.15 · matthewfkoch/APITuner-releases · GitHub

Fixes

  • ESPN / App Play no longer opens the Play Store when the wrong package is set (com.espn.gtv vs com.espn.score_center)
  • Launch retries primary → alternate → ESPN family until one opens
  • Clearer failures when the app isn’t installed

New

  • Channels → Check packages — flags packages missing from Agent devices; channel editor has a searchable installed-app picker

After pull, restart the container. Agent update optional for this release (server-side fixes), but latest APK is fine if you’re updating anyway.

For ESPN App Play, prefer com.espn.score_center with alternate com.espn.gtv (or use Check packages and pick what’s actually installed)

New version, new errors


logs

I've been away from my testing env so I haven't been able to test the last few releases against actual devices. This release should hopefully be much better.

APITuner v0.1.16 is out.

Docker: ghcr.io/matthewfkoch/apituner:0.1.16 (or :latest)
Agent APK: Release APITuner v0.1.16 · matthewfkoch/APITuner-releases · GitHub
Changelog: https://github.com/matthewfkoch/APITuner/blob/main/CHANGELOG.md

What’s new

  1. ESPN / Leanback apps — Agent and ADB now open apps that only have a TV (LEANBACK_LAUNCHER) activity. This was the “app installed but launch failed / no activities” case on Fire and Google TV (e.g. com.espn.gtv / com.espn.score_center).
  2. Auto-pair — Pair modal can OCR the PIN from your HDMI encoder feed (Auto-pair). Needs a stream URL; ffmpeg/tesseract are in the Docker image. Manual PIN entry still works.
  3. Fire setup — Grant permissions (ADB) shows on Network ADB tuner cards as well as Agent cards. Tuner form auto-fills ports when you switch backend (9092 / 5555 / 6466 + pair 6467).
  4. Clearer launch errors — Agent reports why open failed (not installed vs no launcher activity) instead of a bare failed.

Update

docker pull Package apituner · GitHub

Install Agent 0.1.16 on each device (or use Update Agent on the tuner card). On Fire, run Grant permissions (ADB) once after upgrading if overlay / Send keys went red.

For ESPN App Play: confirm the package with Check packages (com.espn.gtv on Fire/Amazon, com.espn.score_center on many Google TV builds), set Keys / D-pad, then retune.

Well...new version, new errors

The onn puck will give up half way to tuning into the channel and go to the play store for some odd reason

The firetv will give up as well and just do nothing while on the espn app.

You may want to test things out yourself here if you have an ESPN account. I see the sourcecode and it seems like you're giving a lot to cursoragent. I use AI too but you gotta keep an eye on it as they can hallucinate and create a brand new issue

Anyways logs

I don't know what to tell ya man, everything works on my end. The code is there if you have any interest in getting your edge case to work. Thanks for testing.

Ehh...I thank you for your efforts. Looked good outside of that btw.

I may have to stick with adbtuner for now...

So I am testing apituner and when I import my directv lineup from olivetin to adbtuner then export to apituner I am getting a duplicate channel error. please correct this. thanks. It would be much simpler if olivetin supported this directly.

edit: Also would be great if there was a "install apk via adb" button

What would be required for this? A particular JSON format?

1 Like

Apituner follows the same json format as adbtuner. Don't know if they follow the same api commands as apituner @waltgrace

1 Like

New bnhf/olivetin:latest (aka bnhf/olivetin:2026.09.01) pushed this afternoon with support for producing an APITuner compatible DirecTV JSON file, containing that specific subscriber's set of available channels:

Screenshot 2026-09-01 at 14-52-53 OliveTin - Organizr V2

apituner is still showing no channels.

I copied the output into apituner but I get this:

Duplicate channel numbers: 213 (MLB Network / MLB Network Alternate), 305 (ION East / WNBA on ION 2 / WNBA on ION 1 / WNBA on ION 3), 610 (Big Ten / Big Ten Network Overflow 2 / Big Ten Network Overflow 3 / Big Ten Network Overflow 4), 619 (NBC Sports 1 / NBC Sports 2), 635 (MSG ALT-1 / MSG ALT-2 / MSG ALT-3 / MSG Sportsnet HD 635). Give each channel a unique number before importing.

Do you use multiple sources as backups for certain channels? I think the gap may be that ADBTuner allows for duplicates to be used as a backup. If this is the case I can look at implementing this but I only prioritized certain parity between ADBTuner and APITuner. ADBTuner is also not open source so it's hard to know how things work under the hood.

I do not have multiple sources. I am just trying to get my 1 directv stream account set up. I think it is viewing channel 213 and 213.1 as the same channel plus others similar.

Just pmed you my json. thanks.

APITuner v0.1.21 is out (server only — no Agent APK update).

What’s new: DirecTV / OliveTin / ADBTuner lineups with duplicate dial numbers (e.g. two channels at 213) and subchannels (213.1, 100.2) import cleanly. Each channel gets a stable internal id; M3U tvg-chno stays the same so Channels can stack alternates.

Upgrade: docker pull ghcr.io/matthewfkoch/apituner:0.1.21, restart, re-import your channel list if needed (Replace all for a full lineup), then rescan the Custom Channels M3U in Channels DVR (stream URLs are now /stream/{id}).

Legacy /stream/{number} still works when the number is unique. Questions welcome in the thread.

@waltgrace Channel numbers are an interesting subject for DTV users, as many that use this provider have been using them for years and want to be able to tune by channel number.

To complicate things, when they introduced HD many years ago, they used the same number as the SD channels -- and continue to do so to this day. Another wrinkle, is that a number of channels have overflow or alternates that also carry the same channel number.

So, what we've been doing in (I believe all) of the other capture/encoder projects is to use .1, .2, .3, and so on, to differentiate these channels. This keeps them in the same relative order in the guide, while giving them a pseudo unique number.

Just wanted to give you a dash of history on this, given that channel numbers are basically non-existent for most streaming services, but continue to be important to at least some of DTV's long contrail of subscribers.

Are you saying there were duplicate channel numbers in the JSON submitted by @techpro2004? If so, I'd like to see that, as any duplicates are supposed to be assigned a .1, .2, .3 and so on, based on a number of rules. I'm assuming here the JSON he submitted to you was created by Project One-Click.

It appesrs to be subnumbers not duplicates

Perfect, that's what we want to see!