DistroTV proxy - KineticMan docker

hey i wrote up a little proxy that uses your ideas. not sure if it's necessary given your work in PLM, but just thought i'd share

What it does:

  • Serves a live M3U playlist + XMLTV EPG from DistroTV's full channel lineup
  • Handles all the MediaTailor/SSAI URL resolution automatically
  • Admin UI to monitor channel health and toggle channels in/out of your playlist
  • Auto-refreshes the channel list daily and EPG hourly

Setup is just a Docker one-liner:

docker run -d \
  --name distrotv-proxy \
  --restart unless-stopped \
  -p 8787:8787 \
  -v distrotv-data:/data \
  ghcr.io/kineticman/distrotv-proxy:latest

Admin page is:

http://YOUR_SERVER_IP:8787/admin

Then point Channels DVR at:

M3U: http://your-ip:8787/playlist.m3u
EPG: http://your-ip:8787/epg.xml

GitHub: GitHub - kineticman/distrotv-proxy: DistroTV HLS proxy for Channels DVR and VLC · GitHub

thanks to @miibeez whose original project inspired this, and to @babsonnexus for ideas borrowed from SLM.

2 Likes

Can I ask how many channels are currnetly loading for you for distro on U.S i.p

It appears they lost a heap channels since i last did my own scrape

301 working channels just scraped

Thanks that matches what i got and 255 for CA

@KineticMan I just deployed your proxy. Thanks it's cool man!

Heap is an understatement, like 250 channels nuked.
lost my one and only station on Distro that I was using, out of all those distro channels I was point to only one stream wired2fish TV. (lol)

Gone nuked, sunk with my boat and fishing tackle. (lol)

@Apsattv thanks for all you folks do.

Looks like it's available on some other services - I'll take a search tonight to see if I can hook you up.

in the meantime, Kaloopy is a good channel on DistroTV ... IYKYK

Not sure what is happening to my instance...
I have a lot of channel errors...

Also a lot of this message in the logs...
2026-03-04 11:36:08,945 [WARNING] state save failed: [Errno 13] Permission denied: '/data/channel_state.json.tmp'
I checked the local folder and I have the data folder but it's empty...
Any suggestions?

Sloppy on my part. Will fix tonight

try updating container. should work now

This is from FreeLiveSports.tv ... add this as a custom source to add wired2fish.

https://b0530716d58747539cefbb49fbcf833c.mediatailor.us-west-2.amazonaws.com/v1/master/ba62fe743df0fe93366eba3a257d792884136c7f/LINEAR-80-WIRED2FISH-SPORTSTRIBALTV/mt/sportstribaltv/80/hls/master/playlist.m3u8
1 Like

Unfortunately, I pulled the latest image but still having the errors in the log:

Follow up... Due to the permissions problem earlier, I had chmod the data folder and then I also added UID/GID to the environment...
I thought maybe something got screwed up, so I deleted the container and started over from scratch...
Same issue
2026-03-04 16:07:09,715 [WARNING] state save failed: [Errno 13] Permission denied: '/data/channel_state.json.tmp'
If you want, I can post my yaml file...

Just logged into the container... /data is not correct...

odd.. How did you build the container?

How are you creating the container?
Docker run statement or compose statement.
If you use his example compose statement

services:
  distrotv-proxy:
    image: ghcr.io/kineticman/distrotv-proxy:latest
    container_name: distrotv-proxy
    restart: unless-stopped
    ports:
      - "8787:8787"
    volumes:
      - distrotv-data:/data

volumes:
  distrotv-data:

It creates a docker volume named distrotv-data and volume maps it to the container directory /data.

If you use his example docker run statement

docker run -d \
  --name distrotv-proxy \
  --restart unless-stopped \
  -p 8787:8787 \
  -v distrotv-data:/data \
  ghcr.io/kineticman/distrotv-proxy:latest

It uses a bind mount to a directory on your host OS named distrotv-data
But since that's a relative path, you should change it to an absolute path.
-v /path/on/host:/path/in/container

copied your yaml and paste it into dockge... made a couple of edit for my environment and started it..
I just noticed that you have an additional statement that was not there before... so I'm adding it to see if it helps... this line:

  • STATE_FILE=/data/channel_state.json

Nope... same thing:
2026-03-04 16:36:31,903 [WARNING] state save failed: [Errno 13] Permission denied: '/data/channel_state.json.tmp'
should I create that .tmp file in my side of the /data?

  distrotv:
    container_name: distrotv
    image: ghcr.io/kineticman/distrotv-proxy:latest
    environment:
      - TZ=Pacific/Honolulu
      - STATE_FILE=/data/channel_state.json
    volumes:
      - ./distrotv/data:/data
    ports:
      - 8787:8787
    networks:
      - iptv_default
    restart: unless-stopped
networks:
  iptv_default:
    external: true

It's one app in a container with several iptv apps... that's why the services: is missing from the top...

logged into container... unable to chmod 777 on /data

I believe this is what you are doing?

humor me - try this and report back. i made a small change to the Dockerfile and main app.py

docker pull ghcr.io/kineticman/distrotv-proxy:latest
docker compose down && docker compose up -d

OK, got it solved... I hope...
I had to chmod 777 my side of the /data folder...
The json file is now listed and no more of the json.tmp errors...

I guess it's related to the admin console? Now I only have error...

That json it saves is just a “channel state” to save on API queries. Think of it like a cache. It’s honestly not necessary.

Output looks good now. Just add the m3u/epg to a new custom source and you should be in business.