Edit: I couldnβt find any of the espn scripts in my data file. Edited my Streamer App in the ah4c stack to scripts/firetv/espn. Now it opens and plays the game. Iβve watched a couple of minutes from several games and all played starting from the beginning.
@bnhf
Got everything set up. I've got guide data but when I select anything, it opens the DTV Stream app.
I've attached the Portainer log, the Compose, and my environment variables.
Firestick 4K
ESPN app loaded and signed in.
No hurry as I'm here to help where I can!!
Let me know if you need anything else.
Portainer Log:
2025-11-05T17:20:35-06:00] Initial scrape β guide...
2025-11-05 17:20:37,603 - INFO - Current time (TZ=UTC): 2025-11-05 23:20:37.602967+00:00
2025-11-05 17:20:37,603 - INFO - ===========================================================
2025-11-05 17:20:37,603 - INFO - ESPN Watch Graph Scraper - Starting
2025-11-05 17:20:37,603 - INFO - ===========================================================
2025-11-05 17:20:37,604 - INFO - Fetching dates: 2025-11-04, 2025-11-05, 2025-11-06, 2025-11-07
2025-11-05 17:20:37,604 - INFO - Database directory: /app/out
2025-11-05 17:20:37,605 - INFO - Database path: /app/out/espn_schedule.db
2025-11-05 17:20:37,761 - INFO - Database initialized successfully
2025-11-05 17:20:37,761 - INFO - About to fetch days: ['2025-11-04', '2025-11-05', '2025-11-06', '2025-11-07']
2025-11-05 17:20:37,761 - INFO - Fetching day 1/4: 2025-11-04
2025-11-05 17:20:37,762 - INFO - Request URL: https://watch.graph.api.espn.com/api?apiKey=0dbf88e8-cc6d-41da-aa83-18b5c630bc5c&features=pbov7
2025-11-05 17:20:37,762 - INFO - Request payload keys: ['query', 'operationName', 'variables']
2025-11-05 17:20:37,762 - INFO - Variables: {'countryCode': 'US', 'deviceType': 'DESKTOP', 'tz': 'UTC', 'day': '2025-11-04', 'limit': 2000}
2025-11-05 17:20:38,858 - INFO - API request for 2025-11-04: status=200, duration_ms=1087, bytes=170217
2025-11-05 17:20:38,859 - INFO - Retrieved 373 airings for 2025-11-04
2025-11-05 17:20:38,859 - INFO - Sample packages from first 5 airings:
2025-11-05 17:20:38,859 - INFO - Airing 1 '#18 Kentucky vs. Old Dominion': packages=['ESPN_PLUS']
2025-11-05 17:20:38,860 - INFO - Airing 2 'North Carolina A&T vs. South Carolina': packages=[]
2025-11-05 17:20:38,860 - INFO - Airing 3 'NJIT vs. Fordham': packages=['ESPN_PLUS']
2025-11-05 17:20:38,860 - INFO - Airing 4 'Stony Brook vs. Syracuse': packages=[]
2025-11-05 17:20:38,860 - INFO - Airing 5 'Alcorn State vs. Florida State': packages=[]
2025-11-05 17:20:38,861 - INFO - League data - name: 'NCAAM Soccer', abbrev: 'None', sport: 'Soccer'
2025-11-05 17:20:38,862 - INFO - League data - name: 'NCAAM', abbrev: 'None', sport: 'Basketball'
2025-11-05 17:20:38,862 - INFO - League data - name: 'NCAAM', abbrev: 'None', sport: 'Basketball'
2025-11-05 17:20:38,863 - INFO - League data - name: 'NHL', abbrev: 'None', sport: 'Hockey'
2025-11-05 17:20:38,863 - INFO - League data - name: 'NCAAW', abbrev: 'None', sport: 'Basketball'
2025-11-05 17:20:38,868 - INFO - Fetching day 2/4: 2025-11-05
2025-11-05 17:20:39,290 - INFO - API request for 2025-11-05: status=200, duration_ms=418, bytes=109912
2025-11-05 17:20:39,292 - INFO - Retrieved 247 airings for 2025-11-05
2025-11-05 17:20:39,295 - INFO - Fetching day 3/4: 2025-11-06
2025-11-05 17:20:39,722 - INFO - API request for 2025-11-06: status=200, duration_ms=423, bytes=133629
2025-11-05 17:20:39,723 - INFO - Retrieved 298 airings for 2025-11-06
2025-11-05 17:20:39,727 - INFO - Fetching day 4/4: 2025-11-07
2025-11-05 17:20:40,391 - INFO - API request for 2025-11-07: status=200, duration_ms=658, bytes=164560
2025-11-05 17:20:40,392 - INFO - Retrieved 358 airings for 2025-11-07
{
"db": "/app/out/espn_schedule.db",
"rows_inserted": 619,
"live_now": 20,
"window_72h": 423
}
ESPN+ M3U/XMLTV Generator
============================================================
Database: /app/out/espn_schedule.db
Time: 2025-11-05 23:20:40 UTC
Fetching live and upcoming events (next 3 hours)...
Found 68 events
Generating M3U playlist...
Saved: /app/out/espn_plus.m3u
Channels: 63
Generating XMLTV guide...
Saved: /app/out/espn_plus.xml
Sample events:
------------------------------------------------------------
1. Freddie & Harry
2. Villanova vs. Penn
3. Idaho vs. Portland St
4. LIVE - UL Monroe vs. Old Dominion
5. LIVE - Georgetown vs. Villanova
... and 63 more
============================================================
Generation complete!
Files created:
M3U: /app/out/espn_plus.m3u
XMLTV: /app/out/espn_plus.xml
[2025-11-05T17:20:40-06:00] Starting http server for espn_guide.xml...
[2025-11-05T17:20:40-06:00] Installing cron schedules...
[2025-11-05T17:20:40-06:00] Run initial hourly reload...
[2025-11-05 17:20:40] β Running: python3 generate_guide.py
==================================
DeepLinks β /out HTTP server
==================================
Serving: /app/out
Listen : 0.0.0.0:7644
Open : http://172.22.0.2:7644
Files :
http://172.22.0.2:7644/espn_plus.xml
http://172.22.0.2:7644/espn_plus.m3u
==================================
ESPN+ M3U/XMLTV Generator
============================================================
Database: /app/out/espn_schedule.db
Time: 2025-11-05 23:20:41 UTC
Fetching live and upcoming events (next 3 hours)...
Found 68 events
Generating M3U playlist...
Saved: /app/out/espn_plus.m3u
Channels: 63
Generating XMLTV guide...
Saved: /app/out/espn_plus.xml
Sample events:
------------------------------------------------------------
1. Freddie & Harry
2. Villanova vs. Penn
3. Idaho vs. Portland St
4. LIVE - UL Monroe vs. Old Dominion
5. LIVE - Georgetown vs. Villanova
... and 63 more
============================================================
Generation complete!
Files created:
M3U: /app/out/espn_plus.m3u
XMLTV: /app/out/espn_plus.xml
[2025-11-05 17:20:41] β Sleeping 20s
[2025-11-05 17:21:01] β POST http://10.0.1.194:8089/providers/m3u/sources/streamlinks/refresh
body: false[2025-11-05 17:21:01] β M3U refresh requested
[2025-11-05 17:21:01] β Sleeping 20s
[2025-11-05 17:21:21] β PUT http://10.0.1.194:8089/dvr/lineups/XMLTV-streamlinks
body: true[2025-11-05 17:21:21] β XMLTV refresh requested
[2025-11-05 17:21:21] β
All steps completed.
[2025-11-05T17:21:21-06:00] Starting crond (background) and waiting on processes...
crond: crond (busybox 1.36.1) started, log level 8
crond: user root: parse error at 5****
crond: user root: parse error at /bin/sh
crond: user root: parse error at -lc
crond: user root: parse error at 'cd
crond: user root: parse error at /app
crond: user root: parse error at 3***
crond: user root: parse error at /bin/sh
crond: user root: parse error at -lc
crond: user root: parse error at 'cd
crond: user root: parse error at /app
crond: user root: parse error at 5****
crond: user root: parse error at /bin/sh
crond: user root: parse error at -lc
crond: user root: parse error at 'cd
crond: user root: parse error at /app
crond: user root: parse error at 3***
crond: user root: parse error at /bin/sh
crond: user root: parse error at -lc
crond: user root: parse error at 'cd
crond: user root: parse error at /app
[http] "GET /espn_plus.xml HTTP/1.1" 200 -
[http] "GET /espn_plus.xml HTTP/1.1" 200 -
[http] "GET /espn_plus.xml HTTP/1.1" 200 -
**strong text**
Compose:
services:
eplustv-ah4c:
image: bnhf/eplustv-ah4c:${TAG:-latest}
container_name: eplustv-ah4c
dns_search:
- ${DOMAIN:-localdomain} # Change to the name of your LAN's domain, which is usually local or localdomain
#- ${TAILNET} # Change to the name of your Tailnet, which is in the form tailxxxxx.ts.net
dns_opt:
- ndots:${NDOTS:-1} # Allows hostanme resolution on LAN and Tailnet domains in Alpine Linux-based containers
ports: # Note that the M3U is hosted by ah4c (typically port 7654) and the XML is hosted by eplustv-ah4c (typically port 7644)
- ${PORT:-7644}:${PORT:-7644} # The port espn_plus.xml will be hosted on, in the form http://<hostname or IP>:<PORT>/espn_plus.xml
environment:
- TZ=${TZ} # Your local timezone in a valid Linux format
- HOST=${HOST} # Your Channels DVR host URL in the form http://<hostname or IP>:8089
- CRON_HOURLY=${CRON_HOURLY:-5 * * * *} # Typically 5 * * * *
- CRON_NIGHTLY=${CRON_NIGHTLY:-15 3 * * *} # Typically 15 3 * * *
- PORT=${PORT:-7644} # The port espn_plus.xml will be hosted on, in the form http://<hostname or IP>:<PORT>/espn_plus.xml
- AH4C=${AH4C:-true} # Set to true for the URL used in espn_plus.m3u to be in a valid ah4c format, typically hosted at http://<hostname or IP>:7654/m3u/espn_plus.m3u
volumes:
- ${HOST_DIR:-/data}/ah4c/m3u:/app/out # The parent directory, on your Docker host, under which your ah4c M3Us are stored
restart: unless-stopped
Environment Variables:
TAG=latest
DOMAIN=local
TZ=US/Central
HOST=http://10.0.1.194:8089
CRON_HOURLY=5****
CRON_NIGHTLY=3***
PORT=7644
AH4C=true
HOST_DIR=/volume1/data