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

Can I use this to import the feed of hockey games from the FanDuel sports app into ChannelsDVR? If so, ELI5?

Much like ADBTuner, this project is intended to be used with linear channels for which there is guide data.

If FanDuel meets those first two requirements, the next consideration would be developing the scripts to do the virtual tuning.

It's not overly complicated, if you have experience with Bash scripting. However, no work has been done to support this particular app, so you'd need to be willing/able to do the work

@bnhf Does the fire tv live scripts work on the Prime Video app on Google TV or would something have to be developed?

Subbing to Fan Duel through Prime Channels adds the linear feed to the live tv guide.

I've never tested the firetv/livetv scripts on non firetv devices, but I doubt they would work. The concepts used for stepping through a live TV guide would likely be at least similar though.

The trickest part of the whole process on the FireTV, was that a unique M3U had to be created for each device, as each channel had its own unique device-specific identifier. Those M3Us were created at ah4c spin-up, and once created, everything functioned as usual.

Stepping through a Live TV guide is not a fast process, so you want to limit the number of channels to less than 30 if possible.

If the Google TV supports a way jump directly to a channel in the live guide (with search or channel numbers), that would make things way easier. No way to do that on the FireTV -- it was strictly a up/down arrow process.

New to channels, recently Iā€™ve moved out of xfinity territory and into spectrum territory and with this they have discontinued cable card support for new accounts, Iā€™ve tried to get them but they wonā€™t budge even with a fcc complaint. Has anyone explored this HDMI method with the cable companies boxes instead of a streaming device? It only costs me $10 per HD box on spectrum, it would be nice to have 3 of them each connected to a encoder/capture card in the server and the ability for channels to send IR remote commands to tune the box to the requested channel, similar to how channels will request an HD home run to tune to a channel. This would solve the issue of cable companies refusing to issue cable cards. I also have access to a Dish setup, and extra Joey boxes are only $5-$7 a month.

One thing I miss with my Xfinity+HDHR setup was the ability to stream any channel from anywhere, without the ridiculous ā€œin homeā€ restrictions.

I haven't used this to send IR control requests but it should be possible with this. You'll probably have to do it through some extra hardware and curl.

NextPVR has this functionality built in and it works well so maybe use that and add it on as a Custom Channel?

@ChannelSam and maybe one or two others use ah4c with AppleTV boxes running the Spectrum app. I think this would be better than trying to capture from a stack of cable boxes using IR tuning.

1 Like

And cheaper. Those box fees ain't cheap :rofl::joy:

1 Like

@Tyson_Semetkoskey

My setup uses multiple used ATV 4k's (spent between $45-$55 for them on Ebay) that I installed Spectrum App on, LinkPi HDMI encoder and ah4c:appletv build. I have another ATV 4k waiting that I haven't but in the system yet.
Spectrum doesn't currently support 3rd party android and firetv hardware for their app.
Their is a Roku app but it doesn't support deeplinks or channel number inputs.
You could buy/rent the Spectrum Xumo boxes and send it IR commands or possibly adb commands if these boxes support that. I wasn't willing to pay for something that is just a "restricted" android box.
My setup works pretty flawlessly the only issue I have had is if you are on a channel longer than 4hours it brings up the still watching screen and even if you send pyatv remote commands it will not clear the dialog box. It keeps insisting you use a remote to respond and doesn't seem to see the commands coming in from the pyremote program as equivalent.

It is on my list to set up an IR emitter to send an IR command before this timer shows up but I have been side tracked and haven't gotten to it. The only time this is really needed is for really long movies or sporting events...I should have this done and know if it works before next years football season starts

2 Likes

Similarly I have setup RS232 by toying with the scripts and chatgpt, and ripped out the adb portion and replaced it with tcp commands to control legacy devices. Same concept will work with IR. I'm looking at upgrading my setup for directv osprey boxes with network IR emitters since adb is a pain for me every month or so when i need to reauth on the directv osprey boxes. I have been playing around with a global cache IP to IR device and it receives commands over a network and controls just about anything with IR. Worth looking at if you ran into similar quirks with adb. It is my only quirk so far.

I've been polishing up a new "autocrop" capability for ah4c. This is something that will appeal particularly to Xfinity customers that also have a LinkPi Encoder.

As Xfinity subscribers know, there are six premium movie channels offered, that are broadcast with black borders on all four sides. This is annoying to say the least, and generally results in those channels not being watched.

I though about using ffmpeg for this project, but that would mean using CPU/GPU power on a Docker host to re-process a stream already being encoded. It made more sense to me to do the needed cropping (while preserving the aspect ratio) along with the encoding. The downside is the need to use an encoder's API (which may not always be available), but LinkPi has one -- so I'm using it!

Here's what I'm doing:

For any channels specified in a new CROP_CHANNELS env var, when watching live or recording, the stream will be evaluated to determine the pixel dimensions of the viewing area (to get the aspect ratio), and to determine the pixel size of the black bars. The black bars will then be removed on the sides, and the top/bottom black bars reduced proportionally with the aspect ratio.

The process will then sleep for the length of time of the current airing, when the cropping will be removed briefly, to allow the next movie (or whatever) to begin so the process can be repeated. This allows for "marathon" viewing on a given premium channel, with autocrop adjustments made per event.

Recordings work the same way. Also, if you are watching one of these channels in real time, and tune away before the conclusion, cropping will be reset to zeros on the encoder.

If there's anyone interested in helping with some of the final testing on this, let me know, and I'll give you the details on the new Docker Compose required. I'm pretty happy with the way this is coming together, and given that I almost never watched these channels due to this black border nonsense, it's a nice upgrade.

Here's what it looks like "behind the scenes" (i.e. inside the container) when recording a channel using autocrop. Note there's also a script running that defeats the 4-hour Still Watching pop-ups:

root        1307       1  0 21:35 ?        00:00:00 /bin/bash ./scripts/firetv/xfinity/bmitune.sh SHOCe-65782923196768
root        1310    1307  0 21:35 ?        00:00:00 /bin/bash ./192.168.1.93/keep_watching.sh
root        1312    1310  0 21:35 ?        00:00:00 sleep 4h
root        1416       1  0 21:36 ?        00:00:00 /bin/bash /opt/192.168.1.52/stream0.sh
root        1426    1416  0 21:36 ?        00:00:00 sleep 9237

The stream0.sh script will reset the cropping, when the event's start_time+duration is reached. If one was tucking-in for back-to-back movies, or recording a marathon, the keep_watching script would keep the pop-ups away. :slight_smile:

3 Likes

I am trying to get Direct TV Stream set up in AH4C using a fire tv stick 4k max
STREAMER_APP=scripts/firetv/dtvstream
For the source in Channels I have MPEG-TS and the URL of http://192.168.4.35:7654/m3u/dtvstream.m3u
I can view what is happening in my encoder page. If I click on a channel, the DTV app opens and sits there for quite awhile, then a keyboard appears and the channel name is entered. The channel opens and plays. Sometimes it will work and will continue to play, but usually it doesnā€™t. The app closes, then the firetv goes to sleep. I donā€™t see any problem in the AH4C log. It just calls stopbmitune.sh
I noticed that sometimes the search will bring up a list of programs, rather than the channel. SYFY and HGTV both did this. In the direct TV app I can manually tune to these stations, so it isnā€™t finding something like OnDemand

I tried dtvstreamdeeplinks.m3u, but I could not get it to work at all.

Ever since we've been able to tune with deeplinks, I haven't been maintaining the remote control emulation version. When DTV makes any changes to the app, the process typically needs tweaking.

The deeplink approach is really the way to go these days, though you do need to capture the deeplinks that are right for you -- which vary significantly by region and package.

If you haven't done that, look at this post, and several related posts after it:

The remote control emulation approach was good, when that was the only option -- but deeplinks are super reliable, faster, and less subject to app interface changes.

Just curious. I have a similar setup with spectrum on ATVs. I do not have the issue with the still watching message. I record sports all the time that are > 4 hours and have never seen that. In the Spectrum app settings under preferences, I have the Sleep Timer set to 12 hours. I have always assumed that is what this setting does. Is yours set that way?

@chasut
Funny you should mention it. This past week I was going through all the settings on the Spectrum App while upgrading/setting up another one on a different box and saw the 12 hour thing. I thought I had set them all for the longest time possible when I first set each one up but...

I don't know if the longest time possible was changed at some point during an App upgrade in the last year+ and I didn't realize it but my primary ATV 4k Tuner was set at 4hrs while the other one was set to 12 hours. :man_shrugging:

I did a test play and left it run for over 8 hours so I think that issue is probably solved. :+1:

I am still going to finish working on my IR control project.
My parts arrived from alixpress and digikey this week (that is why I was setting up another ATV I have, to use as a test bed)
I am attempting to build an ip to ir controller that uses an ESP32 and I believe it would be able to control up to 8 ir emitters that can send separate unique signals to different hardware.
Global Cache makes the IP2IR Ethernet to IR box but it costs at least $65 used on ebay and is usually running closer to $80 and up. It can only control 3 IR outputs.
If I don't use it for something now, I will at least have it in my back pocket just in case...I have now seen a couple xumo streaming boxes on ebay for $20 without a remote...I would never pay $60 for these basterized locked down android boxes...but at $20 I would consider them for Spectrum tuners if I need more tuners...I also worry that Spectrum will suddenly decide to disable deeplinks on ATV or just screw it up with an update.

I looked through the dtvstreamdeeplinks.m3u and the resourceId was correct for the stations that I pay for.
They are listed as
http://{{ .IPADDRESS }}/play/tuner/CNNHD~d3603aea-f5d8-e789-786c-43c5e8799428
Is this correct? The post you pointed to has a different format
I still have no joy.

That's the correct format -- though the ID portion is not correct for me, as I'm a satellite customer.

So what do you mean by no joy? Where is it failing? Posting some ah4c Portainer logs would probably be helpful. Restart the container, and try to tune to one channel, then grab the logs -- all the way back to container start so we can figure out what's going on.

And, just to be sure there's not something basic amiss, go ahead and post the env vars from your ah4c Portainer-Stack. Also a few details about your setup might be helpful, like what OS are you running CDVR on, and is Docker/Portainer on the same host?

Be sure to post your logs in a code block (3 backticks before and after the text) to keep things readable and compact.

EDIT: BTW, the difference in format with the Callsign and the ResourceID, is just to allow us to pass both values from the M3U to the scripts (separated by a tilde). Those two values are then used in the expected deeplink format when sent via adb.

@user3162

For example, here's a complete container start and single channel tune I did, so you can see what it's supposed to look like:

127.0.0.1	localhost

::1	localhost ip6-localhost ip6-loopback

fe00::0	ip6-localnet

ff00::0	ip6-mcastprefix

ff02::1	ip6-allnodes

ff02::2	ip6-allrouters

172.20.0.2	ah4c

192.168.110.50 firestick-rack1

192.168.110.192 firestick-rack2

192.168.110.41 firestick-rack3

192.168.110.162 firestick-rack4

192.168.110.116 firestick-travel2

192.168.110.130 encoder_48007

192.168.110.49 encoder_23393

* daemon not running; starting now at tcp:5037

* daemon started successfully

List of devices attached

connected to firestick-rack1:5555

connected to firestick-rack2:5555

connected to firestick-rack3:5555

connected to firestick-rack4:5555

failed to connect to 'firestick-travel2:5555': Host is unreachable

Existing ./scripts/firetv/directv/prebmitune.sh found, and will be preserved

Existing ./scripts/firetv/dtvdeeplinks/prebmitune.sh found, and will be preserved

Existing ./scripts/firetv/directv/bmitune.sh found, and will be preserved

Existing ./scripts/firetv/dtvdeeplinks/bmitune.sh found, and will be preserved

Existing ./scripts/firetv/directv/stopbmitune.sh found, and will be preserved

Existing ./scripts/firetv/dtvdeeplinks/stopbmitune.sh found, and will be preserved

Existing directv.m3u found, and will be preserved

Existing dtvdeeplinks.m3u found, and will be preserved

Existing dtvosprey.m3u found, and will be preserved

Existing dtvstream.m3u found, and will be preserved

Existing dtvstreamdeeplinks.m3u found, and will be preserved

Existing foo-fighters.m3u found, and will be preserved

Existing fubo.m3u found, and will be preserved

Existing hulu.m3u found, and will be preserved

Existing livetv.m3u found, and will be preserved

Existing nbc.m3u found, and will be preserved

Existing npo.m3u found, and will be preserved

Existing pbs-seatac.m3u found, and will be preserved

Existing pbs-worcester.m3u found, and will be preserved

Existing silicondust.m3u found, and will be preserved

Existing sling.m3u found, and will be preserved

Existing spectrum.m3u found, and will be preserved

Existing xfinity.m3u found, and will be preserved

Existing youtubetv_shield.m3u found, and will be preserved

Existing youtubetv.m3u found, and will be preserved

[START] ah4c is starting

[ENV] Not loading env

[ENV] IPADDRESS                  htpc6:7654

[ENV] ALERT_SMTP_SERVER          smtp.gmail.com:587

[ENV] ALERT_AUTH_SERVER          smtp.gmail.com

[ENV] ALERT_EMAIL_FROM           [Redacted]

[ENV] ALERT_EMAIL_PASS           [Redacted]

[ENV] ALERT_EMAIL_TO             [Redacted]

[ENV] ALERT_WEBHOOK_URL          

[ENV] ALLOW_DEBUG_VIDEO_PREVIEW  

[ENV] Creating tuner             1

[ENV] ENCODER1_URL               http://encoder_48007/0.ts

[ENV] TUNER1_IP                  firestick-rack1:5555

[ENV] CMD1                       

[ENV] TEECMD1                    

[ENV] PRE SCRIPT                 ./scripts/firetv/dtvdeeplinks/prebmitune.sh

[ENV] START SCRIPT               ./scripts/firetv/dtvdeeplinks/bmitune.sh

[ENV] STOP SCRIPT                ./scripts/firetv/dtvdeeplinks/stopbmitune.sh

[ENV] REBOOT SCRIPT              ./scripts/firetv/dtvdeeplinks/reboot.sh

[ENV] Creating tuner             2

[ENV] ENCODER2_URL               http://encoder_48007/4.ts

[ENV] TUNER2_IP                  firestick-rack2:5555

[ENV] CMD2                       

[ENV] TEECMD2                    

[ENV] PRE SCRIPT                 ./scripts/firetv/dtvdeeplinks/prebmitune.sh

[ENV] START SCRIPT               ./scripts/firetv/dtvdeeplinks/bmitune.sh

[ENV] STOP SCRIPT                ./scripts/firetv/dtvdeeplinks/stopbmitune.sh

[ENV] REBOOT SCRIPT              ./scripts/firetv/dtvdeeplinks/reboot.sh

[ENV] Creating tuner             3

[ENV] ENCODER3_URL               http://encoder_48007/8.ts

[ENV] TUNER3_IP                  firestick-rack3:5555

[ENV] CMD3                       

[ENV] TEECMD3                    

[ENV] PRE SCRIPT                 ./scripts/firetv/dtvdeeplinks/prebmitune.sh

[ENV] START SCRIPT               ./scripts/firetv/dtvdeeplinks/bmitune.sh

[ENV] STOP SCRIPT                ./scripts/firetv/dtvdeeplinks/stopbmitune.sh

[ENV] REBOOT SCRIPT              ./scripts/firetv/dtvdeeplinks/reboot.sh

[ENV] Creating tuner             4

[ENV] ENCODER4_URL               http://encoder_48007/12.ts

[ENV] TUNER4_IP                  firestick-rack4:5555

[ENV] CMD4                       

[ENV] TEECMD4                    

[ENV] PRE SCRIPT                 ./scripts/firetv/dtvdeeplinks/prebmitune.sh

[ENV] START SCRIPT               ./scripts/firetv/dtvdeeplinks/bmitune.sh

[ENV] STOP SCRIPT                ./scripts/firetv/dtvdeeplinks/stopbmitune.sh

[ENV] REBOOT SCRIPT              ./scripts/firetv/dtvdeeplinks/reboot.sh

[ENV] Creating tuner             5

[ENV] ENCODER5_URL               http://encoder_23393/0.ts

[ENV] TUNER5_IP                  firestick-travel2:5555

[ENV] CMD5                       

[ENV] TEECMD5                    

[ENV] PRE SCRIPT                 ./scripts/firetv/dtvdeeplinks/prebmitune.sh

[ENV] START SCRIPT               ./scripts/firetv/dtvdeeplinks/bmitune.sh

[ENV] STOP SCRIPT                ./scripts/firetv/dtvdeeplinks/stopbmitune.sh

[ENV] REBOOT SCRIPT              ./scripts/firetv/dtvdeeplinks/reboot.sh

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.

 - using env:	export GIN_MODE=release

 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /favicon.ico              --> github.com/gin-gonic/gin.(*RouterGroup).StaticFile.func1 (2 handlers)

[GIN-debug] HEAD   /favicon.ico              --> github.com/gin-gonic/gin.(*RouterGroup).StaticFile.func1 (2 handlers)

[GIN-debug] Loaded HTML Templates (11): 

	- editm3u.html


	- logs.html


	- m3us.html

	- status_and_logs.html

	- config.html


	- edit.html

	- index.html

	- routes.html

	- status.html

	- stream.html

	- 

[GIN-debug] GET    /static/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (2 handlers)

[GIN-debug] HEAD   /static/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (2 handlers)

[GIN-debug] GET    /                         --> main.run.func1 (2 handlers)

[GIN-debug] GET    /routes                   --> main.run.func2 (2 handlers)

[GIN-debug] GET    /play/tuner:tuner/:channel --> main.run.func3 (2 handlers)

[GIN-debug] GET    /m3u/:channel             --> main.run.func4 (2 handlers)

[GIN-debug] GET    /env                      --> main.run.func5 (2 handlers)

[GIN-debug] GET    /logs/text                --> main.run.func6 (2 handlers)

[GIN-debug] GET    /logs                     --> main.run.func7 (2 handlers)

[GIN-debug] GET    /status/andlogs           --> main.run.func8 (2 handlers)

[GIN-debug] GET    /logs/json                --> main.run.func9 (2 handlers)

[GIN-debug] GET    /video                    --> main.run.func10 (2 handlers)

[GIN-debug] GET    /status                   --> main.statusPageHandler (2 handlers)

[GIN-debug] GET    /api/status               --> main.apiStatusHandler (2 handlers)

[GIN-debug] GET    /stream                   --> main.run.func11 (2 handlers)

[GIN-debug] GET    /test/webhook             --> main.run.func12 (2 handlers)

[GIN-debug] GET    /test/email               --> main.run.func13 (2 handlers)

[GIN-debug] GET    /status/channelsactivity  --> main.run.func14 (2 handlers)

[GIN-debug] GET    /edit                     --> main.run.func15 (2 handlers)

[GIN-debug] POST   /save                     --> main.run.func16 (2 handlers)

[GIN-debug] POST   /m3usave/:file            --> main.run.func17 (2 handlers)

[GIN-debug] GET    /m3us                     --> main.run.func18 (2 handlers)

[GIN-debug] GET    /editm3u/:file            --> main.run.func19 (2 handlers)

[GIN-debug] GET    /config                   --> main.run.func20 (2 handlers)

[GIN-debug] POST   /configsave               --> main.run.func21 (2 handlers)

[START] ah4c is ready

[GIN-debug] Listening and serving HTTP on :7654

> ws-scrcpy@0.8.1-dev start

> node ./index.js

Listening on:

	http://ah4c:8000 http://localhost:8000

	http://127.0.0.1:8000 http://172.20.0.2:8000

	http://[::1]:8000

[firestick-rack4:5555] start server: "24184"

[GIN-debug] Request: 100.98.232.107 GET /static/logos/exit.png, latency: 345.141Āµs, status: 200

[GIN-debug] Request: 100.98.232.107 GET /static/logos/reboot.png, latency: 452.634Āµs, status: 200

Attempting network tune for device http://encoder_48007/0.ts firestick-rack1:5555 HBOwHD~6da0d147-0635-4fe0-a003-19c6dc089af5 

[EXECUTE] Running [./scripts/firetv/dtvdeeplinks/prebmitune.sh firestick-rack1:5555 HBOwHD~6da0d147-0635-4fe0-a003-19c6dc089af5]

[EXECUTE] Stdout: 'already connected to firestick-rack1:5555

Starting: Intent { cmp=com.att.tv/com.clientapp.MainActivity }

Starting com.att.tv on firestick-rack1:5555

prebmitune.sh is exiting for firestick-rack1:5555 with exit code 0

'

[EXECUTE] Stderr: '+ streamerIP=firestick-rack1:5555

+ streamerNoPort=firestick-rack1

+ adbTarget='adb -s firestick-rack1:5555'

+ mkdir -p firestick-rack1

+ trap finish EXIT

+ main


+ adbConnect

+ adb connect firestick-rack1:5555

+ local -i adbMaxRetries=2

+ local -i adbCounter=0

+ true

+ adb -s firestick-rack1:5555 shell input keyevent KEYCODE_WAKEUP

+ local adbEventSuccess=0

+ [[ 0 -eq 0 ]]

+ break



e

+ packageLaunch=com.clientapp.MainActivity

+ packageName=com.att.tv

++ adb -s firestick-rack1:5555 shell pidof com.att.tv

+ packagePID=

+ '[' '!' -z ']'

+ adb -s firestick-rack1:5555 shell am start -n com.att.tv/com.clientapp.MainActivity

+ echo 'Starting com.att.tv on firestick-rack1:5555'

+ finish

+ echo 'prebmitune.sh is exiting for firestick-rack1:5555 with exit code 0'

'

[EXECUTE] Finished running ./scripts/firetv/dtvdeeplinks/prebmitune.sh in 1.41769269s

[EXECUTE] Running [./scripts/firetv/dtvdeeplinks/bmitune.sh HBOwHD~6da0d147-0635-4fe0-a003-19c6dc089af5 firestick-rack1:5555]

[IO] io.Copy: write tcp 172.20.0.2:7654->100.111.146.77:58369: write: broken pipe

[IOINFO] Successfully copied 57742340 bytes

[IOINFO] Transfer speed: 4.243280688625403 Mbits/second

Performing Close() for firestick-rack1:5555

[EXECUTE] Running [./scripts/firetv/dtvdeeplinks/stopbmitune.sh firestick-rack1:5555 HBOwHD~6da0d147-0635-4fe0-a003-19c6dc089af5]

[EXECUTE] Stdout: 'Current PID for this script is 134

Not a special channel (exit nor reboot)

Active audio stream not yet detected -- loudness is -70.0 LUF. Continuing...

Active audio stream not yet detected -- loudness is -70.0 LUF. Continuing...

Active audio stream not yet detected -- loudness is -70.0 LUF. Continuing...

Active audio stream detected with -17.2 LUF.

Starting: Intent { act=android.intent.action.VIEW (has data) cmp=com.att.tv/com.clientapp.MainActivity }

bmitune.sh is exiting for firestick-rack1:5555 with exit code 0

'

[EXECUTE] Stderr: '++ echo HBOwHD~6da0d147-0635-4fe0-a003-19c6dc089af5

++ awk -F~ '{print $2}'

+ channelID=6da0d147-0635-4fe0-a003-19c6dc089af5

++ echo HBOwHD~6da0d147-0635-4fe0-a003-19c6dc089af5

++ awk -F~ '{print $1}'

+ channelName=HBOwHD

+ specialID=HBOwHD

+ streamerIP=firestick-rack1:5555

+ streamerNoPort=firestick-rack1

+ adbTarget='adb -s firestick-rack1:5555'

+ packageName=com.att.tv

+ packageAction=com.clientapp.MainActivity

+ [[ false == '' ]]

+ speedMode=false

+ trap finish EXIT

+ main

+ updateReferenceFiles

+ mkdir -p firestick-rack1

+ [[ -f firestick-rack1/stream_stopped ]]

+ echo 0

+ [[ -f firestick-rack1/last_channel ]]

+ echo 0

+ echo 134

+ echo 'Current PID for this script is 134'

+ matchEncoderURL

+ case "$streamerIP" in

+ encoderURL=http://encoder_48007/0.ts

+ specialChannels

+ '[' HBOwHD = exit ']'

+ '[' HBOwHD = reboot ']'

+ [[ -f firestick-rack1/adbCommunicationFail ]]

+ echo 'Not a special channel (exit nor reboot)'

+ launchDelay

+ local lastChannel

+ local lastAwake

+ local timeNow

+ local timeElapsed

+ local maxTime=14400

+ lastChannel=0

+ lastAwake=0

++ date +%s

+ timeNow=1742180256

+ timeElapsed=1742180256

+ '[' -f firestick-rack1/adbAppRunning ']'

+ activeAudioCheck 42 true 0 1

++ date +%s

+ local startTime=1742180256

+ local maxDuration=42

+ local minimumLoudness=-50

+ local sleepBeforeAudioCheck=0

+ local sleepAfterAudioCheck=1

+ local preTuneAudioCheck=true

+ true



0

++ ffmpeg -t 1 -i http://encoder_48007/0.ts -filter:a ebur128 -map 0:a -f null -hide_banner -

++ awk '/I:        /{print $2}'

+ checkLoudness=-70.0

++ date +%s

+ ((  1742180261 - 1742180256 > 42  ))

++ echo '-70.0 > -50'

++ bc -l

+ ((  0  ))

+ echo 'Active audio stream not yet detected -- loudness is -70.0 LUF. Continuing...'



1

+ true



0

++ ffmpeg -t 1 -i http://encoder_48007/0.ts -filter:a ebur128 -map 0:a -f null -hide_banner -

++ awk '/I:        /{print $2}'

+ checkLoudness=-70.0

++ date +%s

+ ((  1742180268 - 1742180256 > 42  ))

++ echo '-70.0 > -50'

++ bc -l

+ ((  0  ))

+ echo 'Active audio stream not yet detected -- loudness is -70.0 LUF. Continuing...'



1

+ true



0

++ ffmpeg -t 1 -i http://encoder_48007/0.ts -filter:a ebur128 -map 0:a -f null -hide_banner -

++ awk '/I:        /{print $2}'

+ checkLoudness=-70.0

++ date +%s

+ ((  1742180274 - 1742180256 > 42  ))

++ echo '-70.0 > -50'

++ bc -l

+ ((  0  ))

+ echo 'Active audio stream not yet detected -- loudness is -70.0 LUF. Continuing...'



1

+ true



0

++ ffmpeg -t 1 -i http://encoder_48007/0.ts -filter:a ebur128 -map 0:a -f null -hide_banner -

++ awk '/I:        /{print $2}'

+ checkLoudness=-17.2

++ date +%s

+ ((  1742180280 - 1742180256 > 42  ))

++ echo '-17.2 > -50'

++ bc -l

+ ((  1  ))

+ echo 'Active audio stream detected with -17.2 LUF.'

+ break

+ echo HBOwHD

+ tuneChannel

+ adb -s firestick-rack1:5555 shell am start -n com.att.tv/com.clientapp.MainActivity dtvnow://deeplink.directvnow.com/play/channel/HBOwHD/6da0d147-0635-4fe0-a003-19c6dc089af5

Warning: Activity not started, intent has been delivered to currently running top-most instance.

+ echo -e '#!/bin/bash\n\nwhile true; do sleep 4h; adb -s firestick-rack1:5555 shell am start -n com.att.tv/com.clientapp.MainActivity dtvnow://deeplink.directvnow.com/play/channel/HBOwHD/6da0d147-0635-4fe0-a003-19c6dc089af5; done'

+ chmod +x ./firestick-rack1/keep_watching.sh

+ finish

+ echo 'bmitune.sh is exiting for firestick-rack1:5555 with exit code 0'

+ [[ -n 4h ]]

+ nohup ./firestick-rack1/keep_watching.sh

Terminated

'

[EXECUTE] Finished running ./scripts/firetv/dtvdeeplinks/bmitune.sh in 1m48.869562694s

[EXECUTE] Stdout: 'Streaming stopped for firestick-rack1:5555

Sleep initiated for firestick-rack1:5555

firestick-rack1/stream_stopped written with epoch stop time

'

[EXECUTE] Stderr: '+ streamerIP=firestick-rack1:5555

+ streamerNoPort=firestick-rack1

+ adbTarget='adb -s firestick-rack1:5555'

+ packageName=com.att.tv

+ [[ false == '' ]]

+ speedMode=false

+ main

+ bmituneDone

+ bmitunePID=134

++ pgrep -f firestick-rack1/keep_watching.sh

+ keepWatchingPID=217

++ ps -o ppid= -p 217

+ keepWatchingPPID='    216'

++ pgrep -P 217

+ keepWatchingCPID=218

+ ps -p 134

+ [[ -n 4h ]]

+ pkill -P 216

+ kill 218

+ rm ./firestick-rack1/keep_watching.sh



p

+ [[ false == \t\r\u\e ]]

+ stop='am force-stop com.att.tv'

+ adb -s firestick-rack1:5555 shell am force-stop com.att.tv



2

+ echo 'Streaming stopped for firestick-rack1:5555'

+ adbSleep

+ sleep='input keyevent KEYCODE_SLEEP'

+ adb -s firestick-rack1:5555 shell input keyevent KEYCODE_SLEEP

+ echo 'Sleep initiated for firestick-rack1:5555'

+ date +%s

+ echo 'firestick-rack1/stream_stopped written with epoch stop time'

'

[EXECUTE] Finished running ./scripts/firetv/dtvdeeplinks/stopbmitune.sh in 3.016701781s

[GIN-debug] Request: 100.111.146.77 GET /play/tuner/HBOwHD~6da0d147-0635-4fe0-a003-19c6dc089af5, latency: 1m53.355905624s, status: 200

I have Docker Desktop and Portainer in Win11
When I clicked on CNN the DTV app opened, but stayed on that home page. The keyboard appeared after awhile, but no text was entered. Then the app closed.
My env

TAG=latest
DOMAIN=localdomain
ADBS_PORT=5037
HOST_PORT=7654
WSCR_PORT=7655
IPADDRESS=192.168.4.35:7654
NUMBER_TUNERS=1
TUNER1_IP=192.168.4.225:5555
ENCODER1_URL=http://192.168.4.89:81/ts/1_0
TUNER2_IP=
ENCODER2_URL=
TUNER3_IP=
ENCODER3_URL=
TUNER4_IP=
ENCODER4_URL=
TUNER5_IP=
ENCODER5_URL=
STREAMER_APP=scripts/firetv/dtvstream
CHANNELSIP=192.168.4.213
ALERT_SMTP_SERVER= 
ALERT_AUTH_SERVER= 
ALERT_EMAIL_FROM= 
ALERT_EMAIL_PASS= 
ALERT_EMAIL_TO= 
UPDATE_SCRIPTS=true
UPDATE_M3US=ftrue
TZ=US/Eastern
SPEED_MODE=false
KEEP_WATCHING=4h
HOST_DIR=/data