Skip to content

Web Player

Every proxy you configure can be watched straight from the browser. The web player lives at /player on the dashboard port, shares the dashboard's session and design system, and is the fastest way to answer "is this a tunlx problem or a client problem?" — if a stream plays here, tunlx is serving it correctly.

The built-in web player

Opening the player

There are three equivalent ways in:

  1. Play on a proxy card. Every card — standard, composite, or Xtream service — has a Play action that opens the player for that proxy.
  2. The Open player menu in the navbar. The header's Open player button lists all proxies grouped by type, with a live Streaming / Ready badge and the stream currently playing on each. Pick one to jump straight in. With more than eight proxies the menu opens on a Filter proxies field: type part of a name, press Down to move into the matches or Enter to open the first one, and Esc to clear the text (a second press closes the menu). On a phone the field stays put at the top of the list but is not focused for you, so the keyboard does not cover the proxies.
  3. A direct URL. /player?proxy=<name> deep-links to a proxy; add &type=live, &type=vod, or &type=series to land on a content type. Opening /player without a proxy, or with one that no longer exists, goes back to the dashboard and says why.

The player uses your dashboard session — viewers who should not see the admin UI should be given Xtream service credentials and a real IPTV client instead.

Viewer logins

A standard proxy whose Xtream username and password are saved in its settings opens straight into the catalog, and so does a composite proxy that has a login of its own, or none. For everything else the player asks once for a login: the one your IPTV provider gave you, for a standard proxy with none saved; or, for an Xtream service (your own panel with its own user accounts) or a composite proxy built from one, one of the viewer logins you created for it. A rejected login is asked for again instead of being kept.

tunlx keeps the login you type, and the page does not: a standard proxy's goes into its settings, encrypted like the other passwords in config.json, and a service's stays in your dashboard session, so you type it again after you sign out of tunlx. The page signs in with a placeholder, so the password is in no address it requests. The browser remembers only the name that signed in, to offer it next time, and forgets it when you sign out. Signing in to a composite proxy only checks the login: it never changes the composite's own.

The player's viewer login prompt

Browsing content

  • Live TV / Movies / Series tabs switch the content type.
  • The Channel Browser sidebar stacks Categories, Streams, and (for series) Episodes as accordions, each with its own search box. The last category you browsed is restored after a reload or proxy switch.
  • The address follows what you open. Choosing a category or a content type is a step in the browser's history, so Back returns to the previous category instead of leaving the player; playing a channel updates the address without adding a step. It names the proxy, the content type, the category (cat, and src for the source of a composite proxy's category) and the channel (stream), so a reload reopens all of them, and the address can be sent to someone else: they sign in first if they have to, and come back to it. A category in the address wins over the last one you browsed.
  • On phones the sidebar becomes a full-screen sheet behind the Browse Channels button, so the video keeps the whole width. While it is open it is a named dialog and the page behind it cannot be reached (Esc closes it).

Playback controls

The now-playing bar above the video shows the channel logo, title, and EPG now/next information, plus:

Control What it does
Previous / Next channel (episode) Steps through the current category, or, for a series, through its episodes season by season. Keyboard: Page Up / Page Down.
Refresh stream Re-opens the current stream.
Picture-in-Picture Pops the video into a floating window.
Copy stream URL Copies the direct stream URL (honors publicBaseURL).
Open in new tab Opens the raw stream URL, e.g. to hand to another app.
Quality Appears when an HLS stream advertises multiple variants; pick a fixed level or stay on Auto.
Buffer Picks how much media the player holds ahead of the playhead: Auto (engine defaults), Low latency, Balanced, Stable, or Maximum. Deeper buffers ride out jittery connections at the cost of a higher live delay. The choice persists in the browser and re-applies the moment you pick it.

Keyboard shortcuts

Press ? (or the keyboard button in the toolbar) for this list in the player. A key that belongs to the control you are on is left to it: Space presses a button or a link you reached with the keyboard, and the arrow keys stay inside an open menu.

Key What it does
Space Play or pause (on a button reached with the keyboard, it presses the button).
M Mute or unmute.
F Full screen.
/ Search the list that is open.
Up / Down Move through the channel or episode list.
Page Up / Page Down Previous or next channel or episode.
Esc Close a menu or the channel browser.

HLS, MPEG-TS, MP4, and Matroska streams all play in the browser through the bundled playback engines — no plugins. The Buffer presets apply to the HLS and MPEG-TS engines; native playback manages its own buffering. For buffering on the server side of the proxy, see the per-proxy streamBufferKB setting in Configuration.

Series

Choosing a series lists its seasons, and a season lists its episodes with their number, plot and length when the provider sends them (hover an episode for the series' genre and rating too). A series with one season opens straight on its episodes. When an episode ends, the next one is offered and starts by itself after five seconds unless you press Stay. A series that cannot be loaded says so, with the reason and Try again; that is different from a series that has no episodes.

When a stream will not play

A stream that fails says why, over the video, with Retry and Copy stream URL (Copy URL and Open in new tab stay available, so the address can be tried in VLC):

Message What it means
This browser can't decode H.264 The browser has no H.264 decoder. Live TV is nearly always H.264. Chromium builds without proprietary codecs (common on Linux distributions) cannot play it; Chrome, Edge, Firefox and Safari can.
The provider no longer has this stream (HTTP 404) The channel was removed or renumbered. Pick another, or reload the catalog.
The provider refused this stream (HTTP 403) The subscription may have expired, or the provider blocks the server's address.
This account has reached its maximum number of connections (HTTP 429) Close the stream on another device or tab, then Retry.
The provider did not answer properly (HTTP 5xx) The provider is down or overloaded.

Live streams reconnect up to three times (1, 2 and 4 seconds apart) after a dropped connection, a timeout, a 5xx or a 429. A 404 or a 403 is not retried, and neither is anything that is not live. A request for categories or channels that fails shows Could not load… with Try again, not an empty list.

EPG timeline

For live content, Timeline swaps the video for a scrollable programme guide rendered from the proxy's XMLTV data, and Refresh EPG pulls fresh data on demand. The timeline is a desktop feature; on phones the player keeps the now/next summary in the toolbar instead.

Switching proxies — and getting back

The player header mirrors the dashboard header:

  • A Dashboard button returns to the admin UI (the logo does too).
  • The Proxy selector switches to any other proxy — grouped into composite proxies, standard proxies, and Xtream services just like the dashboard's Open player menu — keeping your content type.
  • Theme toggle, debug console, and logout round it out.

The debug console (bug icon) streams player internals — stream URLs tried, EPG fetches, playback errors — and is the first place to look when a stream refuses to start. It stays on, and shown, across reloads until you switch it off, and the login inside a stream address is masked (/live/***/***/1001.ts), so its Copy button is safe to paste into a bug report.