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.
In the app, open Settings → General and choose the connection-code option.
Open the Playlist Editor and submit the displayed code before it expires.
Save your changes, then use Refresh in the app. Android requests bypass its WebView playlist cache.
Choose how the playlist is loaded
| Content area | Use it for | How it behaves |
|---|---|---|
| My Playlists | Live channels stored for this device | Edit or upload M3U content through the connected Playlist Editor. The backend returns it to that device. |
| My Videos | Stored VoD entries | Use type="video" and add optional artwork, description, audio, subtitle and aspect-ratio data. |
| Favorites | Channels selected in the player | Managed per device. Editing or deleting an item affects only the connected device. |
| Broadcast | TV-tuner channels | Created by compatible TV hardware; the web editor can manage existing items but cannot invent tuner services. |
| External Playlists | Remote playlist URLs | The 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-Originfor the website origin or*when credentials are not used. - Use HTTPS for both the website and playlist to avoid mixed-content blocking.
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.
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.
| Device | Recommended method | What to do |
|---|---|---|
| Android TV / Google TV | Install the APK | Copy 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 boxes | Install the APK | Use 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 TV | Sideload the APK | Enable developer options, use a trusted downloader or ADB, install the APK and launch it from Apps. |
| Sony / Philips with Android or Google TV | Install the APK | Follow the Android TV method. Confirm the TV allows unknown sources and supports the codecs used by your streams. |
| Samsung Tizen | Tizen widget or hosted app | An 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 Orsay | Legacy widget or browser | Requires 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 webOS | webOS package or hosted app | Package 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 models | Startup URL | Where 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 TVs | TV browser | Open https://iptv.club-bg.org. Full-screen playback, codecs, storage and remote-key support depend on the built-in browser. |
| Computer, phone or tablet | Modern browser | Open the hosted URL. Browser playback additionally requires compatible codecs and CORS permission from every stream origin. |
Android upgrade checklist
- Build with the same application ID and signing certificate used by the installed custom app.
- Increase the Android version code.
- Back up the previous APK before distributing the update.
- Test install-over-update and a clean installation on a spare device.
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.
- Use duration
0or-1for 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.
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.
| Option | Where | Meaning and example |
|---|---|---|
tvg-id | #EXTINF | Primary XMLTV identifier. Prefer this over name matching: tvg-id="nova.bg". |
tvg-country | #EXTINF | Separates regional versions with similar names: tvg-country="US". |
tvg-name | #EXTINF | Standardized/fallback channel name used for EPG and logo recognition. |
tvg-logo | #EXTINF | Logo image URL. Use a small transparent PNG, WebP or SVG rather than full-size artwork. |
group-title | #EXTINF | Channel category shown in the app, for example group-title="Movies". |
tvg-shift | #EXTINF | EPG offset in hours, for example tvg-shift="+1". Do not use it to correct a wrongly selected regional guide. |
audio-track | #EXTINF | Preferred ISO 639-2 audio languages. First value is preferred: audio-track="bul,eng". |
subtitles | #EXTINF | Preferred subtitle language or supported subtitle URL, for example subtitles="eng". |
aspect-ratio | #EXTINF | Requested display ratio where supported: 16:9, 3:2, 4:3, 1,85:1 or 2,39:1. |
type | #EXTINF | stream for live TV, video for seekable VoD, or playlist for a nested list. |
description | #EXTINF | Secondary text shown on medium/big tiles, such as a film year or short summary. |
catchup | #EXTINF | Archive mode: default, flussonic or shift. |
catchup-days | #EXTINF | Number of archive days exposed by the provider, for example catchup-days="7". |
x-tvg-url | #EXTM3U | External XMLTV source for the entire playlist: x-tvg-url="https://epg.example/guide.xml". |
size | #EXTM3U | Default tile size for all items: size="medium". |
background | #EXTM3U | Default tile colour or image URL for all entries. |
description | #EXTM3U | Playlist-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.
Control each tile
Place these directive lines after their #EXTINF line and before the source URL.
| Directive | Accepted value | Use |
|---|---|---|
#EXTBG | Hex colour, RGBA colour or image URL | Sets the entry’s tile background. |
#EXTSIZE | Small, Medium, Big | Sets the entry’s tile size. |
#EXTCTRL | HTTP(S) URL | Requests a control URL when the tile is opened, before loading the content. Use only with a trusted receiver endpoint. |
Entry directives override playlist-wide defaults. For example, #EXTM3U size="small" background="#10231f" sets defaults, while one item can still use #EXTSIZE: Big.
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.
- 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.
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
2. A category can contain more playlists
3. Final playlist contains videos
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.
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
tvg-idagainst the XMLTV channel ID.tvg-countryto distinguish channels with the same display name.tvg-nameand playlist title as controlled fallbacks.
The app can also read an external guide declared in the M3U header:
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.
When content does not load
- Confirm the file is UTF-8 and begins with
#EXTM3U. - Check every
#EXTINFentry 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-idwith the enabled channel in the selected EPG source. - If Android shows old content, save the playlist and use the app Refresh action.