AndroidHDMI for Channels (ah4c): A virtual channel tuner using HDMI Encoder(s) + streaming stick(s)

First command ran without error but Tivo screen got stuck on "who's watching" screen waiting for the profile to be chosen and this came back: Starting: Intent { dat=https://www.hulu.com/... cmp=com.hulu.livingroomplus/.WKFactivity }

2nd one I tried got CNN to play! And it came back with this response: Warning: Activity not started, intent has been delivered to currently running top-most instance. Did you just prove that deeplinks works on this Tivo Stream 4K?

Just tried the tivo with ADBtuner and it works. Not sure what I did wrong on 1st attempt with it but you were right! Thanks for all of your help.

1 Like

Only the activity and logs options are relevant to Docker installations, and even those are of modest value, as the logs available through Portainer are best. You can pretty much ignore the WebUI, as it's mostly for non-Docker users, of which there are very few.

There are others that can help you more with Osprey specifics, but generally yes, a big part of what people like about ah4c is being able to customize the scripts.

prebmitune.sh wakes up the streaming device, or does any other quick setup to prepare for tuning.

bmitune.sh does the virtual tuning.

stopbmitune.sh puts the device to sleep, or performs any other post tune requirements.

All three scripts must exist, but the can be no-op, if they're not needed.

That doesn't require scripts modification, but is rather done this way:

1 Like

Glad to hear it!

What's the advantage in doing it this way vs the ffmpeg approach?

I would have incorporated your script into OliveTin, but it was Windows specific. And actually, I was able to duplicate those couple hundred lines of Python in what's essentially a single jq command. Tools like jq make Bash a pretty sweet way to go for scripts like this.

This has been pushed as bnhf/olivetin:latest (aka bnhf/olivetin:2026.03.29), and the new Create an ah4c DirecTV M3U is available in the classic Dashboard or Project WebUI+.

2 Likes

I guess when I see PowerShell being used in a script, I don't really think of it as cross-platform, but maybe I'm wrong.

I went to bed early last night so I didn't notice the osprey option (opt 1) generates a m3u with deeplinks. I was expecting channel#'s

got

#EXTINF:-1 channel-id="77" channel-number="77" tvc-guide-stationid="122696",MeTV
http://{{ .IPADDRESS }}/play/tuner/MeTV~83321f4e-2ac2-9dc4-a1fd-7b0a0f8c1e5f

expected

#EXTINF:-1 channel-id="77" channel-number="77" tvc-guide-stationid="122696",MeTV
http://{{ .IPADDRESS }}/play/tuner/77

not sure if @bnhf adjusted this or not.

Added an option to the new Action to generate deep link or channel number style URLs in the M3U. The M3U appears in the results window, and can be copy and pasted as desired:

1 Like

works great!

I've been separating my ah4c instances to single out some heavy use channels so lots of playing with m3u's

fyi, the tamper monkey One-click install project ah4c only shows fields for 2 tuners, but errors out required arg not provided: TUNER3_IP

the Olivetin One-click page works but does not auto populate
IPADDRESS: htpc6:7654
or
CHANNELSIP: media-server8

For anyone using Spectrum it looks like they have finally got around to adding an app for FireTv Devices according to Cord Cutters News.
CordCutters - Spectrum on FireTv

Supposed to become available on April 15th and supposedly also has a new multiview feature. This may already be in the ATV version that I use for tuners but I haven't looked. :man_shrugging:

Hopefully they remembered to support deeplinks also!
I will do some experimenting when I get a chance after the 15th.

1 Like

@bnhf. Could you add the provider in the event there is a need to combine m3us from different providers? Recall you had helped me to get a this going where the relevant m3u lines look like the following for providers yttv, dtv, and max:

http://{{ .IPADDRESS }}/play/tuner/yttv~831~Htmhm0ywaTg
http://{{ .IPADDRESS }}/play/tuner/dtv~truTVHD~1b10de5e-3e3b-488f-9740-bec197244114
http://{{ .IPADDRESS }}/play/tuner/max~~300dbdc3-db0a-513c-8b25-2341eb00c469~0e95ada4-129a-5759-9d8a-d04ac349223b

It looks right, but of course the proof will be in its functionality. Let us know. :slight_smile:

1 Like

I went with a one-line change in the DockerFile, to remove those two incompatible menu items during the container build. Just pushed as bnhf/ah4c:latest (aka bnhf/ah4c:2026.04.04):

It's also tempting to just remove this menu completely, though the M3U editor can be handy, so I'll probably leave it.

The more valuable WebUI included with ah4c is ws-scrcpy, where you can interact with your streaming sticks via an ADB shell:

Or, via "Configure stream" to interact with the stick's UI:

1 Like

These specific issues are fixed in bnhf/olivetin:latest (aka bnhf/olivetin:2026.04.05).

They'll be in the next build.

1 Like

I have. I've actually started checking and usually find that the adb permission window popped up, but you need to be on the menu screen to see it. I've actually been thinking of changing that setting in my boxes so I can keep better track of the issue.

I also noticed that on a per box basis you must walk thru the favorites selection for the user profile your going to use. if you exit out of it, it will just continue popping up every few days.
this issue also goes away with a 2nd tune
also from my notes; My Favorites (if Animation is off in dev options, the UI may hang. press enter, exit, list, home, or guide to force reset 'dtv app')
i set my animation to .5 now and it actually seems faster than animations off.

1 Like

been thinking the same thing, but never checked. I'm glad you know how to ask the machine questions right. I've never been good at that with even humans.

is that the denominator? the linkpi reboot? I hadn't isolated yet, but would like to re-create the issue before trying the fix. (I just know that when I rebooted everything I had the issue)

actually I don't think this was my issue. I think it's the adb thing for me, I know somethings messed up in my setup. like how both ah4c stacks are using the same directory.

so without the sleep 1, using channel # tuning, even on an old c71kw-200, when I rewind to see the tuning process, I can see the osprey wake up a 1/2sec before ch# is inputed. :+1:
I'm actually ok with that sleep 1, but think I'll leave it for now, and keep a better eye on what my failure point is.

what's the best way to script the ch# input everytime even when channel isn't changing? this would be helpful in my constant playing with toys, and i'll only see it on the ending padding of reordings.