Skip to content

Technical IPTV

Kepler75 edited this page Nov 4, 2026 · 4 revisions

Home › Technical reference

IPTV

Playlists

  • Names: after its file (…/sports.m3u8: sports; sports (2) when another playlist already has that name). A link without a file name (an Xtream get.php one), or a name cleared with Rename, takes the playlist's own #PLAYLIST: / playlist-name="…", else its server.
  • Radio is recognized by radio="true", tvg-type="radio", a group-title containing "radio", or an audio file extension (.mp3, .aac, .ogg, .flac, .m4a).
  • Sports counts only tvg-type="sport" / "sports", not a group's name.
  • Guide only (tvg-type="guide"): an #EXTINF with or without a link, kept for its guide (in no row, no sources). OK on a program: the guide's original title and year (a <category> like The Book ThiefDrama / 2013 / 7.6), else its title, looked up on TMDB (with your key, Spanish titles too), else Cinemeta (original titles only). One sure match (the same name, and the year when known) opens its page; anything else, a show included, opens Search.
  • Size: each playlist is downloaded up to 20 MB and keeps its first 30,000 channels. Big ones are read in chunks, with a count ("Reading playlists… 12,000 channels"), so the remote stays responsive. Copies are saved in the TV's database.
  • Duplicates: a channel listed twice is shown once only when it's exactly the same (link, name, group and headers).
  • Auto-refresh: checked every minute, counted from the oldest playlist's download (a saved copy's too, so an old one is read again soon after StremioK starts) and from the last try (a server that's down isn't asked every minute). It waits while something plays, or StremioK is in the background; its guides are read again at once (&force=1).
  • Headers: a channel's User-Agent and Referer (#EXTVLCOPT:http-user-agent= / http-referrer= or http-referer=, the same #EXTINF attributes, #EXTHTTP:{…}, or after a | in its link: …m3u8|Referer=…) and its Cookie (#EXTHTTP:{"cookie": …}, or after the |) are applied where the TV allows it (these three only, printable, within a sane length, an addon's proxyHeaders too): by the TV's player, the service's reads and its relay, not downloads. They follow the channel when you switch sources.
  • Films in a playlist: a link to a file (a video file's name, an Xtream /movie/ or /series/ one) plays as a film from the start. A DASH or HLS link (not an Xtream /live/ one) has its manifest read as it opens (with the channel's headers, through the service when it has some): DASH type="static" (or none), HLS #EXT-X-ENDLIST or #EXT-X-PLAYLIST-TYPE:VOD (a master playlist: its first variant's) make it a film, seekable once known.
  • Configuration files: a line an addon link, playlist link or OMDb / TMDB / MDBList key (what any StremioK imports), and #!stremiok <kind> <JSON> lines, comments to an older one: playlist (a playlist's name, guide link, off), stalker (a portal: its address, MAC, name, groups) and store (one of the settings StremioK keeps, from a fixed list; integrations merged, without Trakt's). An export is posted to the service (/entry/give) for a one-time phone page with Copy and Download; the import's phone page takes a link, or the file chosen on the phone or pasted (256 KB).
  • DRM: Kodi's #KODIPROP:inputstream.adaptive. lines, before or after a channel's #EXTINF: license_type with license_key (URL|headers|R{SSM}|, the answer as it comes or B for base64), drm_legacy (system|URL|headers) or drm (JSON: server_url, req_headers); stream_headers and manifest_headers give the stream's own User-Agent and Referer. Widevine (com.widevine.alpha) and PlayReady (com.microsoft.playready) with a license server play: PlayReady's license the TV's player fetches itself (given the headers), Widevine's request the player hands over, posted by the service (/drm/license, with the playlist's headers) and its answer given back. ClearKey (keys as kid:key pairs, JSON or a key server; the TV's player has none) plays in the page's own <video> through Shaka Player 5.3.3 (js/vendor, Apache 2.0), loaded the first time one plays; only then, everything else staying with the TV's player. It goes without the channel's User-Agent, Referer or Cookie (a browser can't send them). Another system or template: said so, not played. Not repacked by the service.

Xtream, Stalker and YouTube links

  • Xtream accounts: checked with player_api.php (its user_info.auth), then saved as the account's get.php link (type=m3u_plus, output=ts: servers' own HLS tends to stall minutes in; Format switches to m3u8). A server without http(s):// is http://; a pasted Xtream link fills in the login.
  • Stalker portals: read by the service as a MAG box asks (the MAC in a cookie, a MAG User-Agent, a handshake token) at portal.php, else server/load.php. Channels (get_all_channels, else get_ordered_list pages, 100 at most within 90 seconds, or with Stalker channels › Whole portal one after another up to 30,000 channels within 17 minutes, a failed page tried five more times over about 4 minutes, a second between pages after that; Channel groups, get_genres listed and only those genres read the same way) become an M3U playlist, genres as groups, and a read that stopped short says so; a channel's link comes from create_link each time it plays, with the MAG User-Agent.
  • A Stalker portal's films and series: asked as they're shown, never read whole: categories (type=vod and type=series, get_categories), a category's titles newest first or a search (get_ordered_list, up to 42 from a position, 4 of the portal's pages at most), a series' seasons and episodes (by movie_id; a season that doesn't list its episodes, by season_id). What's read (a list from a position, a search, a series' seasons) is kept 10 minutes, the last 40 a portal, so a row or category shown again isn't asked again; Reload on the portal reads it all again. A copy of one of your titles is found by searching the portal for its name (year within one). A source is the service's /stalker/play, which asks create_link when the player opens it and redirects there, so a link saved to resume stays good.
  • A channel's own format: the player's Format swaps one channel's /live/…/123.ts and .m3u8, kept by channel (the last 300).
  • YouTube behind a link: an Xtream channel's link (…/live/user/pass/id.ext) is looked at first (redirects followed, the answer not read; where it led is kept 5 minutes, or until the playlists reload, as a server can renumber its channels); one ending on YouTube plays through StremioK's YouTube.
  • A YouTube channel's page (@handle, /channel/, /c/, /user/, any tab) plays as given; with no live stream there, its /live page, then its Featured tab.

Xtream films and series

  • Browsing, from the TV (player_api.php): categories (kept a day) as Discover's genres, a category's titles 100 at a time, a title's get_vod_info / get_series_info for its page; it plays …/movie/user/pass/<id>.<ext> or …/series/user/pass/<episode id>.<ext>.
  • The index, by the service (/xtvod/…): get_vod_streams and get_series whole, read a piece at a time (150 MB, 6 minutes, 100,000 titles each at most) into id, name, year, TMDB id and date added; saved in the app's folder a title a line, read and written in small pieces so YouTube, guides and the live relay aren't held up. Unused for 30 minutes it leaves memory (but for the newest row), and comes back from the file when asked. A list not refreshed for 3 days is deleted when a guide or list is next asked for; Clear saved copies deletes them all. While one is being read Home shows Loading… and looks again, then redraws. Read again after a day (Reload on the account: at once, its categories too). It answers the newest row (200), Search and matching.
  • Its playlist: the /movie/ and /series/ lines of an account whose server lists films or series are left out of IPTV (shown through the API instead); the IPTV rows are made again, from the saved copy, once its categories say whether it has any.
  • Matching a title from your addons: its TMDB id, else its name and year, both without a language tag (EN - , |EN|), brackets, quality words or accents. An episode: its show, then the season and number in get_series_info.

TV guide

  • Where it comes from: a playlist's typed Guide link, else its url-tvg / x-tvg-url, else an Xtream get.php link's xmltv.php (also in place of a guide the playlist names on its own server without the login).
  • Read by the service: gzipped or not; up to 60 MB, 200 MB unpacked, 5 minutes.
  • Only your channels: the app sends their keys (tvg-id, else the name, plain) as a bitset, in a POST's body (a newer TV's service reads 8 KB of a request's address and headers: thousands of channels' keys don't fit there).
  • What's kept: programs from 2 hours ago to 30 hours ahead, 150 a channel (held to that as it's read), 60,000 in all, each with its picture (<icon>). A channel's <icon> stands in for a missing tvg-logo (none into your home network from a guide on the internet).
  • Answers: kept to 2 MB; the Guide tab asks 20 channels at a time. A channel whose programs don't come (no answer, or past the 2 MB) stays on the Guide tab and is asked again 30 seconds later.
  • Saved guides: on the sideloaded app they're saved in its folder (written whole, then swapped in) and read again after 6 hours (a playlist's Reload: its guide at once, &force=1); under TizenBrew, kept in memory.
  • How many: four guides are kept: a fifth's arrival deletes the oldest's file, a file older than 2 days is deleted, one over 32 MB isn't read. Clear saved copies (Storage) deletes the saved guides too.
  • The Guide tab draws 10 channels at a time, reading their programs (and the next 10's) as you come to them. Back from a channel played from it, it moves to the time now, on the channel you ended on.

Live channels

  • CH+ / CH−: only the latest choice counts: a slower lookup for one you passed doesn't replace it, and the spinner and any error are for the channel chosen last. A channel number waits a second and a half for a second digit.
  • Choppy sound: some servers cut a channel's sound (AAC) into pieces that don't start at a whole frame. Once an HLS channel plays, StremioK's service looks at the start of one of its segments; when its sound is cut that way, the channel restarts through the service, which repacks the sound (whole frames, each with its own time) and passes the picture as it is. Remembered per channel link for two weeks. Not for encrypted streams or sound it can't read. A look still under way stops when you switch channel or close the player, its downloads in the service with it (zapping doesn't pile them up).
  • Closed captions: the same look says which caption channels (CC1–CC4) have text, and their language (English, Spanish, Portuguese) from its words; none yet: asked next time. On, the channel plays through the relay, as subtitle tracks. HLS only: a plain MPEG-TS stream (Xtream's default) has no playlist to add it to.
  • Live addons without a meta resource still open, using the catalog entry.

Clone this wiki locally