FruitDeepLinks — Universal Sports Aggregator for Channels DVR

I was looking at the last comit on the github page.

I think you are getting your time zones reversed... the docker package shows last updated 09:09:34 -08:00 which would be 9:09am PST, which is 12:09pm EST.

Yep, I did :blush:

Same error

============================================================
[7e-migrate/13] Updating Amazon playable logical services
============================================================
============================================================
[7e-migrate/13] Migrating Amazon logical services
============================================================
================================================================================
MIGRATING AMAZON PLAYABLES TO CORRECT LOGICAL SERVICES (broadcast GTI join)
================================================================================
Traceback (most recent call last):
File "/app/bin/migrate_amazon_logical_services.py", line 291, in <module>
raise SystemExit(main())
^^^^^^
File "/app/bin/migrate_amazon_logical_services.py", line 287, in main
return migrate(args.db)
^^^^^^^^^^^^^^^^
File "/app/bin/migrate_amazon_logical_services.py", line 183, in migrate
cur.execute("""
sqlite3.OperationalError: no such column: is_stale
⚠ Step 7e-migrate FAILED (non-fatal) with exit code 1

tnx - Please try fresh update again

Finally, it works

1 Like

Latest update looks good. Thank you sir!

Well, I'm not a sports watcher. However, the Olympics in Milan are coming up. I have Peacock as my only provider for NBC/Peacock Olympics programming.

Will installing FruitDeepLinks make it simple to record opening/closing ceremonies and certain events?

Depends…. FruitDeepLinks just aggregates the deep links found for live sports and generates M3U/XML. Only way to record if your a bit of an advanced user and setup a ADB tuner/ChromeCapture. Otherwise, all it can do is jump into the associated app when you tune in.

2 Likes

@KineticMan

I'm not sure what changed, but now when I try to run the "Skip Scrape" refresh, it errors out with the following message in the log.

[2026-02-01 17:19:42] [INFO] Filters applied successfully!

[2026-02-01 17:20:00] [INFO] Manual refresh triggered (skip_scrape=True)

usage: daily_refresh.py [-h] [--vacuum-only [{apple,fruit,both}]]

[--bloat-stats-only [{apple,fruit,both}]]

daily_refresh.py: error: unrecognized arguments: --skip-scrape

[2026-02-01 17:20:00] [ERROR] Manual refresh failed with code 2

That’s odd. Not sure what I broke but easy fix. I’ll get it patched tomorrow.

pushed hotfix- The --skip-scrape flag was being checked manually in sys.argv but wasn't defined in argparse, causing 'unrecognized arguments' error when triggered from web UI.

Also, been working on a branch this weekend adding EXPERIMENTAL new services. Basically, I've got them scraping but not 100% sure of the URL schema for tvOS/and Android/Fire. Will take some experimentation from users to help deduce it, but the hard part will be done (the scrape/ingest). I'll hope to push out this week.

  • Fanatiz
  • Victory+
  • Gotham Sports

FruitDeepLinks update — four new streaming services (experimental)

I just merged a bigger update into main that adds four new streaming services to FruitDeepLinks.

All of these are experimental for now. Events will show up in the guide, but the deeplinks probably won’t work yet.

New services:

  1. Victory+ (Victory Plus)
    Regional college sports, Dallas area sports, WHL Hockey
    Right now it’s generating manifest-style URLs that still need to be turned into real deeplinks.

  2. Fanatiz
    International soccer leagues and competitions.
    Covers a lot of leagues that don’t exist elsewhere.
    Still need to figure out the deeplink format.

  3. beIN Sports
    International soccer, rugby, motorsports.
    Live events only — replays and classics are filtered out.
    Deeplink format still unknown.

  4. Gotham Sports (MSG replacement)
    NYC regional sports: Knicks, Rangers, Islanders, Devils, Yankees, Nets.
    Live events only.
    Deeplink format still unknown.

What I need help with:

Scraping is working for all of these. What’s missing is the actual deeplink formats.

If you subscribe to any of these services and are willing to help, here’s what I need:

  • Find an event in the FruitDeepLinks guide
  • Open that same event directly in the service’s app
  • Grab the deeplink / URL the app uses (method depends on platform)
  • Share the format so I can generate working links

Even a single example is useful.

How to enable them:

They’re already in main, just filtered by default.

In the FruitDeepLinks web UI:

-Go to the Logical Services filter
-Enable Victory+, Fanatiz, beIN Sports, Gotham Sports

Other small improvements in this update:
1) Cleaner ESPN-style titles with league/sport prefixes
2) Genre cleanup to avoid junk categories
3) Better provider detection in exports
4) --skip-scrape behaves better for faster refreshes

If you want to help test or poke at any of these, let me know.

Just an observation, I wanted to test the Wipe Event Data function and I don't think it is working. The results say that event data was deleted, but I'm not seeing evidence of anything happening. The database size is still the same and all previously scraped events are still present.
There is one error in the log saying this:
[ERROR] Error wiping fruit_events.db: no such table: amazon_channel_history

I suspect you may have upgraded but the scrape hadn't ran full cycle before you hit Wipe Data function (a new function at end creates those tables). That Amazon table is new and part of Daily_Refresh creates it.

Anyway, I'm going to push a quick update to account for this. thanks for the heads up!

Strange… I’ve been running the upgraded version since last Thursday with nightly cycles and this is the first time testing the wipe data function, so not sure why that table wouldn’t have been created at some point. I’ll grab the latest and test again. Thanks!

very strange indeed... check your log after next full refresh and see if something looks odd please! maybe I missed an edge case.

I pulled the latest update, ran a full refresh and tested the Wipe Events and looks like it is working now. Thanks!

1 Like

ELI5. I followed the Portainer stack install isntructions. I am seeing the webGUI say Error: Database not found under Database Stats.

Where do I select the different services and enter my credentials? I am not seeing anything under Now Playing.

You need to do an initial scrape, using the "Full Refresh" button in the FDL WebUI.

1 Like

Was looking at this morning's scrape and noticed MLB At Bat was added to list (from the Fruit company scraper).

they were historically non-DRM, but we'll see if that changes this year. Good to have another option for everyone at least.

3 Likes