Skip to content

Extreme InfiniTV v1.4.0

Choose a tag to compare

@github-actions github-actions released this 12 May 16:08
ec83a49

App Icon

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 / .m3u8 directly 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. New FILE badge 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-motion and 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-revalidated event. 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-Since short-circuits cleanly on 304. Transient network errors get retried with backoff. M3U playlists without x-tvg-url short-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-logo warnings or InvalidStateError when you tune through channels quickly.
  • Downloads. Completed downloads autoplay from disk via the asset protocol on desktop (Android falls back to a system ACTION_VIEW intent). pruneMissingDownloads reconciles 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/json and text/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_IMPORTANT keeps the renderer from being reclaimed under TV / low-RAM pressure.
  • New AndroidDeviceInfo JS 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 on onPictureInPictureModeChanged(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 / height attributes to eliminate layout shift during list rendering.

Security and privacy

  • New redactUrl() helper strips username / password / token / auth / key / api_key / apikey query params before any URL goes into log.error or log.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 lint CI 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-fs 28.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.

  • *.sig and latest.json are 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.gz is the macOS update bundle consumed by the same updater. For a fresh install on macOS, use the .dmg instead.
  • The .aab file is uploaded to Google Play and is not meant for sideloading. Use the .apk to 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.

Get it from Microsoft