MLSDeeplink – Tiny MLS M3U/XMLTV feeder with Apple TV deep links
I’ve been messing around with MLS on Apple TV and ended up building a little side project called MLSDeeplink.
It does one thing: grabs the MLS schedule from Apple TV MLS package and spits out:
-
mls.m3u– M3U playlist -
guide.xml– XMLTV guide -
mls_schedule.json– cleaned-up schedule -
raw_canvas.json– raw scrape if you want to poke at it
Everything lives in a single Docker container with a built-in daily job and NGINX serving the files from /out.
Repo / Download
Code + Docker setup are here:
https://github.com/kineticman/MLSDeeplink
How it works (quick version)
- Container starts up
- A daily job runs at whatever time you pick (default
04:17in your timezone) - It refreshes the MLS schedule and rewrites the M3U/XMLTV
- NGINX serves everything over HTTP
So you end up with URLs like:
http://myhost.local:8096/mls.m3uhttp://myhost.local:8096/guide.xml
which you can plug straight into Channels as a custom source (as a Streamlink). The entries deep-link into the Apple TV app.
Quick start (Docker)
git clone https://github.com/kineticman/MLSDeeplink.git
cd MLSDeeplink
# tweak if you want, or just use as-is
export HOST_PORT=8096 # host port
export PORT=8096 # internal NGINX port
export TZ=America/New_York # timezone for the daily run
export RUN_AT=04:17 # daily scrape time (HH:MM)
export OUTPUT_DIR=/out # where files are written in the container
docker compose up -d --build
Health check:
curl -sS http://localhost:8096/health && echo
Force a first run instead of waiting for the schedule:
docker exec -it mlsdeeplink bash -lc 'cd /app/scripts && OUTPUT_DIR=/out ./generate.sh && ./validate.sh && ls -l /out'
Using it with Channels
If your box is myhost.local and you kept HOST_PORT=8096:
-
M3U URL:
http://myhost.local:8096/mls.m3u -
XMLTV URL:
http://myhost.local:8096/guide.xml
That’s it. If anyone tries it and runs into weird edge cases, I’m happy to tweak it. Not much season left so not a ton of opportunity to test it. Go Crew.