FruitDeepLinks — Universal Sports Aggregator for Channels DVR

TL;DR:
Scrapes Apple TV’s Sports tab and builds a single sports EPG for Channels DVR, with deeplinks to 18+ streaming services. One guide to rule them all.

What It Is

FruitDeepLinks turns Apple TV’s Sports tab into a unified sports guide that lives inside Channels DVR.

Instead of checking 5+ apps/endless containers (partly my fault!) (ESPN, Prime Video, Peacock, Apple TV, Paramount+, etc.) to see who’s playing where, you get:

  • One EPG
  • One set of virtual channels
  • Click → jump straight into the right app/stream

Supported Services (current beta)

Major sports streamers

  • ESPN
  • ESPN+
  • Prime Video (including Thursday Night Football)
  • Peacock (native app + web fallback)
  • Paramount+

Network apps

  • CBS
  • CBS Sports
  • NBC Sports
  • FOX Sports
  • TNT
  • truTV

Specialty / league / OTT services

  • Apple MLS Season Pass (web)
  • Apple MLB Friday Night Baseball (web)
  • DAZN
  • Max (HBO Max, web)
  • F1 TV (web)
  • ViX
  • NFL+

(“18+” depending on how you count native vs web variants.)

Smart Filtering (v1.0)

You decide what appears in your guide:

  • :white_check_mark: Enable/disable individual services
  • :white_check_mark: Hide sports you don’t watch
  • :white_check_mark: Hide specific leagues/competitions
  • :white_check_mark: Automatically prefer better deeplinks (e.g., ESPN+ app over web)
  • :white_check_mark: Treat web-only providers (Apple MLS, Max web, Peacock web, etc.) as separate toggles

Example:
Only have ESPN+ and Peacock? Turn everything else off and your guide shrinks to just the games you can actually watch.

Virtual Channels

FruitDeepLinks exports into Channels DVR as:

  1. Direct Channels
  • One channel per event
  • Great for: “I want a channel per game.”
  1. Scheduled Lanes
  • 10–50 rotating “sports” channels
  • MLB at 1pm, NBA at 4pm, NFL at 7pm across multiple services
  • Great for: “just give me channels to surf”

Web Dashboard

Simple browser UI to:

  • See refresh status
  • Toggle services/sports/leagues
  • Apply filter changes in seconds (no full rescrape)
  • View/download your M3U + XMLTV outputs

Coming Soon / Roadmap

:fire: Near-Term

  • Chrome Capture / AH4C integration
    • For web-only providers (Max, F1 TV, Apple web, etc.)
    • Click channel in Channels DVR → Fire TV wakes → browser/app opens → stream starts
  • Smarter filters
    • Time-of-day (e.g., “only after 6pm”)
    • Team filters (only your teams)
    • Network preferences (e.g., prefer CBS over Paramount+)
    • Blacklist specific games/series

:rocket: Future Ideas

  • More data sources (ESPN+ API, richer Peacock data, regional sports where possible)
  • Per-user profiles (kids, power-user, etc.)
  • Advanced scheduling and “Red Zone” style channels
  • Integrations beyond Channels DVR (Plex/Emby/etc. if there’s interest)

Why It Matters

Sports rights are split across 20+ apps. Apple’s Sports tab is the closest thing to a unified view, but it’s read-only.

FruitDeepLinks:

  • :white_check_mark: Builds one EPG across all your services
  • :white_check_mark: Plugs into Channels DVR instead of replacing it
  • :white_check_mark: Uses native app deeplinks wherever possible
  • :white_check_mark: Filters down to only what you can actually watch
  • :white_check_mark: Keeps itself updated automatically

Platform Notes

  • :white_check_mark: Fire TV / Apple TV / Android TV — best experience, deeplinks work great
  • :warning: Roku — limited, mostly web fallback
  • :question: Others — untested (for now)

Status

  • Version: 1.0 (internal beta... guide/m3u working - tested on AppleTV, we'll see how well it works on Firesticks....)
  • Release: Public repo targeted for Q1 2025
  • License: MIT (free & open source)
  • Repository: Coming soon (cleaning it up for public release)

Feedback Wanted

If this sounds useful, I’d love to hear:

  • What streaming services you actually use
  • Which sports/leagues matter most to you
  • Whether Chrome Capture / AH4C integration would be a game-changer

This is a passion project born from frustration with fragmented sports streaming. Feedback and “it’d be a must-have if…” ideas are very welcome.

6 Likes

I got Prime, Peacock, Paramount, HBO Max, ESPN+ on hand and I usually watch NBA, NHL, MLS, EPL, Champions League, and a bit of Serie A and LA Liga

Whens the beta for this so I can test it out? :rofl::joy:

This sounds EXACTLY like what I'd want. Like a super sized EPlusTV.

I'm happy to test it out and give feedback, this plus the Channels multi view would be a dream for my viewing habits.

3 Likes

Out of curiosity, how do you handle changing events in the "lanes" M3U?

That’s a tough one. In the ESPn4CC4C version, I tried to make every reshuffle have “sticky” events that wouldn’t change. At some point though, I just have to accept the data I’m given and roll with it. GIGO. But assuming most sports events don’t change dates/times so normally not a huge deal unless someone refreshes too often and reshuffles the deck.

1 Like

Specifically, if you have one lane that has a game at noon and then another game at 7 PM — what does the line for that lane look like in the M3U? Does the M3U itself change and need to be updated between events?

Ohhhh. Yea that’s still the killer feature we need the CDVR devs help with. I think we’ve traded a few messages that there’s just no good way at this time. I was able to solve it with chrome capture by doing a redirect to a website, but that won’t work with stream links.

So with this project right now, direct M3U for each channel per event.

I am creating lanes as well, but the only hack would be have the M3U update extremely often with a current URL. I don’t want to hammer CDVR server but in theory could do a forced refresh every 5 minutes on this source. Not very elegant but only idea I got atm. Perfect world would be Redirect thru some sort of proxy or even my idea about storing the Streamlink URL in the XML TV file.

1 Like

Could a potential solution be a redirect link in the m3u and have a backend running to change where that link redirects too?

1 Like

Yup, that's the idea!

1 Like

one wild idea I had and actually kind of works, but again not pretty and hacky.

  1. Create say 30 "lanes" streamlinks as videos in video collection (example below)
brad@bradmini:/media/brad/DVR/Imports/Videos$ ls
lane1.strmlnk  lane2.strmlnk

brad@bradmini:/media/brad/DVR/Imports/Videos$ cat lane1.strmlnk
sportscenter://x-callback-url/showWatchStream?playID=8aac40e6-a4a3-472c-b90d-a351f3c0961c

Then, have each Channel in the M3U call a proxy server that in turn calls a curl command to the Channels client DVR:

curl -X POST http://192.168.86.58:57000/api/play/recording/1533

Then, Channels client opens the streamlink'ed app.... this app could in theory just keep updating those files and keep the URL updated with the now playing link.

yeaaaaa not pretty, but def a workaround... i know @tmm1 loves a good hack, but this one is a little hairy.. maybe it'd be simplier if he'd make a Streamlink API call for us? not sure how we'd determine what client is calling for the streamlink though....

3 Likes

Would like to see the WNBA in there under Speciality/league/OTT services. Thanks!

1 Like

This might be a dumb question, but I currently use mlbserver and eplustv with ADBTuner, is this going to be in addition to those things, or an eventual replacement?

think MLB still provides non-DRM streams, so you can stay with that. Until of course they introduce DRM then we can find a way to grab the deep link schedule someday.

EPlusTV — maybe?

My goal is just to have a simple catch-all app for all the sports Streamlinke apps that have deep link access. I’m not an expert by any means on ADBTuner, but I think once the dust settles, my man @bnhf will take a look and see if he can make ADBTuner work with more of these apps. I suspect some may be too complex, but he’s pretty crafty!

2 Likes

just thought i'd share results of latest scrape:

App / TV services

  • ESPN (sportscenter) – 646 playables
  • Prime Video (aiv) – 627 playables
  • Paramount+ (pplus) – 183 playables
  • NFL+ (nflctv) – 25 playables
  • Max (max) – 19 playables
  • DAZN (open.dazn.com) – 15 playables
  • CBS Sports (cbssportsapp) – 13 playables
  • NBC Sports (nbcsportstve) – 8 playables
  • FOX Sports (fsapp) – 7 playables
  • ViX (vixapp) – 4 playables
  • F1 TV (f1tv) – 3 playables
  • Apple MLS Season Pass (apple_mls) – 2 playables
  • CBS (cbstve) – 1 playable
  • truTV (watchtru) – 1 playable
  • Prime Video TNF (gametime) – 1 playable

Total app/TV playables: 1,531

Web-based playables (direct browser links--will work on AppleTV not sure about Android/firesticks)

  • Peacock (Web) – 36 playables (60.0%)
  • Max – 19 playables (31.7%)
  • F1 TV – 3 playables (5.0%)
  • Apple MLS – 2 playables (3.3%)

Total web playables: 60

Grand total across all providers: 1,591 playables.

4 Likes

I realize you probably mean Q1 2026...
I am really looking forward to experimenting with this. :slight_smile:
Should be a FANTASTIC addition to the Cannels Add-On Eco System! :clap:

:rofl:. I’m actually pretty close to a beta version I could put out for brave souls.

It’d be limited to direct M3U (so like right now it looks for all events with +24 hours and created about 350 channels). XML looking great too. It does create lanes like ESPN4CC4C but kinda useless without some sort of ADBTuner as haven’t figured out a workaround for dynamic streamlinks.

And honestly I don’t even subscribe to most of these services so those with the services would be helpful!

4 Likes

I'm here, man. I'll test it out

[BETA] FruitDeepLinks – Apple Sports → Channels DVR (looking for Fire TV / Android testers)

I’ve opened up a public beta of FruitDeepLinks, a Docker app that scrapes Apple’s Sports aggregation and builds a unified sports EPG for Channels DVR, with deep links out to the various streaming apps.

Right now, Apple TV should handle all deeplinks correctly. I’m specifically looking for feedback from Fire TV / Android TV users about what works, what doesn’t, and which providers misbehave.

What’s working best today

The most stable feature is:

  • Direct channels (recommended)
    • M3U: http://YOUR-SERVER-IP:6655/direct.m3u
    • XMLTV: http://YOUR-SERVER-IP:6655/direct.xml
    • Add as a Custom Channels source in Channels DVR, and set Stream Format = STRMLINK in that source.

This creates a bunch of “one channel per event” entries in Channels – great for browsing specific games.

Lanes & ADB lanes are BETA / experimental – You can safely ignore multisource_lanes* and the ADB provider outputs for now. They’re coming later once the core behavior is solid.

Install (Docker / Portainer)

Repo: https://github.com/kineticman/FruitDeepLinks

Simplest path (Portainer, Git stack):

  1. Add a new stack from repository:
  • Repository URL: https://github.com/kineticman/FruitDeepLinks.git
  • Reference: main
  • Compose path: docker-compose.yml
  1. Set these env vars in the stack:
SERVER_URL=http://YOUR-SERVER-IP:6655
FRUIT_HOST_PORT=6655
TZ=Your/Timezone

(Optional but nice for auto-refresh: CHANNELS_DVR_IP and CHANNELS_SOURCE_NAME=fruitdeeplinks.)
3. Deploy the stack and open the web UI at
http://YOUR-SERVER-IP:6655.

From there you can tweak service filters and run a manual refresh.

What I’d love feedback on

Especially from Fire TV / Android TV users:

  • Which apps open correctly (ESPN+, Prime Video, Peacock, Paramount+, etc)?
  • Any apps that don’t honor the deeplink or drop you in a weird place?
  • Any crashes / hangs when launching from Channels?

Feel free to post:

  • Your device (Firestick model / Android TV box).
  • Example event that failed (league + teams + provider).
  • What you expected vs what actually happened.

This is still early beta, but the direct channels path is pretty solid, and I’d love to tighten up cross-device behavior before turning on more advanced features like lanes and ADB provider feeds.

2 Likes

I should note-- scrape takes about ~10 minutes. Be patient.

I am hoping to be able to look at this sometime late this weekend or early next week. Family commitments always get in the way of fun. :man_shrugging: :joy:

I understand that you will need the subscriptions for each service in order to view them but I would like to understand what is needed to actually just scrape for all the "channels"

Does it require an AppleTV and/or Android box as a "proxy" with all the desired apps installed on it or does it just scrape the web for the "feeds" inside the docker container?

If I am understanding everything else right...when selecting a stream it will then send the the command to open the App/Deeplink on the desired AppleTV and/or Android box...