Lumen·wiki
All guides / Setup
medium ~10 min · Updated 2026-04-30

The EPG is what turns a channel list into a TV. Without it, you’re flipping blind. Done well, you scroll a 6-hour grid and pick the next watch in 5 seconds.

How EPG works in Lumen·TV

  1. You provide one or more XMLTV URLs (an XML format used by ~95% of IPTV EPG providers).
  2. Lumen downloads them in the background, parses programs, and indexes them by channel ID.
  3. When rendering the EPG grid, each channel from your M3U is matched to its programs via tvg-id.

The matching is the part that goes wrong most often.

Source priority

If your playlist is from one provider that ships its own EPG, you usually don’t need to do anything. The M3U includes url-tvg= or x-tvg-url= headers, and Lumen auto-detects.

If you’re using a free public M3U like IPTV-org and want EPG, you need to add a separate source manually:

Settings → Playlist → EPGAdd EPG URL

Paste the XMLTV URL. For IPTV-org’s matching EPG: https://iptv-org.github.io/epg/guides/en/xmltv.xml.

You can stack multiple EPG sources — Lumen merges programs by channel ID. If two sources cover the same channel, the more detailed one (longer title, descriptions) wins.

tvg-id matching

Each channel in your M3U has a tvg-id attribute:

#EXTINF:-1 tvg-id="france24.fr" tvg-name="France 24" group-title="News",France 24
https://example.com/france24/playlist.m3u8

The XMLTV file declares programs against the same identifier:

<programme channel="france24.fr" start="20260430210000 +0200" stop="20260430213000 +0200">
  <title>News</title>
</programme>

If tvg-id is missing, no EPG appears for that channel. The fix:

Settings → Channels → <channel name> → tvg-id override — type the ID manually.

To find the correct ID, check the EPG XML directly (or use Lumen’s built-in EPG inspector: Settings → EPG → Inspect → Search by name).

Time offsets

The most common reason “EPG is one hour off” is daylight savings handling. XMLTV allows two formats:

  • With timezone: 20260430210000 +0200 — the safe one.
  • Without: 20260430210000 — assumed UTC.

If your provider ships the second format and forgets DST, programs slide. Fix it server-side ideally; if you can’t, set a per-source offset:

Settings → Playlist → EPG → <source> → Time offset-1h, +1h, etc.

EPG cache lifetime

Lumen caches the parsed EPG on disk. Default refresh: every 6 hours. To change:

Settings → EPG → Refresh interval.

For a fresh refresh on demand: Settings → EPG → Refresh now.

Memory & big EPGs

Some EPG sources ship 50,000+ programs across 2,000 channels. On older webOS hardware (2020–2021 NanoCell), this can stutter the EPG grid.

If you see lag scrolling the guide:

  1. Reduce the EPG window: Settings → EPG → Display window → 6h (default), 4h, or 3h.
  2. Filter to your favorite groups only: Settings → EPG → Show groups → uncheck what you never watch.
  3. As a last resort, use a smaller EPG source. The IPTV-org per-country EPGs are much lighter than the global one.

Useful XMLTV sources

  • IPTV-org country EPGs: https://iptv-org.github.io/epg/guides/{country}/xmltv.xml (replace {country} with fr, de, es, etc.)
  • Free Worldwide EPG aggregators: many community sources; verify before use.
  • Your provider’s own EPG: usually best — matches your channel IDs exactly.

Verify EPG is loading

Settings → EPG → Inspect shows:

  • Number of XMLTV sources loaded
  • Number of programs parsed
  • Number of channels matched (should equal or exceed the number of channels with tvg-id)
  • Last refresh timestamp + bytes downloaded

If parsed = 0 even though the URL works, the file is probably gzipped and your provider isn’t setting the right Content-Encoding header. Add ?gz=1 to the URL or contact us — we’ll add a workaround.

Was this helpful?

Edit suggestions: wiki@lumentv.app · Open an issue on GitHub.