Extreme InfiniTV v1.4.0
Local M3U file playlists, external players (MPV / VLC), a cinematic splash screen, and seven new languages bringing the total to 16.
Changelog v1.4.0
New
- Local M3U file playlists. Pick a
.m3u/.m3u8directly from disk: a native picker on desktop, SAF on Android, an HTML file input on the web. Playlist text is stored in its own IndexedDB store so multi-MB files don't blow past the localStorage cap. NewFILEbadge on Sidebar / Settings rows. - External players: MPV and VLC. Set a default backend in Settings > Playback, configure custom binary paths and extra args, and toggle "Reuse the same window" per backend. MPV reuse drives the existing window over JSON-IPC (Unix socket on Linux / macOS, named pipe on Windows). VLC reuse uses
--one-instance --no-playlist-enqueue. Per-stream "Open in MPV/VLC" button on movies and series detail pages. - Live TV auto-routing for non-HTTP streams.
rtsp://,rtmp://,udp://,mms://etc. bypass the embedded player entirely. If an external player is configured, they launch there automatically; otherwise the app surfaces a clear "this scheme needs MPV or VLC" message instead of spinning the loading skeleton forever. - Cinematic splash screen. Animated comet + a WebGL2 backdrop that fades cleanly into the app on first paint. On Android, the system splash hands off to the Astro splash so there's no flash of unstyled content. Honours
prefers-reduced-motionand performance mode. - Playlist health panel. Expand any playlist row in Sidebar or Settings to see account status, active / max connections, expiration, catalog freshness per kind, EPG state, and recent provider success / failure stats. One-click manual refresh.
- Account expiration banner on the hub. Active Xtream playlists near (or past) expiry get a dismissible warning at the top of
/, linking straight to Settings. - Seven new locales. Arabic, Hindi, Indonesian, Dutch, Polish, Turkish, and Urdu join the existing nine, bringing the total to 16. Full RTL handling for Arabic and Urdu.
- Category modes per kind. Toggle between "Hide selected" (denylist) and "Show only selected" (allowlist) for live, movies, and series. Changes apply live without a reload.
- artplayer + hls.js as a second embedded backend alongside Video.js, selectable from Settings.
- "Test stream" diagnostic. Right-click a channel to probe its URL, HTTP status, content type, HLS manifest, and first segment HEAD. Non-HTTP schemes get a friendly "can't probe this from the browser, try MPV / VLC" verdict.
Improved
- Catalog cache rewrite. IndexedDB-backed store with an in-memory hydration layer and stale-while-revalidate semantics: stale data is served immediately while a background refetch runs, views repaint via a new
xt:cache-revalidatedevent. In-flight requests are deduped so a Sidebar warmup racing with a page-bundle loader can't fire two parallel network requests. Entries older than 30 days are pruned in the background. - EPG hardening. XMLTV parsing now runs in a Web Worker, so giant guides no longer jank the main thread. Conditional GET with
If-None-Match/If-Modified-Sinceshort-circuits cleanly on 304. Transient network errors get retried with backoff. M3U playlists withoutx-tvg-urlshort-circuit cleanly instead of throwing through the retry layer three times. - Live TV layout polish. Width-bounded page, sticky EPG panel header inside its scroll container, stall sentinel and buffering chip on the player, and a min-height that's properly gated so portrait phones don't collapse.
- Rapid channel changes are clean. No more duplicate
view-transition-name: tuning-logowarnings orInvalidStateErrorwhen you tune through channels quickly. - Downloads. Completed downloads autoplay from disk via the asset protocol on desktop (Android falls back to a system
ACTION_VIEWintent).pruneMissingDownloadsreconciles the queue against the filesystem on startup so "done" entries whose files were moved or deleted disappear from the list. - Hub Live TV card. Fresh devices with no watch history now show the generic subtitle instead of pretending the first channel in the catalog was "last watched".
- Connectivity awareness. Sticky offline toast when the WebView reports offline, automatic catalog warmup on reconnect, and a clear warning if the warmup itself fails.
- Settings. New Playback section (embedded backend + external launcher + paths + extra args). Many wrap-flex control groups converted to responsive grids so labels stop reflowing awkwardly at common widths. Backup import now accepts
text/jsonandtext/plain(some pickers mistype JSON).
Fixed
- Updated the feedback email address in Settings so user reports actually reach us.
- Backup file save on Android now uses a native confirm dialog and writes through SAF instead of failing silently when the picker is unavailable.
- Stream failures auto-generate a diagnostic snapshot (URL probe, parsed HLS manifest, first-segment HEAD) so bug reports come with the data needed to triage them.
Android stability
- WebView render-process-gone guard. If the renderer crashes (common on low-RAM TV boxes), the activity is recreated and a toast explains what happened instead of leaving you with a frozen WebView.
RENDERER_PRIORITY_IMPORTANTkeeps the renderer from being reclaimed under TV / low-RAM pressure.- New
AndroidDeviceInfoJS bridge exposes Leanback / TV UI-mode detection. On Android TV, performance mode is auto-enabled and grid DOM growth is capped to keep memory in check on entry-level boxes. - Picture-in-Picture renders correctly again after we discovered wry 0.55+ pauses the WebView in
WryActivity.onPause(). Resuming ononPictureInPictureModeChanged(true)fixes the black overlay. - Tauri plugin launchers (SAF directory picker, save dialog, etc.) now work on the first attempt and continue to work after a render-gone restart.
- Image elements across the app got explicit
width/heightattributes to eliminate layout shift during list rendering.
Security and privacy
- New
redactUrl()helper stripsusername/password/token/auth/key/api_key/apikeyquery params before any URL goes intolog.errororlog.warn. Production logs no longer expose Xtream credentials. - External-player launch path rejects null bytes and newlines in the binary path and argv. Belt-and-braces, but it closes the file-format-trick exploit class.
- MPV reuse-slot lifecycle is now serialized under a per-kind async mutex, so two concurrent launches can't both miss the cached slot and orphan a spawned player.
Under the hood
- ESLint flat config + a new
lintCI workflow alongside the existing Vitest workflow. - Vitest test suite expanded with full coverage of the new external-player argv builders, error classification, URL redaction, and Rust-side path validation + slot lifecycle.
marked+DOMPurify(~80 KB gzipped) are now lazy-loaded the first time the Settings "What's new" dialog opens, instead of being pulled into every page bundle that touches the changelog module.- Dependency bumps: Tauri 2.11,
tauri-plugin-android-fs28.1, ESLint 10 and matching plugins. - GPL v3 LICENSE file added to the repository.
Downloads
Pick the file that matches your device. Click a filename to download it directly. The Microsoft Store and Google Play buttons below are the easiest path on Windows and Android.
| Platform | File |
|---|---|
| Windows 10/11 (recommended installer) | Extreme InfiniTV_1.4.0_x64-setup.exe |
| Windows (MSI alternative) | Extreme InfiniTV_1.4.0_x64_en-US.msi |
| macOS (Apple Silicon + Intel) | Extreme InfiniTV_1.4.0_universal.dmg |
| Linux Debian / Ubuntu / Mint | extreme-infinitv_1.4.0_amd64.deb |
| Linux Fedora / openSUSE / RHEL | extreme-infinitv-1.4.0-1.x86_64.rpm |
| Linux portable (any distro) | extreme-infinitv_1.4.0_amd64.AppImage |
| Android sideload (APK) | Extreme InfiniTV_1.4.0.apk |
What about the .sig files, latest.json and the macOS .app.tar.gz?
You can ignore them.
*.sigandlatest.jsonare used by the built-in auto-updater to verify each download is genuinely signed. The app downloads them on its own when checking for updates.Extreme InfiniTV_universal.app.tar.gzis the macOS update bundle consumed by the same updater. For a fresh install on macOS, use the.dmginstead.- The
.aabfile is uploaded to Google Play and is not meant for sideloading. Use the.apkto install manually.
macOS: "Extreme InfiniTV.app" cannot be opened / "Apple could not verify..."
The macOS build is not yet notarized by Apple, so Gatekeeper blocks it on first launch. After dragging the app from the .dmg into /Applications, remove the quarantine flag from a Terminal:
xattr -dr com.apple.quarantine "/Applications/Extreme InfiniTV.app"Then open the app normally. You only need to do this once per install.