ESPN+ with Custom Channels via ADBTuner

I can make a positive contribution on the ESPN Deportes one: It just needed a space, so ESPN Deportes vs. ESPNDEPORTES. Same with ESPN Unlimited btw.

Great Stuff, Thank you.

2 Likes

I waited to reply until i was sure i was looking at a real, live, ESPN+ broadcast. Deep links still not working for me. Must be something with the Onn version of the app - any chance the uuid from the config needs to be moved, similar to the package name?

This user reported deeplinks work on Onn, but was having issues with advancing to the live point:

Weird that you're having very different fundamental issues.

Anybody else out there using this hybrid project with an Onn device?

I’ve just pushed a new ESPN4CC4C build (v5.7.x) that should make life a lot easier for anyone who’s been wrestling with filters. The big change is a new helper page at /setupfilters, plus a JSON endpoint at /filters/json. Instead of guessing at network_id, league_abbr, or which values actually exist in your current schedule, you can now hit http://<YOUR-IP>:8094/setupfilters in a browser and see real values pulled from your live database: networks, sports, leagues, categories, packages, etc. The page also gives you ready-to-copy snippets you can paste into filters.ini or translate into the new filter environment variables in your docker-compose, so you’re not editing blind anymore.

There are also some under-the-hood quality-of-life tweaks. Multi-feed games (especially NHL/NBA home/away broadcasts) are now kept as separate entries but annotated in the guide description when ESPN exposes enough metadata, so instead of two identical “Bruins vs Ducks” entries, you’ll see which one is the Bruins feed and which is the Ducks feed. XMLTV/category handling has been tightened up as well, but for most people the headline is: if filters ever felt confusing before, start with /setupfilters and you should be able to dial in “only the stuff I care about” without a bunch of trial and error.

let me know if you guys are noticing any issues with the internal cron job not running for the refresh_in_container on espn4cc4c... i had issues on mine and pushed some updates to hopefully address it.

container cronjobs are a headache

Checked logs and the cron job did fail. Pulled your latest version and the first thing in the log was that Cron was successfully installed and that the Cron daemon was running. Positive sign as I used to get "cron: can't lock /var/run/crond.pid, otherpid may be 21: Resource temporarily unavailable"

IIRC the next refresh is scheduled at 2:05, so will be able to confirm then.

1 Like

Good News:Bad News.

Good News is that the Cron job executed successfully at the appointed time.

Bad News is that none of the filters were respected. Got

No filters active (all events included)

[filter] Total events: 858, Included: 858, Filtered out: 0
[filter] Removed 0 events that didn't pass filters

Well that’s odd…. Shouldn’t have anything to do with filters at all. It was just calling refresh in container on a schedule. Unless somehow that broke the env variables. On the case.

This should have had nothing to do with env variables what so ever. Please run this


docker exec espn4cc4c env | grep FILTER

FILTER_REQUIRE_ESPN_PLUS=false
FILTER_EXCLUDE_NETWORKS=ESPN,ESPN2,ESPNU,ESPNEWS,ESPN Deportes,SECN,SECN+,ACCN,ACCNX,@ESPN

Yep...got this error still

[STARTUP] Installing cron schedules...

crontab: your UID isn't in the passwd file.


bailing out.

Found this in the cron_refresh.log. Perhaps it is not picking up the environment variables.

Configuration:
  DB: /app/data/eplus_vc.sqlite3
  OUT: /app/out
  TZ: America/New_York
  VALID_HOURS: 72
  LANES: 40
  ALIGN: 30
  MIN_GAP_MINS: 30
  VC_RESOLVER_BASE_URL: 
  AUTO_FORCE_REPLAN_ON_FILTER_CHANGE: True
  AUTO_RESET_DB_ON_FILTER_CHANGE: False
[filter] No INI file found at /app/filters.ini, using defaults
No filters active (all events included)

In Fact, this is NOT my environment config, looks like the default. e.g. I have TZ=America/Chicago, I have LANES=200 (don't judge me ;), and of course my filter spec.

If I start the container from scratch, everything works as expected.

[filter] Removed 497 events that didn't pass filters
[filter] Total events: 1187, Included: 690, Filtered out: 497
Partial league match: True
Case-insensitive matching: True
ESPN+ Required: False
Excluding: @espn, accn, accnx, espn, espn deportes, espn2, espnews, espnu, secn, secn+
Networks: All (*)
Active Filters:
Step 2/5: Applying event filters...

@KineticMan,

Although I'm not running ABDTuner, updated ESPN4cc4c started fine with cronjob activated and existing filters intact here.

bingo - that was it. bin/cron_boot.sh isn't passing the env variables to the cron job. i'll push an update this morning. easy fix.

tnx for the log! and @Jean0987654321 yours was an odd one, but i added a workaround for it too.

if this stupid cron thing keeps giving us heartache, i'll move to APScheduler.. might be better anyway- would be nicer long term as I could add a /refresh API call ...

*edit, doing that anyway...

Yeah...just tried a new version and I got a new error

[STARTUP] Installing cron schedules...

/app/bin/cron_boot.sh: line 15: /etc/cron.d/espn4cc4c: Permission denied

yep i'm done with cron.. grab this new update pls. tnx for patience on this.

Quick update on the ESPN4CC4C container: I’ve moved all of the scheduled tasks off system cron and into an in-process scheduler using APScheduler. This should get rid of those pesky cron-related errors some people were seeing in their container logs, and it keeps everything self-contained inside the FastAPI app.

The scheduler now runs database refreshes at 08:05 / 14:05 / 20:05 every day, and a SQLite VACUUM on Sundays at 03:10. On top of that, there’s a new web UI at:

http://:8094/admin/refresh

From there you can see the last refresh/VACUUM status (including whether it was manual or scheduled), plus buttons to trigger a refresh or run VACUUM on demand. No extra setup needed – just update to v5.9, restart your container, and you’re using the new scheduler automatically.

My peacock strategy should work similar if you check the github for it.

That did it. Thanks. Yeah...seems like a mess to get cron working inside a container. :smiley:

1 Like

Having an issue trying to setup E+ with adbtuner. I run my most of my containers with macvlan so that I can IP them with an IP of my IoT VLAN. I have a mixture of physical hosts, Proxmox guests, & Docker containers and this makes it easier to manage and prevents me from having issues.

So my espn4cc4c container is set up like this in portainer:

  espn4cc4c:
    image: ghcr.io/kineticman/espn4cc4c:latest
    container_name: espn4cc4c
    networks:
      IoT-enp10s0-macvlan-network:
        ipv4_address: 192.168.12.13
    environment:
      - TZ=America/New_York
      - VC_RESOLVER_BASE_URL=http://192.168.12.13:8094
      - CC_HOST=192.168.12.13
      - CC_PORT=5589
      - PORT=8094
      - APP_MODULE=bin.vc_resolver:app
      - VALID_HOURS=72
      - LANES=40
      - ALIGN=30
      - MIN_GAP_MINS=30
      - M3U_GROUP_TITLE=ESPN+ VC
      - VC_M3U_PATH=/app/out/playlist.m3u
      - WATCH_API_KEY=0dbf88e8-cc6d-41da-aa83-18b5c630bc5c
    volumes:
      - espn4cc4c-data:/app/data
      - espn4cc4c-out:/app/out
      - espn4cc4c-logs:/app/logs
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8094/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    restart: unless-stopped

I removed the local host references and used the actual IP of the container. Even though I did that it looks like the code is refencing localhost anyway instead of using the env var: VC_RESOLVER_BASE_URL which would be http://192.168.12.13:8094 Could you possibly make this value a variable?

2025-11-21 20:36:09.904 - stream - [Tune (VSKDn6hnE4agxVTujTAdMu)] Resolving dynamic URL (http://host.docker.internal:8094/whatson/7?deeplink=1) for channel.
2025-11-21 20:36:09.980 - stream - [Tune (VSKDn6hnE4agxVTujTAdMu)] ERROR: Could not retrieve dynamic URL data: [Errno -2] Name or service not known

Full ADB Tuner logs:

2025-11-21 20:35:53.577 - admin - Releasing tuner 8 per user request.
2025-11-21 20:35:53.578 - tuner_management - Released tuner (8).
2025-11-21 20:35:53.578 - uvicorn.access - 172.16.1.11:0 - "GET /admin/tuner/force-unlock/8 HTTP/1.1" 303
2025-11-21 20:35:53.610 - uvicorn.access - 172.16.1.11:0 - "GET / HTTP/1.1" 200
2025-11-21 20:36:09.256 - stream - [Tune VSKDn6hnE4agxVTujTAdMu] 192.168.12.17:5592 | Go-http-client/1.1
2025-11-21 20:36:09.257 - stream - [Tune (VSKDn6hnE4agxVTujTAdMu)] No active tuners found for ESPN+7. Reserving a new tuner.
2025-11-21 20:36:09.257 - tuner_management - [Tune VSKDn6hnE4agxVTujTAdMu] Attempting to reserve tuner for: ['com.espn.gtv', 'com.espn.score_center'].
2025-11-21 20:36:09.258 - tuner_management - [Tune VSKDn6hnE4agxVTujTAdMu] Available Tuners:
2025-11-21 20:36:09.258 - tuner_management - [Tune VSKDn6hnE4agxVTujTAdMu] Name: Onn TV Pro 2 (HDMI 5) Priority: 1
2025-11-21 20:36:09.258 - tuner_management - [Tune VSKDn6hnE4agxVTujTAdMu] Name: Onn TV Pro 1 (HDMI 4) Priority: 2
2025-11-21 20:36:09.258 - tuner_management - [Tune VSKDn6hnE4agxVTujTAdMu] Name: Onn2 (bottom HDMI 2) Priority: 4
2025-11-21 20:36:09.258 - tuner_management - [Tune VSKDn6hnE4agxVTujTAdMu] Name: Onn1 (HDMI 1) Priority: 5
2025-11-21 20:36:09.258 - tuner_management - [Tune VSKDn6hnE4agxVTujTAdMu] Using first available tuner (by priority).
2025-11-21 20:36:09.258 - tuner_management - [Tune VSKDn6hnE4agxVTujTAdMu] Reserved Tuner: Name: Onn TV Pro 2 (HDMI 5) Priority: 1
2025-11-21 20:36:09.258 - stream - [Tune (VSKDn6hnE4agxVTujTAdMu)] Tuning to ESPN+7 on Onn TV Pro 2 (HDMI 5)
2025-11-21 20:36:09.258 - stream - [Tune (VSKDn6hnE4agxVTujTAdMu)] Using channel configuration: ESPN+ Deep Links - Show Tuning Process (51af5028-092f-4ddc-b4ea-d5e5fca58cac)
2025-11-21 20:36:09.805 - lib.adb - [Tune (VSKDn6hnE4agxVTujTAdMu)] ADB: 10.100.12.24 - pidof com.espn.score_center
2025-11-21 20:36:09.904 - stream - [Tune (VSKDn6hnE4agxVTujTAdMu)] Resolving dynamic URL (http://host.docker.internal:8094/whatson/7?deeplink=1) for channel.
2025-11-21 20:36:09.980 - stream - [Tune (VSKDn6hnE4agxVTujTAdMu)] ERROR: Could not retrieve dynamic URL data: [Errno -2] Name or service not known
2025-11-21 20:36:10.260 - stream - [Tune VSKDn6hnE4agxVTujTAdMu] Redirecting to stream after 1.01 seconds (fixed delay of 1 seconds exceeded). Tuning is still in progress.
2025-11-21 20:36:10.261 - uvicorn.access - 192.168.12.30:0 - "GET /stream/135 HTTP/1.1" 307
2025/11/21 20:36:10 [PROXY] 192.168.12.30 -> GET "/proxy/8?requestKey=VSKDn6hnE4agxVTujTAdMu" -> "http://192.168.12.16:8090/stream4"