Streams Pro
Needs a Pro licence or higher.
A self-contained relay / re-streaming layer for third-party sources (M3U playlists, Xtream Codes servers, one-off URLs). Relay streams live in their own table and never appear in Channels or Packages — they are published to subscribers as a separate category. Relay streams need the Pro licence or higher: creating, importing, starting, stopping and bulk actions are refused below it. Staff also need the manage_relay_streams or manage_channels permission.
On this page
Import a provider playlist as relay streams
Header → "Add M3U" → Source Name + M3U URL → Save. The source appears in the left panel with a stream count; click it to filter the right panel to that source. Use the circular-arrow icon on the source row to re-import later — that is the correct way to re-sync, because dedupe is per source.
Connect an Xtream Codes provider
Header → "Add XC Server" → Server URL (http://host:port), Username, Password. Press "Test Connection" first — it reports "✓ N channels found" or the provider's error without saving anything. Then Save; the server is probed again and the import runs immediately (a failing probe aborts the save with the provider's error).
Add a single stream by hand
Header → "Add Stream" → Stream Name, Group (defaults to "Manual"), Stream URL (http/rtmp/udp), optional Logo URL and EPG ID. These land under the "Individual → Manual Streams" entry in the left panel.
Run and monitor streams
Each card has play / stop / restart (restart only while running), plus edit and delete. The left-panel footer shows Total / Live / Off / Error and the last health-check line. Filter by source and by the search box, then use "Start All" / "Stop All". Running cards show uptime; failed cards show the last error text; the card also shows now/next EPG when an EPG ID is set.
Change how a stream is delivered
Card → pencil. "Output Format" = "Redirect to source (client connects direct — source sees the viewer's IP)" or "HLS via FFmpeg (relayed through this server)". "Preset" = Passthrough (copy), 720p HD, 1080p Full HD, 480p SD, or 1080p GPU (NVENC). Redirect spawns no process: the viewer is sent straight to the provider's URL. The same dialog holds Backup URL, Channel Number, Group, EPG ID, the logo pickers (local picons, online search, and an "Auto" match button) and the Enabled switch.
Publish relay streams to subscribers
Header → "Category Name" sets the label clients see; per country/group it renders as "<Category Name>: <group>" (plain "<Category Name>" for streams with no group). Header → "Export M3U" downloads the authenticated playlist of all enabled streams. Since 2.9.318 the relay stream URLs (/api/relay/live/…) need a login: subscribers reach them through their own Xtream / Stalker links, which add a 24-hour token for that one stream, and /relay/streams.m3u is each subscriber's personal playlist (the link in their account page carries their stream token; it changes when they reset their links). The Export M3U file lists the relay URLs without a credential, so a player now gets 401 for them: they open only with a console login (admin, or staff with the Streams or Channels right). Disabling a stream stops it for subscribers at once, including tokens already handed out. The setting relay_require_auth = 0 restores the old open URLs and the public playlist (rollback only). Whether a subscriber sees relay streams over Xtream/Stalker is the "Relay Streams" checkbox on each package in Packages (on by default).
Watch out
- "Health Check" is destructive: dead streams are DELETED from the database outright, with no confirmation and no undo. It also runs automatically every 24 hours in the background (first run ~2 minutes after boot). It only probes enabled streams whose Output Format is Redirect to source and whose URL is http/https — rtmp/udp URLs are treated as alive and never touched.
- Both importers default to "Redirect to source". That hands every viewer the provider's own URL, including any username and password inside it. Use "HLS via FFmpeg" for any source whose address must stay private — it costs a process and your uplink per stream.
- Relay streams are completely separate from Channels and Packages, and they do not count against the licence max_channels limit (that limit counts the channels table only).
- "Start All" / "Stop All" act on the whole currently-filtered set (selected source + search box), not just the visible page and not on every stream in the system.
- Re-importing a playlist by adding it again as a NEW source duplicates everything — dedupe is per source_id, and duplicate names get " (2)" appended. Always use the refresh icon on the existing source row.
- Since 2.9.343 "Auto-refresh every N hours" on an M3U / XC source works: about every 15 minutes the server refreshes, one at a time, each enabled source with it ticked whose last refresh is older than its interval, with the same import as the refresh icon (which still refreshes at once). It waits while the Public Playlist generator rebuilds its lists, so a source that points at the generator picks up the fresh lists, and a source that fails waits an hour before the next try. Like the refresh icon it only adds new streams; it never removes or renames existing ones.
- Deleting a source only deletes the source row unless you tick "also delete streams". Streams left behind keep their now-dangling source_id, so they vanish from every left-panel filter (including "Manual Streams") and are only reachable under "All Streams".
- Anything other than Output Format = Redirect to source launches a per-stream FFmpeg process. HLS + Passthrough preset is a remux (copy); any 480p/720p/1080p/NVENC preset is a real transcode. Ten such streams is ten encoder processes — size it against your CPU/GPU first.
- "Fetch Logos" previews first and only fills streams that have NO logo; it never overwrites one you set.
- In English the left-panel heading above M3U sources renders as the raw key "streams.source.m3u_playlists" — the translation string is missing from lang/english/console.js. Cosmetic only.
- A YouTube link as a relay stream's input or backup (2.9.494) is accepted only after the admin's YouTube confirmation (Settings → Integrations & API → Media server import → YouTube): only your own channels, or ones you hold the rights to redistribute. Without it adding or changing such a stream answers 409. A playlist source imports its YouTube entries only after that confirmation (they are skipped and counted as skipped). With the Library module off, the YouTube confirmation is still under Settings → Integrations & API → Media server import → YouTube.