FruitDeepLinks — Universal Sports Aggregator for Channels DVR

Fox and ESPN were giving me fits to automate node CC4C full screen. I couldn't get the URL check to work with either source. Decided to try an sending the F as an Else which is working for both Fox and ESPN+. Running via node in windows, put the below in main.js after the other else if source sections... Works well so far :slight_smile:

It only negatively impacted the Golf channel section - it ended up sending the "F" twice so Golf entered full screen then left when the "else" section ran. I just commented out the send F lines in the Golf channel section and kept the send M for mute...

// Handle ESPN and Fox with else
else {
console.log('-------------------')
console.log('Handle ESPN and Fox with else')
console.log('-------------------')
try {
// Click the full screen button
await delay (5000)
await page.keyboard.press('KeyF');
console.log("Pressed F");

console.log('-------------------')
console.log('Else option run')
console.log('-------------------')

} catch (e) {
console.log('Error for Else:', e)
}
}

I've tracked the miss time for 5 days. It triggered succesfully once and missed 4 times. All the misses were +/- an hour. So 2 hours grace would give a nice buffer. Maybe a grace period of 7200 seconds?

If you aren't comfortable with that long a grace period, I've been using a different laptop running Windows Power Automate via task scheduler to click the web interface refresh button each morning. Very cludge but it works...

log excepts: 5 execute attempts occurred between 27 minutes to 1hr 6 min late

[2026-01-05 07:27:26] [INFO] Auto refresh triggered (skip_scrape=False)

Run time of job "schedule_auto_refresh_from_settings.. (trigger: cron[hour='7', minute='0'], next run at: 2026-01-07 07:00:00 EST)" was missed by 1:06:11.723578

Run time of job "schedule_auto_refresh_from_settings.. (trigger: cron[hour='5', minute='0'], next run at: 2026-01-07 05:00:00 EST)" was missed by 0:55:42.303483

Run time of job "schedule_auto_refresh_from_settings.. (trigger: cron[hour='5', minute='0'], next run at: 2026-01-09 05:00:00 EST)" was missed by 1:05:59.208712

Run time of job "schedule_auto_refresh_from_settings.. (trigger: cron[hour='5', minute='0'], next run at: 2026-01-10 05:00:00 EST)" was missed by 1:06:57.904478

i could do that but what in the world is holding your python/docker processes up for that long? I think you have something else causing issues. the misfire grace time is just a bandaid.

  • is your computer sleeping at the time?
  • what platform? (linux/windows/mac)
  • what else are you running in docker?

That's the hundred thousand dollar question. Been messing with this for weeks and can't find what is holding up the machine...

Windows 11 pro, 16 cores / AMD Ryzen 7 5800H with Radeon Graphics
Not a lot running natively on windows:
Docker Desktop (see below for containers)
Channels DVR.exe
Node.js (CC4C)
Chrome
Windows Defender - w firewall set to off for troubleshooting
Crystal Disk info (will close tonight to see if it is the issue)
Amd video software in taskbar
NextDNS - different non blocking Cloudflare profile than the rest of my network. Use of cloudflare vs my local provider DNS solved issues using TVE for Hulu...

Windows Docker Desktop containers:
portainer, ESPN_Plus (using for Thurs night Amazon Football, as too many nonsubscribed Amazon hits for me in FDL), SamsungTVPlus-for-channels (ran several days with this stopped and didn't move the miss time), Tubi-for-channels, olivetin, fruitdeeplinks. Watchtower is stopped

Windows task manager bounces from 0 to around 10-15% CPU while streaming ESPN+ via CC4C. Mostly Chrome using the resource. Much less 0-5% when not recording or actively viewing.

Docker Desktop generally less than 0.10% of 1600% CPU while streaming ESPN+.

Power plan controls in Windows are set to "ultimate performance" now, was at High performance prior but didnt' make a difference. turn off display is never, sleep is never, hibernate is never.

The power automate script I mentioned is run on another machine.

Here is my portainer environment variables text from the stack (installed FDL via OneClick...) Think I set the Time Zone correctly as I use the same entry in other containers but here it is:

TAG=latest
DOMAIN=localdomain
FRUIT_HOST_PORT=6655
TZ=America/New_York
SERVER_URL=http://192.168.50.18:6655
CC_SERVER=192.168.50.18
CC_PORT=5589
CHANNELS_DVR_IP=192.168.50.18
CDVR_SERVER_PORT=8089
CHANNELS_SOURCE_NAME=FruitDeepLinks for CC
FRUIT_LANES=300
AUTO_REFRESH_ENABLED=true
AUTO_REFRESH_TIME=7:00
HOST_DIR=/data
FRUIT_LANE_START_CH=25001
CDVR_DVR_PATH=/mnt/D/ChannelsDVR

1 Like

wild... nothing jumps out at me either (not familiar with Crystal Disk though).

what if you set refresh to a time tonight that you could be at PC and run this on powershell 5 minutes before the call time and watch to see if something is hogging the CPU?

Get-Process | Where-Object {$_.CPU -gt 1} | Sort-Object CPU -Descending | Select-Object -First 20

also watch docker stats too?

docker stats --no-stream

I'll try that this weekend and report back on the results.

Crystal disk reports back disk drive temperature amongst other info and can notify on the desktop if out of specs - was making sure the system wasn't overheating in my enclosed entertainment cabinet as a couple folks had complained about the Beelink mini pc overheating in their reviews. All was fine, just never uninstalled...

@ScottP,

Excellent! Just tried the LIV golf event on Fox, a women's college hockey game on ESPN+, the 2025 Ryder cup on the Golf Channel, and speed skating on Peacock and all of them went to full screen without any problem. Nice work!

If I'm watching at the time of auto refresh it runs on time. Set it for 3:05pm and it ran at 3:05:13.

[2026-01-09 15:05:13] [INFO] Auto refresh triggered (skip_scrape=False)

The powershell CPU output at the time was:
PS C:\Users\scott> Get-Process | Where-Object {$_.CPU -gt 1} | Sort-Object CPU -Descending | Select-Object -First 20

Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName


2255 234 1151524 530368 17,027.94 17232 1 com.docker.backend
373 29 196616 250800 10,631.88 18196 1 Docker Desktop
1209 58 129552 102308 3,621.27 7820 1 logioptionsplus_agent
1484 59 444680 294432 1,756.55 21312 1 chrome
630 38 202936 182172 1,411.64 6824 0 remoting_host
910 95 80896 79068 1,104.30 8648 0 MSPCManagerService
965 49 138512 134936 1,089.02 16444 1 Docker Desktop
294 17 46392 57572 961.94 7912 1 com.docker.backend
200 12 2292 12096 716.16 10256 1 wsl
2164 116 189304 81956 623.30 3432 1 RadeonSoftware
6412 21 3140 10308 509.95 9784 1 AUEPMaster
109 8 1204 7420 449.75 16896 1 conhost
309 32 42952 86992 322.50 18248 1 chrome
499 20 5540 82780 267.98 16704 1 AMDRSServ
472 45 103960 52120 253.42 5704 1 AMDRSSrcExt
1718 75 86632 186884 219.48 11784 1 chrome
1085 40 58140 44564 201.47 16424 1 msrdc
3918 119 169596 289368 164.81 10592 1 explorer
760 24 8484 48692 112.23 5724 1 sihost
254 136 178860 141520 102.48 11224 1 node

Docker stats shows higher FDL resources - but it's running the scrape as I took that snapshot
PS C:\Users\scott> docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
57f973384b2f ESPN_Plus 0.00% 307MiB / 6.238GiB 4.81% 7.18MB / 14MB 10.6MB / 4.01MB 22
2f3ef8d2e609 olivetin 0.00% 7.852MiB / 6.238GiB 0.12% 1.64kB / 868B 4.66MB / 217kB 11
13361d8dc9fa fruitdeeplinks 11.65% 438MiB / 6.238GiB 6.86% 696MB / 1.22GB 4.77GB / 7.06GB 272
42182ddb6a91 static-file-server 0.00% 1.395MiB / 6.238GiB 0.02% 2.22kB / 126B 4.99MB / 0B 5
cf82ec943b6e samsung-tvplus-for-channels 0.01% 35.22MiB / 6.238GiB 0.55% 97MB / 323MB 26.8MB / 315MB 1
4f850050a185 portainer 0.04% 20.98MiB / 6.238GiB 0.33% 6.71MB / 22MB 101MB / 119MB 18
2848ccae27ec tubi-for-channels 0.01% 96.09MiB / 6.238GiB 1.50% 46.6MB / 491MB 156MB / 324MB 1

ok if it ran while your watching it, then SOMETHING is putting Docker to sleep when not active. anything else unique with your setup?

Nothing unique im aware of. Reconfirmed sleep screen and hibernate are off. In addition to the crystal disk being off for the overnight test, I placed the computer in “presentation” mode..

@KineticMan,

The conversion for the cbssports app is not adding the league to the url, so it returns a 404 error. When trying to watch a college men's basketball game (Akron vs Bowling Green), the url is cbssports.com/watch/LET-211531487 instead of cbssports.com/watch/college-basketball/LET-211531487.

1 Like

fixed

few thoughts

  • you may have some stale events in DB with old URL style as i dont want to add a migration step for just a few days.
  • this will take some maintainence as every sport may be different. keep me posted when you see new sports (like college-baseball, baseball-mlb, or whatever).

Does this necessarily require an ADB tunner?

nope! it has direct links (streamlinks) that creates a channel per event, and lanes function (multiple events per channel). direct links works great on tvOS and android, and lanes function only works with tvOS.

also works with Chrome Capture/CH4C.

Do we have to provide the links?

Also does this work to stream on mobile devices?

@KineticMan
Still working on the refresh delay - ran a full win update reinstall after DISM, SFC and CHKDSK didn't find anything wrong. Will see if it makes a difference tonight.

Had a chance to try a CC4C Max basketball game today using the multisource chrome lanes M3U. Is it possible to change the URL format to start the game directly? Now starts with two buttons - one to start live and one to watch from start. watch-sport vs sport in the URL seems to take directly to the video (still needs a click to unpause but can do that as a tweak in CC4C).

first page has watch live and watch from start
"https: //play.hbomax.com/sport/10440061-0516-538b-a098-9f71e1edfc33?utm_source=generic_apple"

if click watch from start page, requires click to start video and goes to below url
"https :// play.hbomax.com/video/watch-sport/10440061-0516-538b-a098-9f71e1edfc33/341d89ed-7eb9-4c01-9431-b46ef64529e9"

Not the button URL but also works (also requires a click to start video)
"https://play.hbomax.com/video/watch-sport/10440061-0516-538b-a098-9f71e1edfc33"

1 Like

Nope that’s the main function of this project - scrape and aggregate the deep links for you.

Mobile works good on iOS. Not tested on mobile android.

To confirm, you want it to return this schema?


https :// play.hbomax.com/video/watch-sport/10440061-0516-538b-a098-9f71e1edfc33/341d89ed-7eb9-4c01-9431-b46ef64529e9"