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.

4 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.

1 Like

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!

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....