A desktop IPTV player for Windows, built with WPF and LibVLCSharp. Connects to Xtream Codes–based providers, browses live channels by category, and plays streams directly. All with a local SQLite cache so your channel list survives a restart without hitting the network.
This project was built as a practice exercise in C#, WPF, and EF Core - The architecture reflects that: it favors clarity over cleverness, and a few design decisions are called out below specifically because they were practicing moments.
- Multiple provider profiles: save server URL, username, and password per provider, switch between them from a dropdown
- Xtream Codes API integration: authenticates and pulls channels via
player_api.php, not raw M3U export (more reliable, avoids slow/timeout-prone playlist export endpoints on some providers) - Category browsing: channels are grouped using the provider's real
get_live_categoriesdata, with a search box to filter categories (built to comfortably handle playlists in the 10,000+ channel range) - Local caching via SQLite + EF Core: channels and profiles persist to a local database; reopening the app shows your last-loaded channel list instantly, no re-fetch required
- Playback via LibVLCSharp: handles HLS, MPEG-TS, and other live-stream formats VLC supports natively
- Playback controls: play/pause, stop, volume
- Dark UI: custom WPF styles and control templates (no default Windows chrome)
| Layer | Choice |
|---|---|
| UI framework | WPF (.NET 10) |
| Video playback | LibVLCSharp / LibVLC |
| Data storage | SQLite via Entity Framework Core |
| Provider protocol | Xtream Codes JSON API |
- Windows 10/11
- .NET 10 SDK
- An IPTV subscription using an Xtream Codes–compatible panel (server URL, username, password)
git clone https://github.com/MGanoub/IpTvApp.git
cd IpTvApp
dotnet restore
dotnet ef database update
dotnet rundotnet ef database update creates the local SQLite database (%AppData%\IpTvApp\iptv.db) on first run. If dotnet-ef isn't installed:
dotnet tool install --global dotnet-ef- Click New next to the Profile dropdown.
- Expand Profile details and enter your provider's server URL (just the base, e.g.
http://example.com:8080, no path), username, and password. - Click Save Profile, then Load Playlist.
- Browse categories on the left, click a channel to play it.
A few decisions worth explaining, since they weren't the first thing tried:
- Channels belong to a profile via a foreign key (
Channel.PlaylistProfileId), not a join table. Each channel is provider-specific (its stream URL is built from that provider's credentials), so this is a genuine one-to-many relationship, not many-to-many. - Category browsing is two-level (category list → channel list) rather than one grouped list. An earlier version tried grouping a single
ListBoxby category, which works fine for a few hundred items but caused serious memory/performance problems at the scale this app actually needs to support (playlists with 10,000+ channels are common with IPTV providers). Splitting into "pick a category, then see its channels" keeps both lists small regardless of total channel count.
- Credentials are stored in plaintext in the local SQLite database. Fine for personal use on a trusted machine; not suitable as-is if this were ever multi-user or handling more sensitive credentials.
- Tested primarily against one Xtream Codes provider panel implementations vary, so stream URL patterns (
.tsvs.m3u8, port differences between the API and stream server) may need adjustment for other providers. - No EPG (program guide) support yet.
- No favorites yet.
- Favorites (star a channel, view a dedicated Favorites list)
- Resume-to-live behavior after pausing a live stream
- Encrypt stored credentials
This is a generic IPTV client. It does not provide, bundle, or endorse any specific content or provider. You are responsible for only using it with IPTV services you're legitimately authorized to access.