Run everywhere
Everything you need for IPTV
📋 Playlist Management
- Import M3U / M3U8 from URL or local file
- SQLite database for persistent channel storage
- Automatic deduplication on import
- Track channel addition dates
- Scheduled auto-update (Daily / Weekly / Bi-Weekly / Monthly)
🎬 Channel Categories
- Live Shows — channels streamed as
.ts - Movies — VOD content detected by keywords
- Series — episodes detected by S01E01 patterns
- Search across all categories
- Channel logos loaded via TvgLogo
▶️ Video Player
- Fullscreen playback on all platforms
- HTTP & HTTPS streaming support
- Auto-hide player controls
- Landscape lock during playback
- Platform-native media renderers
🖥️ User Interface
- Minimal, dark-themed design
- Responsive layout: smartphone / tablet / TV
- Remote-control navigable on Smart TVs
- Lazy-load category content on scroll
- Real-time import progress indicator
🔗 Synchronization between different devices
- Syncs your watched movies and episodes
- Saves and syncs your playback position
- Pick up right where you left off on any movie or episode
🎬 Rich Metadata with TMDB
- Fetches accurate details for movies and TV shows
- Automatically loads posters, backdrops, and cast info
- Keeps your media library organized with up-to-date data
Automatic content detection
📡 Live Shows
URLs that end with .ts extension are classified as live streams — TV, sports, news channels.
Example: stream/channel.ts
🎥 Movies
Group title or channel name contains keywords such as movie or film. Fallback for non-.ts, non-series VOD.
📺 Series
Detected by keywords (series, tv show, episode) or episode patterns like S01E01, s02e05.
How playlist updates work
Startup check
App reads the configured update frequency and compares it to the last update timestamp stored in the database.
Download
The M3U playlist is downloaded from the configured URL. Real-time progress shows KB transferred and percentage.
Parse
Playlist is parsed in memory. Channel metadata (name, logo, group, type) is extracted from M3U directives.
Bulk import
Existing channel URLs are loaded once. New channels are identified in-memory and inserted in a single SQLite transaction — no duplicates.
Done
Channel lists refresh automatically. Progress indicator disappears. All pages show updated content.
Optimised for large playlists
| Playlist size | Method | Import time |
|---|---|---|
| 5 000 channels | Per-row DB insert (old) | 30 – 60 seconds |
| 5 000 channels | Bulk transaction (current) | 2 – 5 seconds |
🗄️ Single-query load
- All existing URLs loaded once at import start
- Stored in a
HashSet<string>for O(1) lookup
⚡ Bulk insert
- All new channels inserted in one SQLite transaction
- No per-row round-trips to the database