FruitDeepLinks — Universal Sports Aggregator for Channels DVR

I believe they are broadcasting all games on the app. Just sign in with tv provider.

1 Like

Yep...or with the streaming services (Paramount and HBO Max))

Thanks for the HBO Max config files! @bnhf I'll test later this week when those sport events are on :ok_hand:

Not sure if it really matters, but my docker install updated tonight and it is still showing as version 0.1.0

[2026-03-24 18:02:17] [INFO] FruitDeepLinks server starting...
[2026-03-24 18:02:17] [INFO] FruitDeepLinks version: 0.1.0

Any idea why the World Figure Skating Championships starting this morning on Peacock are not being scraped? Or I am doing something wrong?

@KineticMan The bump to v0.4.0 was pushed before PR#20 was merged, so it wasn't included in the latest build. Bump to v0.4.1 maybe? :slight_smile:

hmmm it looks good on my end - i can do a dummy push for 0.4.1 and see if that resolves it. I wonder if the way he upgraded didnt pull new image?

I'm seeing the same thing when I pull :latest or :v0.4.0, neither fix from PR#20 is included.

well frick.. let me try to re-merge that in somehow.

1 Like

The bump to v0.4.1 did the trick. We're good now.

2 Likes

bnhf/olivetin:latest (aka bnhf/olivetin:2026.03.25) pushed this afternoon with channel logos included for use with the FruitDeepLinks/ADBTuner integration.

These are hosted at http://<PORTAINER_HOST>:<SFS_PORT>/<Provider Code>.png:

1 Like

@bnhf HBOMax FDL March Madness games are working great with the new ADB Olivetin config updates :raised_hands:

1 Like

@KineticMan Any chance we could get an advanced custom filter? Its possible this exists and I am missing it. For instance:

  • Amazon Prime has NHL rights in Canada but not the US. I want to keep amazon prime enabled but filter out all NHL from that source
  • Apple TV has MLB on Fridays but they also host Big Inning. I use Big Inning from another tool and so I would prefer not to see that from Apple

Also, and this may be an unnecessary edge case, but would it be possible to add nhl on disney+ in addition to espn? Those NHL games seem to play for Disney+ subscribers but you can not watch them through ESPN app if you dont have ESPN+ or unlimited.

Hey

The Amazon one is real tricky. I only get generic Amazon links from the Apple scraper. Then I have another tool hit Amazon and look for the entitlement (the service they sell) and then append that. So personally, I haven’t seen that stuff as it’s probably geo-limited to my IP in the USA. I’d be happy to filter it if I knew what the resulting Amazon page returns.

Baseball may be easier - I’ll have to catch a live Amazon MLB game and see if I can derive something from it.

Hi @KineticMan,
Built some ADB lanes channels today for MLB.tv, got things working straight away. Nice work! For adb lanes, the links definitely need to be the mlbatbat:// ones. Games don't go live from the app, but figured out the trick, so will share custom config below. I also improved my NBA custom config recently, and seemed to added the Apple MLB games to my FDL compatibility multipurpose config. Sharing all below.

Also, checking to see if you saw my post a while back about F1 on Apple TV? Seems like those links should be in your scrape, as it is an Apple product. Let me know if I can help getting that going.

    "name": "FDL MLB Specific",
    "author": "nateg",
    "version": "1.0",
    "description": "MLB for FruitDeepLinks with tuning to live feed.",
    "uuid": "f5a4f2fe-d105-4286-b6ad-a405c867aa2d",
    "global_options": {
        "wait_for_video_playback_detection": true,
        "use_fixed_delay": false,
        "fixed_delay_seconds": 0,
        "wait_after_post_playback_start_commands_seconds": 0
    },
    "pre_tune_commands": [
        "input keyevent KEYCODE_MEDIA_STOP",
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "sleep 1"
    ],
    "tune_commands": [
        "am start -W -a android.intent.action.VIEW -d '||TARGET_URL_OR_IDENTIFIER||' '||TARGET_PACKAGE_NAME||'"
    ],
    "post_playback_start_commands": [
        "sleep 7",
        "input keyevent KEYCODE_MEDIA_NEXT"
    ],
    "post_tune_commands": [
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "input keyevent KEYCODE_HOME"
    ]
}
{
    "name": "FDL NBA Specific",
    "author": "nateg",
    "version": "1.1",
    "description": "NBA for FruitDeepLinks with tuning to live feed.",
    "uuid": "599c8090-0e83-4a75-9c8b-69494d1a2d75",
    "global_options": {
        "wait_for_video_playback_detection": true,
        "use_fixed_delay": false,
        "fixed_delay_seconds": 0,
        "wait_after_post_playback_start_commands_seconds": 0
    },
    "pre_tune_commands": [
        "input keyevent KEYCODE_MEDIA_STOP",
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "sleep 1"
    ],
    "tune_commands": [
        "am start -W -a android.intent.action.VIEW -d '||TARGET_URL_OR_IDENTIFIER||' '||TARGET_PACKAGE_NAME||'"
    ],
    "tune_match_text_commands": [
        {
            "match_text": [
                "nba",
                "league",
                "pass"
            ],
            "commands": [
                "input keyevent KEYCODE_DPAD_CENTER"
            ],
            "start_checking_after_seconds": 5
        }
    ],
    "post_playback_start_commands": [
        "sleep 5",
        "input keyevent KEYCODE_DPAD_DOWN",
        "sleep 1",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "sleep 1",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "input keyevent KEYCODE_DPAD_LEFT",
        "sleep 2",
        "input keyevent KEYCODE_DPAD_DOWN",
        "input keyevent KEYCODE_DPAD_CENTER"
    ],
    "post_tune_commands": [
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "input keyevent KEYCODE_HOME"
    ]
}
{
    "name": "FDL Compatibility",
    "author": "nateg",
    "version": "1.1",
    "description": "FruitDeepLinks compatibility config with tuning to the live feed.",
    "uuid": "40c81359-f241-4c63-af69-bbd76208b065",
    "global_options": {
        "wait_for_video_playback_detection": true,
        "use_fixed_delay": false,
        "fixed_delay_seconds": 0,
        "wait_after_post_playback_start_commands_seconds": 0
    },
    "pre_tune_commands": [
        "input keyevent KEYCODE_MEDIA_STOP",
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "sleep 1"
    ],
    "tune_commands": [
        "am start -W -a android.intent.action.VIEW -d '||TARGET_URL_OR_IDENTIFIER||' '||TARGET_PACKAGE_NAME||'"
    ],
    "tune_match_text_commands": [
        {
            "match_text": [
                "who's watching",
                "choose an account",
                "edit profiles",
                "watch",
                "live",
                "mlb"
            ],
            "commands": [
                "input keyevent KEYCODE_DPAD_CENTER"
            ],
            "start_checking_after_seconds": 5
        }
    ],
    "post_playback_start_commands": [],
    "post_tune_commands": [
        "am force-stop '||TARGET_PACKAGE_NAME||'",
        "input keyevent KEYCODE_HOME"
    ]
}
1 Like

Interesting…. F1 events are coming across completely different in the scraper. Some flag about “software upgrade required.” Guessing F1 support required something new on Apple end to serve up.

Anyway I got a workaround. Will get out tomorrow.

**edit- does F1 play in the Apple TV app? There’s no playable in the scrape for these events. I can synthesize one if it’s indeed inside Apple TV app.

Yes. Apple TV got the rights for it this season, in the US at least. Plays natively in the app, like MLS and Friday Night Baseball.

Ok. Problem number 2 for the examples I’ve been looking at…. They don’t put an end time to the F1 events! Do these guys just drive in a circle indefinitely?

I’ll build some “best guess” end times for F1 events but user beware!

1 Like

Haha, that is certainly some peoples opinion of the sport. I noticed MLB games is set up for a 6 hour window in my guide. Hey, with the pitch clock now, they can get those games down to a easy 5 1/2. :rofl:

90 minutes to 2 hours typically, worst case 3. Question is how much the event is padded with people talking about it in advance too. These are the reasons I want to record so many of these sporting events, so I can just zip right through the bluster and the beer commercials.

ok pushing now -- keep me updated on the F1. I noticed a few of the streams were showing Sky Sports as the provider -- not sure how that'll work out.

Version 0.5.0

  • F1 on Apple TV — F1 events now show up with proper channel info and deeplinks; added "Formula 1 (Apple TV)" as a filter option
  • Amazon channel detection fixed — HTTP-based channel lookup (faster, no browser) wasn't working inside the container; now it does
  • Kayo & Fanatiz scraping hardened — switched to more browser-like HTTP requests to reduce scraping failures
  • Amazon scraping faster — Playwright browser now launches lazily only when needed, not upfront every run
1 Like