explainroo
explainroo is a free, open source tool that lets your AI agent make explainer videos with a voice. It runs on your own computer and needs no API key.
A free, open-source IPTV player for Windows, macOS and Linux, with free channels built in.
MediaPython · JavaScriptGitHub @ozankaraaliOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
A cross-platform STB, Xtream, IPTV, Jellyfin and Emby player client
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗QiTV is a free TV player for IPTV. It plays M3U playlists (lists of channel links), Xtream accounts (a server address with a username and password) and STB portals (a set-top-box portal address and a MAC address), on Windows, macOS and Linux.
Version 2.0 works like a TV: the channel fills the window, ↑ and ↓ change channels, and everything else (the channel list, the guide, the player controls) slides in over the picture and gets out of the way again. You can pause and rewind live TV, watch two channels at once, and browse movies and series in a Library with posters. Since 2.1, several providers mix in one channel list, one Library and one history, and what plays keeps playing in a corner while you browse. It is written in Python with Qt and plays everything with VLC.
All screenshots show demo content: the channels, programmes, posters and the test-pattern picture are made up by scripts/make_demo_content.py.
Download QiTV from RELEASES:
qitv-windows.exe. Run it; there is nothing to install. QiTV is not signed, so the first time Windows may say "Windows protected your PC": choose More info, then Run anyway.qitv-macos-universal.dmg for Apple silicon Macs, qitv-macos-intel.dmg for Intel Macs. Open it and drag QiTV onto Applications (the same app also comes as a .zip). To update, Help → Check for Updates downloads the new .dmg, opens it and closes QiTV: drag QiTV onto Applications again and choose Replace. QiTV needs macOS 13 or newer. QiTV is not notarized by Apple, so the first time macOS may say it cannot check the app: open System Settings → Privacy & Security and choose Open Anyway.qitv-linux. Make it runnable with chmod +x qitv-linux, then start it. QiTV needs glibc 2.38 or newer: Ubuntu 24.04, Debian 13, Fedora 39 or newer.VLC comes inside QiTV: you do not need to install VLC to use it.
After downloading the release binary or cloning the repo, you can install QiTV into your application menu so it persists across reboots:
Using the release binary:
chmod +x qitv-linux
git clone https://github.com/ozankaraali/QiTV/ # needed for install script and icon
cd QiTV
./scripts/install-linux.sh /path/to/qitv-linux
Using the source build (see Running from source):
./scripts/install-linux.sh
This installs a desktop entry and icon so QiTV appears in your application menu. The desktop entry uses absolute paths, so it works after rebooting without needing to re-activate the virtual environment.
Troubleshooting on Linux:
version `GLIBC_2.38' not found, your Linux is older than the libraries inside QiTV need (glibc 2.38: Ubuntu 24.04, Debian 13, Fedora 39 or newer). On an older one, run QiTV from source.sudo apt install libxcb-cursor0 (Debian/Ubuntu) or sudo dnf install xcb-util-cursor (Fedora).~/.local/bin is in your PATH. Add export PATH="$HOME/.local/bin:$PATH" to your ~/.bashrc if needed.On a first start QiTV opens with a publicly available playlist of free channels from around the world, so you can try it straight away. To add your own provider:
Press Enter (or click the picture) to open the channel list.
Press ← until you reach the left-most column, the list of your sources (or click your provider's name at the top of the list). With two or more providers, All providers is at its top. At its bottom are ⚙ Settings, + Add provider, + Free channels… (iptv-org's free playlist again, for all countries or one country) and Open file (a video file on your computer, as Ctrl/⌘+O).
Choose + Add provider. Settings opens on the Providers tab with a new provider to fill in:
http://192.168.1.20:8096), your username and your password. Verify Provider signs in; QiTV keeps the sign-in the server gives it, not your password (see Jellyfin and Emby).Got a single link from your provider? Copy it and press Paste link beside the address (or paste it into the address): an Xtream link with your username and password in it (get.php?username=…&password=… or player_api.php?…) fills in Xtream, the server, the username and the password; a playlist address ending in .m3u or .m3u8 fills in an M3U playlist; a portal address with /c/ or /stalker_portal/ in it fills in STB (add the MAC address yourself).
You can also drop a playlist file (.m3u or .m3u8) or such a link onto the QiTV window: it becomes a provider and the channel list switches to it (a portal's link opens this form, for its MAC address). A subtitle file dropped at the same time still goes to what plays.
Press Verify Provider to check the details, then Save. QiTV loads the channels, and the Library loads the provider's movies and series.
When a channel or a film doesn't open, or a provider can't be reached, QiTV asks the provider's account why (without opening a stream, at most once a minute) and says it in plain words: the subscription has expired, all the streams the account allows are in use ("Your account allows 1 stream; one is in use"), the username or password is wrong, the server refused or blocked QiTV, or it didn't answer. When QiTV's other picture is the one using the account's only stream, it says that instead. Verify Provider says the same: an expired, disabled or refused account doesn't verify, and a portal whose profile shows an end date in the past verifies with a note (some portals keep old dates).
If you delete every provider, including the free playlist, QiTV shows a welcome card whose Add provider button does the same; its Free channels… button adds iptv-org's free list again, for all countries or one country. Settings is one click away too: the ⚙ at the right end of the channel list's top row (beside it, ↻ loads your provider's channels and guide again, also Ctrl/⌘+R, ⌕ searches, and the clapperboard opens the Library at Movies or the section you opened last, as Ctrl/⌘+2; a provider's own Movies and Series rows open the Library on that provider), or the menu bar (Ctrl/⌘+,). The same row starts with ‹, which goes back a level like ←, and the names of where you are: click one to go there. To browse another provider, click your provider's name in that row and pick another in the sources column, or use the Providers menu. This only changes what the list shows: what plays keeps playing (see Several providers).
QiTV keeps each provider's lists for six hours and refreshes them in the background, so they open at once. If your provider allows only one or two streams at a time, QiTV never opens more: set Max simultaneous streams in the provider's settings when QiTV cannot read the limit from the provider. The limit counts per provider.
With two or more providers, QiTV mixes them: every channel, film and series knows the provider it came from and always plays from there, whichever list you found it in.
The channel list and the Library each remember the provider (or All providers) you browsed last, also after a restart. With a single provider there is no All providers row, and everything works as before.
Use the arrow keys like a TV remote: ↑ and ↓ change the channel, numbers jump to a channel, Backspace goes back to the channel before, and Enter opens the channel list. Each change shows a banner with the channel, what is on now and what is next. Hold the key (or press it quickly a few times) and a fast list of the channels around you opens; QiTV tunes the one you stop on.
The channel list has your groups (with ★ Favorites and Recent at the top) on the left and their channels on the right, each with what is on now. To find a genre or a channel, type its name (or click ⌕ Find above the channels first): the matching genres come first, then the channels, from every provider (with two or more, each says which provider it is from): whole words before parts of words, then the provider you are browsing or watched last, then your favorites. Click or press Enter to open a genre or play a channel; the last row looks for films and series with those words in the Library. Esc or ✕ takes the list back to where it was. With the mouse: click the picture for the channel list, double-click it for fullscreen, and use the wheel over the picture to change the volume (over the channel list it changes channels; to change channels over the picture too, see Settings → Mouse wheel; Ctrl/⌘ with the wheel always changes the volume). Moving the mouse shows the player controls. Besides play, ■ (stop: nothing plays or streams until you play again) and the speaker they have ⌕ (search), the guide, ⟲ (the channel before) and, at the live edge of a channel you can rewind, ◀10. On live TV, click the channel's name at the top for what is on, the ★ beside it to add it to your favorites or remove it, and the red ● after that to record the channel (see Recording). Typing aside, every key in the tables below has a way to do it on screen: a button (its tooltip names the key), a row, the A–Z rail, the mixer's rows, a click, double-click or the wheel on the picture, or the window's own close button.
On a Mac in fullscreen, switching to another desktop or app floats the picture in a small window on every desktop, as a browser does on a tab change; drag it anywhere, drag an edge or a corner to resize it (it keeps 16:9 and remembers its place and size), and double-click it (or come back to the player's desktop) to watch in fullscreen again. Settings → Float the picture when you leave a fullscreen desktop turns it off.
These are also in the app under Help → Keyboard Shortcuts. Ctrl/⌘ means Ctrl on Windows and Linux and ⌘ (Command) on a Mac.
Watching TV
| Keys | What they do |
|---|---|
| ↑ / ↓ | Previous / next channel (volume during a movie) |
| 0–9 | Type a channel number |
| Backspace | Previous channel |
| Enter | Channel list |
| ← / → | Back / forward 10 seconds |
| Space | Play / pause |
| X | Stop: nothing plays or streams (Space plays it again) |
| L | Go live |
| R | Record the channel, or stop recording |
| G | Guide |
| I | Channel info |
| + / - | Volume up / down (the mixer) |
| M | Mute |
| Tab | The mixer's other row (while it shows) |
| J / K | Sound 50 ms earlier / later (sync with the picture) |
| Shift+J / Shift+K | Subtitles 50 ms earlier / later |
| A | Picture: aspect ratio, deinterlacing, sleep timer; pressed again, the next ratio |
| Shift+I | Statistics over the picture: show or hide |
| F / F11 / ⌃⌘F (Mac) | Fullscreen |
| Ctrl/⌘+F | Search |
| Ctrl/⌘+D | Add or remove a favorite channel |
| P / Ctrl/⌘+P | Picture-in-picture with the previous channel, or close it |
| S | Swap the large and the small picture |
| V | Multiview: several channels at once, or back to one |
| Alt/⌥+P | Mini player |
| Esc | Close what is open, leave the multiview or fullscreen; after a movie, back to the Library |
Channel list
| Keys | What they do |
|---|---|
| ↑ / ↓ | Move |
| Page Up / Page Down | Page |
| ← / → | Layer up / down |
| Enter | Open or play |
| A–Z | Find a genre or channel (every provider) |
| Backspace | Delete a letter of the find |
| Ctrl/⌘+D | Add or remove a favorite channel |
| Ctrl/⌘+P | Open the channel in picture-in-picture |
| Delete (fn+⌫ on a Mac) | Remove the channel from Recents |
| Ctrl/⌘+F | Search |
| F11 / ⌃⌘F (Mac) | Fullscreen |
| Esc | End the find, then close |
Guide
| Keys | What they do |
|---|---|
| ↑ / ↓ | Move between channels |
| ← / → | Earlier / later |
| Home | Now |
| 0–9 | Jump to a channel number |
| Enter | Watch the channel; a past programme from its start |
| R | Record the programme at its time, or cancel its recording |
| Ctrl/⌘+F | Search |
| F / F11 / ⌃⌘F (Mac) | Fullscreen |
| G / Esc | Close the guide |
Movies and Series
| Keys | What they do |
|---|---|
| ↑ / ↓ / ← / → | Move |
| Enter | Play or open |
| Home / End | First / last title |
| A–Z | Type to search every provider's movies, series and channels |
| Ctrl/⌘+F | Search |
| / | Search, or type it in the search |
| Ctrl/⌘+D | Add to or remove from My list |
| Delete (fn+⌫ on a Mac) | Delete the recording (it asks first) |
| F11 / ⌃⌘F (Mac) | Fullscreen |
| Esc | Back; from the genres, back to live TV |
Finding subtitles
| Keys | What they do |
|---|---|
| ↑ / ↓ | Move in a list; up from the top to the search field |
| Page Up / Page Down | Page |
| ← / → | Between the languages and the subtitles |
| Enter | Download and show the subtitles; in the field, search (or save the key) |
| A–Z | Type what to search for (or the API key) |
| Ctrl/⌘+V | Paste |
| Backspace | Delete a letter |
| Esc | Close |
Anywhere
| Keys | What they do |
|---|---|
| Ctrl/⌘+1 | Live TV |
| Ctrl/⌘+2 | Movies |
| Ctrl/⌘+3 | Series |
| Ctrl/⌘+4 | Multiview |
| Ctrl/⌘+5 | Recordings |
| Ctrl/⌘+O | Open a file |
| Ctrl/⌘+, | Settings |
| Ctrl/⌘+R | Refresh channels and guide |
| Ctrl/⌘+Shift+R | Refresh films and series |
| Ctrl/⌘+Q | Quit |
In the channel list, plain P types into the filter, so picture-in-picture there is Ctrl/⌘+P.
On some channels the sound slowly drifts out of step with the picture. The ♫ button in the player controls opens the Sound panel: pick another sound track there when the channel or film has more than one, and use the Sync row to move the sound: − makes it play earlier and + later, 50 milliseconds at a time (up to 5 seconds either way). It reads, for example, "Sound 150 ms later", or "In sync"; Reset puts it back. J and K do the same from anywhere on the player. QiTV remembers the setting for each live channel, also after a restart, and uses it whenever that channel plays, big or small. For a film or an episode it lasts while that title plays.
The subtitles button beside it opens the Subtitles panel: Off, the subtitles the stream brings, and Load a file… to pick a subtitle file from your computer (.srt, .ass, .ssa, .vtt or .sub; it opens in the folder you used last). You can also drop a subtitle file onto the window while something plays. The file then shows in the list under its own name. While subtitles show, the panel has a Sync row too, for subtitles that come too early or too late; Shift+J and Shift+K do the same. A subtitle file and its timing last while that film, episode or channel plays.
Click anywhere else, or press Esc, to close a panel. While one is open, ↑ and ↓ move through it, Enter picks, and ← and → move the sync.
For a film or an episode, the Subtitles panel also has Search OpenSubtitles…: QiTV looks for subtitles on OpenSubtitles.com, a free subtitle website: by the film's or series' TMDB or IMDb number when the provider lists one, else by the title that plays (with the film's year, or the series with its season and episode number; tags such as "EN:", "TR - " or "4K" in a provider's title are left out). Only subtitles made for that film or episode are listed. The languages that have subtitles are on the left with how many each has, your last language (or your computer's) first; the selected language's subtitles are on the right, the best first: from trusted uploaders and downloaded most. Machine translated ones are marked and come last; Hearing impaired ones are marked and come after the others, unless the last ones you picked were for the hearing impaired. Click one, or press Enter, and it downloads, shows at once and appears in the Subtitles panel under its own name. If the title is not found (a title translated by the provider often is not), type its original or English title in the search field at the top and press Search. When OpenSubtitles finds subtitles only for other titles, it lists them all the same, each with the title it was made for: check it before you pick one. The next time that film or episode plays, the Subtitles panel offers the same file again at its top ("… (OpenSubtitles)"), without a new download.
OpenSubtitles needs an API key. The release downloads of QiTV may come with one. If yours does not, the first search asks for one: Get a free key opens the OpenSubtitles website, where you make a free account and then create a key on its "API consumers" page; copy the key, click Paste (or press Ctrl/⌘+V) and Save. You can change it later in Settings → Subtitles.
Without signing in, OpenSubtitles allows 5 downloads a day per internet connection. To get more, enter your OpenSubtitles username and password in Settings → Subtitles (optional; Sign out there removes them). After each download QiTV says how many downloads you have left today and when more come back. Downloaded subtitles are kept in the subtitles folder beside QiTV's settings (see Portable mode for where that is).
The picture button beside the subtitles button (or A) opens the Picture panel. Click ‹ or › on a row (or use ← and →) to change it:
In picture-in-picture the panel changes the big picture; in the multiview, the selected tile.
QiTV keeps the last few minutes of every live channel you watch, so you can pause, rewind and catch up like with a TV recorder. Press Space to pause and again to go on from where you paused; ← and → jump 10 seconds; L (or Go live) goes back to live. The bar shows how far behind live you are. While you are behind, − and + beside the speed play slower or faster (0.5× to 2×), say faster to catch up; click the speed for normal again. Movies and episodes have the same control.
Many providers keep the last days of some channels, so you can watch what was on earlier. QiTV knows which channels have such an archive from your provider's channel list (Xtream providers, M3U playlists that say so, and STB portals that mark their archived channels), and uses it where its own time-shift buffer ends:
How far back you can go depends on the provider (often one to seven days). An STB portal's archive plays programme by programme: QiTV asks the portal for the recording of the guide's programme at that moment and moves on to the next programme's at its end, so it needs the guide from the portal itself (Settings → EPG), and the guide offers only programmes the portal lists as recorded. Portals differ in what they keep and how they answer, so some marked channels may still not play; QiTV then says so and stays live. Archive times follow your provider's time zone, which QiTV reads from Xtream providers when it loads their channels (refresh the channel list once after updating); an M3U playlist's Xtream-style channels use the time zone of your Xtream provider on the same server, else UTC. While the archive plays on a bar of its own, R doesn't record: recordings come from the live buffer.
Press R, or the red ● after the channel's name and ★ at the top of the player controls, to record the live channel you are watching; press it again to stop. While it records, the ● is lit and ● REC 01:23 beside it counts the time.
Live streams arrive a little behind the broadcast. Settings → Live latency chooses how far behind QiTV plays:
QiTV gently speeds playback up or down to stay there, only when the distance has drifted for a while: a few percent, eased in and out, at most about once every 5 minutes (the dot beside the distance is amber meanwhile). When a channel has fallen far behind (more than about 8 seconds), QiTV jumps closer once instead, at most once a minute, starting where the picture is complete. A channel starts at that distance too, not at the oldest part of what the provider sends; when a provider sends a backlog right after the start, QiTV picks the start again within seconds. On a channel where that does not play smoothly, QiTV notices within a few seconds, plays it at normal speed only and remembers that for a day; then it tries again. Channels that cannot be time-shifted play directly; under Auto they play as with Normal. A few channels whose streams can't be time-shifted smoothly play without rewind too; QiTV notices this by itself and tries again a day later.
Watch a second channel in a small picture in the bottom-right corner:
Picture-in-picture is for live TV, and it needs two streams: a provider that allows two at a time, or one stream each from two providers. A film or an episode from the Library is the one exception: it takes the big picture and keeps the channel you were watching small (see Keep watching while you browse).
Watch several live channels side by side: press V, choose View → Multiview (Ctrl/⌘+4) or click the grid button on the player controls. The channel you are watching becomes the first tile and an open picture-in-picture the second; the others show +.
Each tile's label shows LIVE, or how far behind live it plays (−00:42). Tiles without the focus play at normal speed and only jump back to live when they fall far behind (never while paused); each can be paused from its own controls, and rewound like the big picture once it has the focus. Its time-shift buffer is in memory: the focused tile gets the memory per stream (Settings), the others a short one of 64 MiB ("multiview_tile_ram_mib" in config.json changes it; at least 48, enough for a 4K channel). A tile you paused or rewound keeps what it plays until it is back at live.
QiTV can send what plays to a Chromecast, or a TV with Chromecast built in, on your network. The cast button in the player controls (it shows when QiTV can cast) opens a menu of the devices found; QiTV starts looking the first time you open it. Pick one: the channel goes on from where it was in its time-shift buffer, a film from where it is, and a Playing on … pill says where the picture went. Stop casting (in the menu, or on the pill) brings it back.
Use your phone as the remote, in its browser: no app to install. Choose QiTV → Phone Remote… (it turns the remote on the first time): a code shows on the TV. Scan it with the phone's camera; the browser opens the remote, and the phone is paired from then on (the remote's menu, ⋯, has Add to Home Screen to keep it one tap away).
Press G (or the guide button in the player controls) for the programme guide (EPG): the channels of the group you are watching, from the current half hour on, up to 24 hours ahead. Move with the arrow keys, type a number to jump to a channel, and press Enter to watch it. With the mouse, click a channel and double-click it to watch; ‹ and › beside the day move in time, and ⌕, ⛶ (fullscreen) and × (close) are at the top right. The bottom shows the highlighted programme's description. On channels whose provider keeps an archive, the guide also goes back in time and plays past programmes from their start (see Catch-up).
The guide comes from your provider (STB and Xtream), or from a guide file or web address of your own (XMLTV): choose it in Settings → EPG. If a provider's guide is off by whole hours (programmes start an hour before or after the guide says), set its Guide time offset in Settings → Providers (−12 to +12 hours, in half hours): the guide, the banner, what is on now and next, and the marks on the time-shift bar all move together.
Record a programme while you are away: in the guide, pick a programme on now or still to come and choose Record at the bottom (or press R), or Record series for every airing of that title on that channel, as the guide lists them. A scheduled programme has a red dot in the guide; Cancel recording (or R again) takes it off. The phone remote's timetable does the same.
Record at a time needs no guide: right-click a channel, use the button at the bottom of the guide, or + At a time… on the Library's Recordings tab, and choose the time it records (From, To: an end before the start is the next day's), once on a day, every day, Monday to Friday, or on the days you tick, with a name if you like. One that repeats records on each of its days until you cancel it on the Recordings tab, where Edit… changes it. The phone remote's timetable has Record at a time too, also for a channel without a guide. Times are the computer's clock's.
Everything about recording is on one tab: the Library's Recordings, after Movies and Series. Open it with Ctrl/⌘+5 (View → Recordings), the Recordings row at the bottom of the channel list's sources, or Manage Recordings… on the ● REC sign. The tab has a red dot while something records and an amber one when a recording needs your attention. Like Movies, it has rows on the left and what the row holds on the right, as tiles: a recording's tile shows a picture from it (taken once from the file, quietly, in the background), a scheduled one its channel's logo, each with its title, channel and time. The strip under the chosen tile has its buttons; Return or a right-click lists them too.
Typing in the find box above the rows (↑ from Tonight goes into it) finds recordings by title or channel, and, under In the guide, the programmes still to come whose title holds the words, first on the guide's channels, then the provider's, then every provider's (those whose guide QiTV has loaded): ● Record or ↻ Every airing schedules one. With the keys: ↑ and ↓ move along the rows, → goes into the row's page and ← back; on Tonight, ↑ and ↓ move from the cards through the guide's channels to the recent recordings (↑ from the first channel reaches the days, ‹ › and the channels' button; PgUp and PgDn move a screen of channels), Return opens a programme and presses its button (← and → choose it), Esc closes a programme, then goes back to the rows and to live TV.
Ctrl/⌘+2 opens Movies and Ctrl/⌘+3 Series (also from the channel list's sections). What you were watching keeps playing in a corner (see below); with nothing playing, Live TV (or Ctrl/⌘+1) takes you back to the last channel. While a movie or an episode from the Library plays, ‹ Library in the player controls (or Esc) takes you back to where you were in the Library. The ⛶ at the right end of its top bar switches fullscreen.
QiTV keeps each provider's film and series lists and loads them again after six hours. For an Xtream provider and a Jellyfin or Emby server this happens in the background: a list QiTV has kept shows at once and the new one takes its place where you are, and a few seconds after such a provider is ready its lists load ahead, so the Library opens without waiting. ↻ in the channel list's top row (Ctrl/⌘+R) loads the provider's lists again now.
A series opens on its seasons and episodes. Episodes you finished have a ✓, and started ones a progress bar with Start over. When an episode ends, the next one starts after a 10-second countdown, also across seasons (Settings → Auto-play).
Opening the Library or the search (⌕, Ctrl/⌘+F) doesn't stop what plays. The TV shrinks into a corner of the Library, a third of the window wide, with picture-in-picture inside it when it is open, and goes on playing with its sound:
Add your Jellyfin or Emby server as a provider (see Adding a provider), and its films and series join the Library, next to your other providers' and searched with them. Older Jellyfin servers and Emby work too.
Press Ctrl/⌘+D on a channel, right-click it in the channel list, or click the ★ beside its name in the player controls, to add it to or remove it from ★ Favorites at the top of the channel list. In the Library, Ctrl/⌘+D and ★ do the same for My list.
A star belongs to one provider and is kept by name: starring a channel called "News" at one provider doesn't star a "News" at another, while within one provider two items with the same name share one star. A provider's ★ Favorites and My list show its own stars; All providers shows every provider's, each with its provider's name. Stars from QiTV 2.0 and earlier stay on every provider that has something of that name; un-star one at one provider and the others keep theirs.
Settings → Parental controls sets a PIN (4 digits or more). With a PIN set:
File → Export saves channels, movies or episodes as an M3U playlist for VLC or other players:
The exported files contain the stream addresses, which VLC and most players can open directly.
Any channel, movie or episode can go to VLC or MPV (when they are installed):
QiTV closes its own stream first, so a provider that allows one stream still works.
To open every channel in one of them instead of on the TV screen, turn on Always play in VLC or Always play in MPV in Settings.
By default, QiTV stores its settings and cache files in your user folder:
%APPDATA%\qitv~/Library/Application Support/qitv~/.config/qitvTo enable portable mode (useful for USB drives or keeping everything in one folder), create an empty file named portable.txt in the same folder as the QiTV program (or beside main.py when running from source). QiTV then keeps all its settings and cache files in that folder instead.
Running from source needs Python 3.14 and VLC installed on your computer (from videolan.org, or your Linux distribution's vlc package): unlike the release downloads, the source code does not include VLC. Python 3.15 is not yet supported by the Qt and theme libraries.
git clone https://github.com/ozankaraali/QiTV/
cd QiTV
python3.14 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python main.py
Or with uv: uv sync --frozen --dev, then uv run python main.py. The tests run with uv run python -m unittest discover -s tests.
To try QiTV without a provider, uv run python scripts/make_demo_content.py --out build/demo --serve serves the demo content on your computer and prints how to start QiTV with it. --screenshots docs/screenshots instead of --serve takes this page's screenshots again.
A build from the source code has no OpenSubtitles API key of its own: enter yours in Settings → Subtitles (free, see Subtitles from OpenSubtitles). The release builds get theirs from CI: before packaging, each build runs scripts/write_build_keys.py, which writes the repository secret named QITV_OPENSUBTITLES_KEY into services/_build_keys.py (without that secret, as in a fork, the key stays empty). The file in the repository stays empty: never commit a key into it.
QiTV keeps its log in a file too, a few runs' worth: ~/Library/Logs/QiTV/qitv.log on a Mac, %LOCALAPPDATA%\QiTV\Logs\qitv.log on Windows, ~/.local/state/qitv/qitv.log on Linux. Addresses and query strings are left out of it; it says how QiTV ended each time, and after a crash a crash.log beside it holds where each thread was. Attach them when you report a problem: Help → Show the Log File… opens their folder. For a problem that is hard to pin down, tick Settings → Detailed log (for troubleshooting): the log then also gets every step QiTV takes (still without addresses or passwords), and every message QiTV showed is in it either way. What a switch below logs lands in that file too.
Set these before starting QiTV (for example QITV_DEBUG_QT=1 python main.py):
QITV_VLC_LOG=/path/to/vlc.log writes VLC's detailed log to that file. This log is not cleaned up: it contains the addresses of the streams you play, which often include your provider username and password. Never share it publicly.QITV_DEBUG_QT=1 prints Qt's warnings about timers and threads to the terminal.QITV_DEBUG_CURL=1 logs the guide requests QiTV sends to an STB portal as curl commands you can run yourself, with the cookies (your MAC address, serial number and device ID) and the session token masked. QITV_DEBUG_CURL=raw logs them unmasked: never share that output.QITV_CAPTURE_DIR=/path/to/folder saves what time-shift receives from the provider each time a channel opens, so a glitch can be replayed later: <date-time>-<id>.ts holds the stream's bytes as they arrived, and <date-time>-<id>.times has one <cumulative bytes> <seconds> line per read (lines starting with # are comments, such as # reconnect <seconds>). An HLS channel whose sound comes as a separate stream also gets <date-time>-<id>.audio.ts and .audio.times with that sound's pieces: scripts/replay_capture.py weaves them back in, and a player plays the pair with sound (for example mpv <name>.ts --audio-file=<name>.audio.ts). It stops at 2 GiB or 3 hours per channel and never leaves less than 1 GiB free. The files are written by the thread that reads the stream, so point this at a local disk. The files hold the provider's stream: keep them private (QiTV makes them readable by you only). They never contain the stream's address or your credentials.This application bundles a list of publicly available IPTV channels from around the world. The channels are not hosted by this application or respective repository. The application simply creates a convenient way to browse a publicly available media database. The developer of this application has no affiliation with the content providers. The content provided can be removed at any time and we have no control over it. The developer assumes no liability and is not responsible for any legal issues caused by the misuse of this application.
No video files are stored in this repository, the application bundles open-sourced iptv-org playlist for quick startup, users can delete that playlist entry if they want to from their computer. If any links/channels in this application infringe on your rights as a copyright holder, they may be removed by sending a pull request or opening an issue. However, note that we have no control over the destination of the link, and just removing the link from the playlist will not remove its contents from the web. Note that linking does not directly infringe copyright because no copy is made on the site providing the link, and thus this is not a valid reason to send a DMCA notice to GitHub. To remove this content from the web, you should contact the web host that's actually hosting the content (not GitHub, nor the maintainers of this repository).
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
If you want to change any function, feel free to do. You could refactor, propose architecture changes, design assets, add new features, provide CI/CD things and build for other platforms. Basically, all changes that can improve this software are welcome.
Dependency versions are maintained in pyproject.toml and uv.lock. Use uv sync --frozen --dev for the locked development environment. After updating dependencies, regenerate the hash-pinned runtime installation file rather than editing it by hand:
uv export --frozen --no-dev --no-emit-project --output-file requirements.txt
QiTV is licensed under MIT. The release downloads also contain other people's software, each under its own license. THIRD-PARTY-NOTICES.md lists them all, and the license texts are in licenses/ (both are inside the downloads too).
| Library | License |
|---|---|
| aiohttp | Apache-2.0 AND MIT |
| m3u8 | MIT |
| mpv | GPLv2+ or LGPLv2.1+ |
| orjson | MPL-2.0 AND (Apache-2.0 OR MIT) |
| packaging | Apache-2.0 OR BSD-2-Clause |
| pycryptodomex | BSD, Public Domain |
| PyQtDarkTheme-fork | MIT |
| PySide6 | LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
| python-vlc | LGPL-2.1+ |
| requests | Apache-2.0 |
| segno | BSD License |
| tzlocal | MIT |
| urllib3 | MIT |
QiTV 1.14.x bundled MPV (GPLv3); 2.0 does not.
My Channel 2026-10-19 21.30.ts: an MPEG-TS file with the channel's own picture and sound, not re-encoded, which VLC, MPV and most players play.