Looks like something is up with Docker Hub atm, I couldn't access any of my repos or fancybits repos:
Ok thank you so much, is there anyway to do it through github and if so how? The Ive only used github with CH4C and CC4C and all I know is how to clone the github app and then install npm and then run the command on cmd or powershell lol. And one last thing did the data did I show that I input seem okayh for the most part as far as you can tell? thanks!
No, this is strictly a Docker project.
Im sorry Im not sure if the last mesage was sent correctly so here it is: okay thanks, And one last thing did the data did I show that I input seem okay for the most part as far as you can tell? thanks!
Your env vars look fine. However, I'm probably the last person that used Fubo with this project, and that was a couple of years ago. It was never set up for deeplinks, so it's strictly remote control emulation. I would think ADBTuner would be a better choice for Fubo.
Ive tried running adbruner with fubo but Im not sure I know the correct format to input the url of the channels, do you know please?
You beat me too it! Your speculative tuning suggestions were spot on. Unfortunately, don't have time to post to GitHub yet, but will start here to allow others to continue on, especially @gill
Here are the scripts I modified to get Deep Links to work on the Osprey. I did test again before post to confirm these still work. They do!
Few things to consider:
- These are very stripped down for proof of concept. You can put back in features if you like.
- I only tested with local channels, and select number of cable channels, so I never built a full M3U. I reference the M3U format below.
- Just like with channel number input, there are quirks. The main is waking the Osprey, and timing around input and final display. Osprey's are older and slow. You'll just have to mess with them to find a good balance of tuning speed and reliable tuning.
- These current scripts don't obscure the Osprey Tuning process. You'll see the DTV banner. Can probably script around this if you want.
- On the bright side, these scripts should be pretty reliable out of the box. I only had one failed tune with my testing a few weeks back, and it was after a deep sleep of my Osprey test box.
PREBMITUNE
#!/bin/bash
#prebmitune.sh for osprey/dtvosprey
# 2025.09.10
#Debug on if uncommented
set -x
streamerIP="$1"
streamerNoPort="${streamerIP%%:*}"
adbTarget="adb -s $streamerIP"
mkdir -p $streamerNoPort
#Trap end of script run
finish() {
echo "prebmitune.sh is exiting for $streamerIP with exit code $?"
}
trap finish EXIT
adbConnect() {
adb connect $streamerIP
local -i adbMaxRetries=3
local -i adbCounter=0
while true; do
$adbTarget shell input keyevent KEYCODE_WAKEUP
local adbEventSuccess=$?
if [[ $adbEventSuccess -eq 0 ]]; then
break
fi
if (($adbCounter > $adbMaxRetries)); then
touch $streamerNoPort/adbCommunicationFail
echo "Communication with $streamerIP failed after $adbMaxRetries retries"
exit 2
fi
((adbCounter++))
done
}
adbWake() {
$adbTarget shell input keyevent KEYCODE_WAKEUP;
echo "Waking $streamerIP"
touch $streamerNoPort/adbAppRunning
}
main() {
adbConnect
adbWake
}
main
BMITUNE
#!/bin/bash
#bmitune.sh for osprey/dtvosprey
# 2025.09.10
#Debug on if uncommented
set -x
#Global
channelID=$(echo $1 | awk -F~ '{print $2}')
channelName=$(echo $1 | awk -F~ '{print $1}')
specialID="$channelName"
streamerIP="$2"
streamerNoPort="${streamerIP%%:*}"
adbTarget="adb -s $streamerIP"
[[ $SPEED_MODE == "" ]] && speedMode="true" || speedMode="$SPEED_MODE"
#Trap end of script run
finish() {
echo "bmitune.sh is exiting for $streamerIP with exit code $?"
}
trap finish EXIT
#Set encoderURL based on the value of streamerIP
matchEncoderURL() {
case "$streamerIP" in
"$TUNER1_IP")
encoderURL=$ENCODER1_URL
;;
"$TUNER2_IP")
encoderURL=$ENCODER2_URL
;;
"$TUNER3_IP")
encoderURL=$ENCODER3_URL
;;
"$TUNER4_IP")
encoderURL=$ENCODER4_URL
;;
"$TUNER5_IP")
encoderURL=$ENCODER5_URL
;;
"$TUNER6_IP")
encoderURL=$ENCODER6_URL
;;
"$TUNER7_IP")
encoderURL=$ENCODER7_URL
;;
"$TUNER8_IP")
encoderURL=$ENCODER8_URL
;;
"$TUNER9_IP")
encoderURL=$ENCODER9_URL
;;
*)
exit 1
;;
esac
}
#Tuning is based on channel name values from dtvdeeplinks.m3u.
tuneChannel() {
#$adbTarget shell am start -a android.intent.action.VIEW -d https://deeplink.directvnow.com/tune/live/$channelName/$channelID
$adbTarget shell am start -W -a android.intent.action.VIEW -d https://deeplink.directvnow.com/tune/live/channel/$channelName/$channelID com.att.tv.openvideo
}
main() {
tuneChannel
}
main
STOPBMITUNE
#!/bin/bash
#stopbmitune.sh for osprey/dtvosprey
# 2025.09.10
#Debug on if uncommented
set -x
streamerIP="$1"
streamerNoPort="${streamerIP%%:*}"
adbTarget="adb -s $streamerIP"
#Device sleep
adbSleep() {
sleep="input keyevent KEYCODE_SLEEP"
$adbTarget shell $sleep
echo "Sleep initiated for $streamerIP"
date +%s > $streamerNoPort/stream_stopped
echo "$streamerNoPort/stream_stopped written with epoch stop time"
}
main() {
adbSleep
}
main
M3U Format
Use the following format when building M3U. Referenced for for Call Sign and ID are all over this and the ADBTuner thread.
http://{{ .IPADDRESS }}/play/tuner/CNNHD~d3603aea-f5d8-e789-786c-43c5e8799428
Good luck and happy streaming!
I would like to order an Osprey today but, is there any chance I would be able to open Telemundo Miami with your script? Their station is WSCV. Thank you!
Gee, Is the station in your DTV subscription? Can you view it in the DTV app?
yes
Im sorry Ive never used either AH4C or Osprey thats why I want to know before I buy lol its an honest question
You’ve answered your own question!!
Ah4c allows you to tune to channels on the Osprey and view in Channels by utilizing an encoder. I would suggest you read this thread while waiting on your Osprey.
Thank you
New bnhf/ah4c:latest (aka bnhf/ah4c:2025.09.26) built today with scripts/osprey/dtvospreydeeplinks added (use dtvstreamdeeplinks.m3u with it for now). Also, Intel hardware acceleration is now enabled (Nvidia reported working too), specifically for ffmpeg encoder stream processing to clean-up captured ATSC 3.0 HDR output.
ffmpeg stream processing can also be used to hide x seconds of the beginning of ah4c output, if you don't like the virtual tuning process to be visible when you tune.
This is great, thank you! If I get a chance to continue testing, I will update my GitHub fork and submit for your review.
I am still learning some of this stuff, so as an Osprey user when I pull upgrades, do I update the variables for STREAMER_APP and CDVR_M3U_NAME at the same time? Or, if I have something that's already working, do I not change it?
If you pull an update for your docker, like latest version, you don’t need to change your composition settings in most cases. Your Osprey/streamer IP address will not changes, and neither will your streaming source.
However if you plan to try a new setup, different than how you’re tuning now, such as the recently posted Osprey Deep Link, you’d need to update your script and M3U targets.
Do you ever have to re-auth the ospreys? that's my biggest weak thing right now on these things is adb loses auth and I have to restart the docker for it to resend the prompt.
Nothing major comes to mind. A few times after Android updates. But I do restart my AH4C docker once a day for maintenance. Not sure if that is helping.
What version of Android are your Ospreys running?

