M3U Restream

There’s a wonderful piece of microservice node.js based restream utility, that let you re-stream from a source and also do the ffmped transcoding if you’d like. I just liked the piece!

My installed OS was Ubuntu 18.x and I used node version 12.x.

The problem

You have an IPTV provider that provides an (extended) M3U playlist file. You want to:

  • Add HTTPS encryption to the streams (and probably move the unencrypted reception offsite).
  • Transcode the streams to a lower bitrate, or convert to a uniform video or audio format.

The solution

Run this software, preferably on an offsite host. It only requires a Node installation (No NPM modules are required!). To add HTTPS support, front it with nginx (or similar).

Getting it to run

Basic steps to get it running:

  • Install NodeJS via a mechanism of your choice.
  • Clone the repo.
  • Copy restream-cfg-example.json to restream-cfg.json.
  • Edit restream-cfg.json. See the section below for more details.
  • Run
    node restream.js

    There is no built-in daemon support, I recommend to run it in screen or use a daemonizer like start-stop-daemon.

  • Point your client software to http://<ip>:<port>/channels. This is the playlist URL for the default transcoding profile. To address another profile, use the profile URL parameter, like http://<ip>:<port>/channels?profile=mobile.

It is recommended to front the proxy with nginx to enable HTTPS. See the section on nginx below.

Configuration options
extUrl: The base URL that your proxy is reachable as, for example https://my.offsite.server/iptv/.

m3uSrc: The M3U URL from your IPTV provider. Will usually contain username and password as URL parameters.

port: TCP listening port that the proxy will use.

numWorkers: Amount of streaming workers to spawn. Since this proxy is designed for single clients, they are only needed when switching channels. Three are enough.

blacklist: A list of regular expression strings matching program names that you want filtered from the M3U list. Useful for skipping on crap that you don’t want.

profiles: Transcoding profiles. At least one profile called default must be present. Each profile has three sub-options:

contentType: The content type that is advertised for the resulting stream. Usually video/mp2t.
transcoder: Transcoder binary to spawn. If you want no transcoding, use /bin/cat. Otherwise, you’ll probably use ffmpeg. Whatever you use, it must be set up to read video from STDIN and output video to STDOUT.
transcoderOpts: Array of command-line options for the transcoder. The transcoder is spawned without a shell, so no escaping is needed.
Nginx setup (recommended, optional)

In any server (hopefully SSL-enabled), pick a path location for your IPTV service, and link the proxy in like this:

location /iptv/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;

Here, the URL path is /iptv/ and the proxy port is 3666. That’s all.

I just uploaded the restream source which can be downloaded from here: iptv-m3u-restream-master 


2 thoughts on “M3U Restream”

  1. Good afternoon,
    I’ve been trying to setup this script for a few days now.
    I can see the channels load, but, I can’t see the restream m3u. I’m running Kubuntu 23.04.
    This looks like it’s perfect for what I need it for, unfortunately, I just can’t get it to work.
    Would you be able to please help me?
    Thank you and have a nice day

    • You can get the playlist using like following format-

      Notice- channels.m3u8 its the playlist generator of restream


Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.