CLUB IPTVIndependent IPTV player
Knowledge base

Build better playlists.

Install the app, connect a device, describe every playlist option clearly and provide programme data without guessing what the player expects.

Getting started

Connect the Playlist Editor

A connection code is a short-lived invitation from one TV or browser device. It never reveals the database ID. After a successful connection, an encrypted Laravel session remembers that device in the current browser.

1
Request a code

In the app, open Settings → General and choose the connection-code option.

2
Enter it once

Open the Playlist Editor and submit the displayed code before it expires.

3
Refresh the app

Save your changes, then use Refresh in the app. Android requests bypass its WebView playlist cache.

Playlist sources

Choose how the playlist is loaded

Content areaUse it forHow it behaves
My PlaylistsLive channels stored for this deviceEdit or upload M3U content through the connected Playlist Editor. The backend returns it to that device.
My VideosStored VoD entriesUse type="video" and add optional artwork, description, audio, subtitle and aspect-ratio data.
FavoritesChannels selected in the playerManaged per device. Editing or deleting an item affects only the connected device.
BroadcastTV-tuner channelsCreated by compatible TV hardware; the web editor can manage existing items but cannot invent tuner services.
External PlaylistsRemote playlist URLsThe app downloads the remote list when it is opened. Multiple external playlists may be saved per device.

External playlist requirements

  • The player recognizes M3U, XSPF, XML/JSPF, PLS and ASX lists. The visual web editor is designed around Extended M3U options.
  • The remote URL must be reachable from the TV. A private IP is usable only while the TV is on that network.
  • This installation does not relay public media through the Laravel backend. The playlist, manifests, segments, subtitles and artwork are requested from their own origins.
  • Browser clients need CORS permission. At minimum, return Access-Control-Allow-Origin for the website origin or * when credentials are not used.
  • Use HTTPS for both the website and playlist to avoid mixed-content blocking.
Access-Control-Allow-Origin: https://iptv.club-bg.org Access-Control-Allow-Methods: GET, HEAD, OPTIONS Access-Control-Allow-Headers: Range Access-Control-Expose-Headers: Accept-Ranges, Content-Length, Content-Range

Local-network playlists

Add the local URL as an External Playlist, for example http://192.168.1.20/playlists/home.m3u. Bind that server to the LAN interface, permit it through the firewall and keep the address stable with DHCP reservation or local DNS. Unlike the historical OEM behavior, this independent build does not rely on an automatic iptv.local service.

TV platforms

Install or launch CLUB IPTV

Use the CLUB IPTV website address or the installation package provided for your platform. An Android APK cannot be installed directly on Samsung Tizen or LG webOS; those platforms need their own package or can use the hosted browser version.

DeviceRecommended methodWhat to do
Android TV / Google TVInstall the APKCopy the signed APK to USB or download it from your HTTPS site. Allow installation from that file manager/browser, install it, then open CLUB IPTV.
Android boxesInstall the APKUse USB, a browser download or adb install your-app.apk. Keep the same package name for upgrades; use the separate custom package name if the OEM app must remain installed.
Amazon Fire TVSideload the APKEnable developer options, use a trusted downloader or ADB, install the APK and launch it from Apps.
Sony / Philips with Android or Google TVInstall the APKFollow the Android TV method. Confirm the TV allows unknown sources and supports the codecs used by your streams.
Samsung TizenTizen widget or hosted appAn APK will not work. Install the Tizen package provided for the target TV, or open https://iptv.club-bg.org in the TV browser. USB widget installation is model/year dependent.
Older Samsung OrsayLegacy widget or browserRequires an Orsay-compatible packaged widget placed in the exact USB folder expected by that model. The Laravel website alone is not an Orsay widget.
LG webOSwebOS package or hosted appPackage the web client as an IPK and install it through LG Developer Mode for testing, or use the hosted URL in the TV browser. Production distribution requires the LG store process.
Sony non-Android professional modelsStartup URLWhere Hotel/Pro mode supports it, set the Startup Application URI to https://iptv.club-bg.org and enable startup application. Menu names and remote key sequences vary by model.
Philips / other non-Android smart TVsTV browserOpen https://iptv.club-bg.org. Full-screen playback, codecs, storage and remote-key support depend on the built-in browser.
Computer, phone or tabletModern browserOpen the hosted URL. Browser playback additionally requires compatible codecs and CORS permission from every stream origin.

Android upgrade checklist

  1. Build with the same application ID and signing certificate used by the installed custom app.
  2. Increase the Android version code.
  3. Back up the previous APK before distributing the update.
  4. Test install-over-update and a clean installation on a spare device.
Extended M3U · common format

Understand the playlist structure

Save playlists as UTF-8 text. The first line is #EXTM3U. Every item then has an #EXTINF metadata line, optional directive lines and one source URL.

#EXTM3U #EXTINF:-1 tvg-id="nova.bg" tvg-country="BG" tvg-name="Nova" tvg-logo="https://cdn.example/nova.png" group-title="General",Nova FHD https://media.example/live/nova/index.m3u8 #EXTINF:0,News channel https://media.example/live/news/index.m3u8
  • Use duration 0 or -1 for live streams.
  • Everything after the comma is the displayed title.
  • Write attributes before the comma as name="value". Keep values in double quotes.
  • The URL must be on the next non-directive line.
  • Blank lines are optional but make large playlists easier to debug.
Extended M3U · all options

Choose the correct attribute

These are the options understood by the editor and player. Recognition fields describe the channel; playback fields control how it opens; presentation fields control how it appears.

OptionWhereMeaning and example
tvg-id#EXTINFPrimary XMLTV identifier. Prefer this over name matching: tvg-id="nova.bg".
tvg-country#EXTINFSeparates regional versions with similar names: tvg-country="US".
tvg-name#EXTINFStandardized/fallback channel name used for EPG and logo recognition.
tvg-logo#EXTINFLogo image URL. Use a small transparent PNG, WebP or SVG rather than full-size artwork.
group-title#EXTINFChannel category shown in the app, for example group-title="Movies".
tvg-shift#EXTINFEPG offset in hours, for example tvg-shift="+1". Do not use it to correct a wrongly selected regional guide.
audio-track#EXTINFPreferred ISO 639-2 audio languages. First value is preferred: audio-track="bul,eng".
subtitles#EXTINFPreferred subtitle language or supported subtitle URL, for example subtitles="eng".
aspect-ratio#EXTINFRequested display ratio where supported: 16:9, 3:2, 4:3, 1,85:1 or 2,39:1.
type#EXTINFstream for live TV, video for seekable VoD, or playlist for a nested list.
description#EXTINFSecondary text shown on medium/big tiles, such as a film year or short summary.
catchup#EXTINFArchive mode: default, flussonic or shift.
catchup-days#EXTINFNumber of archive days exposed by the provider, for example catchup-days="7".
x-tvg-url#EXTM3UExternal XMLTV source for the entire playlist: x-tvg-url="https://epg.example/guide.xml".
size#EXTM3UDefault tile size for all items: size="medium".
background#EXTM3UDefault tile colour or image URL for all entries.
description#EXTM3UPlaylist-level description/default. Individual entries may override it.

Advanced lines

The editor preserves additional #EXTINF attributes and directive lines. Use options such as #EXTVLCOPT only when the target player actually supports them; browser playback may ignore native-player directives.

Presentation directives

Control each tile

Place these directive lines after their #EXTINF line and before the source URL.

DirectiveAccepted valueUse
#EXTBGHex colour, RGBA colour or image URLSets the entry’s tile background.
#EXTSIZESmall, Medium, BigSets the entry’s tile size.
#EXTCTRLHTTP(S) URLRequests a control URL when the tile is opened, before loading the content. Use only with a trusted receiver endpoint.
#EXTINF:-1 tvg-id="bnt1.bg" description="National television",BNT 1 #EXTBG: #046f55 #EXTSIZE: Medium #EXTCTRL: https://receiver.example/select/1 https://media.example/bnt1.m3u8

Entry directives override playlist-wide defaults. For example, #EXTM3U size="small" background="#10231f" sets defaults, while one item can still use #EXTSIZE: Big.

Archive playback

Configure catch-up correctly

The editor offers None, Default, Flussonic and Shift. Choose the protocol implemented by the stream provider and enter the real archive length.

#EXTINF:-1 tvg-id="nova.bg" catchup="flussonic" catchup-days="7",Nova FHD https://media.example/live/nova/index.m3u8
  • None: ordinary live stream with no archive.
  • Default: provider-specific/default catch-up URL rules.
  • Flussonic: archive URLs generated using Flussonic conventions.
  • Shift: time-shift style playback supported by the provider.

These options do not create an archive. The origin server must already store and serve historical media.

Nested content

Build a multi-level video library

A root library contains links to category playlists. Explicitly use type="playlist" when the URL does not end with .m3u or .xspf.

1. Root categories

#EXTM3U size="medium" #EXTINF:0 type="playlist" tvg-logo="https://cdn.example/years.png",By year https://media.example/library/years.m3u #EXTINF:0 type="playlist" tvg-logo="https://cdn.example/series.png",TV series https://media.example/library/series.m3u #EXTINF:0 type="playlist" tvg-logo="https://cdn.example/docs.png",Documentaries https://media.example/library/documentaries.m3u

2. A category can contain more playlists

#EXTM3U #EXTINF:0 type="playlist",2026 releases #EXTSIZE: Medium https://media.example/library/2026.m3u #EXTINF:0 type="playlist",Classics #EXTSIZE: Medium https://media.example/library/classics.m3u

3. Final playlist contains videos

#EXTM3U size="medium" background="#10231f" #EXTINF:0 type="video" tvg-logo="https://cdn.example/posters/movie-a.webp" description="2026 · 1h 42m",Movie A https://media.example/vod/movie-a/master.m3u8 #EXTINF:0 type="video" tvg-logo="https://cdn.example/posters/movie-b.webp" description="2024 · 2h 05m",Movie B #EXTSIZE: Big https://media.example/vod/movie-b/master.m3u8

type="video" tells the player the item is on-demand and should support seeking when the media format allows it. A nested playlist can mix subcategories and final videos.

Artwork memory: hundreds of full-resolution posters can exhaust older TV memory. Serve small thumbnails with sensible dimensions and file sizes; load full artwork only when opening the item.
Programme guide

Match channels with XMLTV

The recommended setup is to add XMLTV sources in the backend, select only the channels you need and run the scheduled daily refresh. Imported programmes remain available until they become older than seven days.

Recognition order

  1. tvg-id against the XMLTV channel ID.
  2. tvg-country to distinguish channels with the same display name.
  3. tvg-name and playlist title as controlled fallbacks.
<channel id="nova.bg"> <display-name>Nova</display-name> </channel> <programme start="20260728190000 +0300" stop="20260728200000 +0300" channel="nova.bg"> <title lang="bg">Programme title</title> <desc>Programme details</desc> <icon src="https://cdn.example/programme.jpg" /> </programme>

The app can also read an external guide declared in the M3U header:

#EXTM3U x-tvg-url="https://epg.example/guide.xml"

Large guides can overwhelm older TVs. Backend-managed sources are easier to filter, refresh and debug. The backend importer accepts compressed XMLTV sources, but direct TV loading depends on the device parser and is safest with a reasonably small uncompressed guide.

For a guide loaded directly by a browser/device, configure CORS and range-related headers in the same way as an external playlist. The guide URL must be accessible to that device; it is not automatically proxied through this backend.

Diagnostics

When content does not load

  • Confirm the file is UTF-8 and begins with #EXTM3U.
  • Check every #EXTINF entry has one source URL and properly quoted attributes.
  • Open the playlist URL in a browser and test streams in VLC.
  • A stream working in VLC does not guarantee that the TV supports its video codec, profile, audio layout or subtitles.
  • Browser playback requires compatible HLS and cross-origin response headers from the media origin.
  • If EPG is missing, compare tvg-id with the enabled channel in the selected EPG source.
  • If Android shows old content, save the playlist and use the app Refresh action.