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
- You provide one or more XMLTV URLs (an XML format used by ~95% of IPTV EPG providers).
- Lumen downloads them in the background, parses programs, and indexes them by
channelID. - 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 → EPG → Add 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:
- Reduce the EPG window: Settings → EPG → Display window → 6h (default), 4h, or 3h.
- Filter to your favorite groups only: Settings → EPG → Show groups → uncheck what you never watch.
- 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}withfr,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.