Jellyfin Live TV Setup with an Enigma2 Receiver: Channels, EPG and Picons via Headend

Turn your own Enigma2 satellite or cable receiver into a Jellyfin Live TV source with Headend: import bouquets, pull the guide and picons, and stream through the server so the receiver stays hidden.

Why use your own receiver as the tuner

If you already run an Enigma2 box (Vu+, Zgemma, GigaBlue and similar) for free-to-air or subscription channels you are licensed to watch, you already own the hardest part of a Live TV setup: the tuner and the channel list. Headend connects that receiver to Jellyfin through OpenWebif, so the channels, the program guide and the channel logos all come from the same box. Nothing is sold or supplied by the plugin: Headend does not provide channels, it only exposes the ones your receiver already receives.

The stream is passed through the Jellyfin server, so apps never learn the receiver's address. Several viewers of the same channel share one tuner, and a busy tuner returns a clear error instead of a silent failure. If you want the full feature list, see the product page; this tutorial is the practical path from zero to a working guide.

Prerequisites

  • Jellyfin Server 12.2 or newer, on Linux, Windows or Docker.
  • An Enigma2 receiver with OpenWebif enabled and reachable from the Jellyfin server, usually on the same network. OpenWebif normally listens on port 80 and streams on port 8001.
  • jellyfin-ffmpeg, the ffmpeg build that ships with Jellyfin.
  • A MediaLab Works account with a license that covers the plugin: an active subscription, a lifetime license within its update window, the Jellyfin bundle, or the free 30-day trial.
  • Optional: root SSH to the receiver (passwordless or with a key) if you want the receiver watchdog. It is off on new installations.

Step 1 — Install Headend

The recommended route is your private plugin repository, so Jellyfin installs and updates the plugin by itself.

  1. In your MediaLab Works account open Licenses → Jellyfin plugin repository and click Create address. Copy it; it contains a token, so keep it private.
  2. In Jellyfin open Dashboard → Plugins → Repositories, click +, name it (for example MediaLab Works), paste the address and save.
  3. In Dashboard → Plugins → Catalog find Headend by MediaLab, click Install, then restart Jellyfin.

If you prefer a manual install, download the zip from Account → Licenses, extract it into a new folder named Headend by MediaLab_x.y.z.0 inside the Jellyfin plugins folder (/var/lib/jellyfin/plugins/ on a Linux package install, /config/plugins/ in the official Docker image, %ProgramData%\Jellyfin\Server\plugins\ on Windows) and restart Jellyfin. The guide lists the exact paths and the public catalog option.

Step 2 — Activate the license

Open Dashboard → Plugins → Headend by MediaLab and click Open License page. Paste your license key and click Activate with key; the plugin binds the key to this server and shows the license as Active. No key yet? Enter your e-mail on the same page to start the 30-day free trial. The license is checked once a day and at every Jellyfin start; without internet the plugin keeps working for 7 days after the last successful check.

Step 3 — Add the receiver as a tuner

  1. Open Dashboard → Live TV and add a tuner device of type Headend (Enigma2 / Vu+).
  2. Enter the receiver address, the OpenWebif port (80), the stream port (8001), and the user name and password if OpenWebif asks for them.
  3. Choose the bouquets to import. Only the bouquets you select become channels in Jellyfin.

From version 1.0.5 the OpenWebif password is encrypted at rest in the plugin data folder and never sent to the browser; the page only shows “set ✓”.

Step 4 — Add the guide provider

In the same Dashboard → Live TV page add the Headend guide provider. The program guide then comes from the receiver for every channel. Headend refreshes the guide from the receiver every 60 minutes, and you can force a refresh from Dashboard → Scheduled Tasks → Refresh Guide.

Step 5 — Shape the channel list

Open Dashboard → Headend. This is where you turn a raw receiver list into something a household can use:

  • Hide unnamed channels.
  • Hide the SD version when the HD version exists.
  • Adjust names, numbers and order.
  • Channel logos (picons) come from the receiver; you can also set a logo from a link, on admin action, up to 10 MB. The plugin does not download picon packs.

Keep the list short and ordered the way people actually zap. A tidy list is the difference between a Live TV source that gets used and one that gets ignored.

Step 6 — Grant access per user

New users start without Live TV access through Headend. On the Headend page grant it to the accounts that should have it. This is also where adult channels are handled: they sit behind a PIN, unlocked per user for a limited time. From version 1.0.6 new PINs have at least 6 digits, only a PBKDF2-SHA256 hash is stored, and wrong attempts are limited with growing lockouts that survive a restart. In apps, the PIN is unlocked from a browser at /Headend/Unlock for that account.

Step 7 — Watch

Refresh the guide, then open Live TV in Jellyfin. Channels, guide and logos are served through the server's Live TV, so any app with Live TV should work; Jellyfin Web is the verified client (HD playback in the 4.4–4.7 s range in the published tests). On official Jellyfin the TV page link is added manually in config.json under menuLinks; on medialab Server it appears automatically.

Tips and troubleshooting

  • No channels. Check that OpenWebif opens in a browser from the Jellyfin server at the address you entered. If the server cannot reach it, Jellyfin will not either.
  • A channel does not play. A tuner can receive one transponder at a time; a recording or another viewer on a different transponder can occupy it. That is expected behavior, not a plugin bug.
  • A user does not see Live TV. Give the user access from the Headend page; new users start without it.
  • Empty guide. Confirm the Headend guide provider is added in Dashboard → Live TV, then run Refresh Guide from Scheduled Tasks. The guide is pulled from the receiver every 60 minutes.
  • OpenWebif stream not working. Recheck the stream port (8001 by default) and any OpenWebif authentication. The receiver address is never handed to clients, so test from the Jellyfin server side, not from a phone.
  • Watchdog and SSH. The receiver watchdog is off on new installations. If you enable it, the SSH host key is verified from version 1.0.5: it is saved at first connection in ssh/known_hosts in the data folder, and if it changes the command is not sent. You can view and forget the saved fingerprint from the page.
  • Updates. If you use a lifetime license past its update window, stay on your private repository so Jellyfin does not pull versions your license does not cover. Roll back to x.y.z on the License page returns to the previous version and turns off automatic updates for the plugin until the next Install update. The changelog shows what changed in each release.

Conclusion

Headend does one job: it makes the receiver you already own a first-class Live TV source in Jellyfin, with its own bouquets, guide and picons, and it keeps the receiver address on the server side. Set up the tuner and guide provider, spend ten minutes on the channel list, grant access per user, and you have a legal, self-hosted TV setup that behaves like any other Jellyfin library. For details beyond this walkthrough, the user guide and the knowledge base are the next stops; if something does not line up, contact us.

This post was written with AI assistance from our product documentation or the sources listed and checked automatically before publication.

Read next

Running Emby, Jellyfin or Nextcloud?

Our plugins and apps add Live TV, subtitles, sign-up and security to your own server, with a free trial.