Releases: infinitel8p/Extreme-InfiniTV
Extreme InfiniTV v1.6.1
Extreme InfiniTV v1.6.1 adds an experimental native Android video player with proper Picture-in-Picture and lock-screen controls, first-class macOS support, settings search, a configurable network timeout, a remembered external player on Android, and a radio-mode visualizer.
Changelog v1.6.1
New
- Experimental native Android video player. An opt-in second Android backend (off by default) that hands the whole playback session to a native ExoPlayer-backed Activity instead of the in-WebView Video.js path. It brings:
- Proper Picture-in-Picture - only the video surface goes into the PiP window, not the page chrome around it (closes #75).
- MediaSession - lock-screen transport controls, Bluetooth headset / car-stereo play / pause / skip, and notification controls.
- Hardened HLS via
media3-exoplayer-hlsfor the long tail of provider quirks (mixed-codec renditions, ad-insertion gaps, mid-playlist track changes). - In-Activity live TV channel switching - D-pad up reveals an overlay channel list; D-pad left / right or the remote channel keys flip channels without leaving the player.
- Enable it under Settings > Android native player (shows an "Experimental" pill). Movies, series, and Live TV all intercept before mounting the in-WebView player when it's on; resume position, recents, and series "Up Next" stay in sync via the existing preferences store.
- First-class macOS support.
- External-player integration: a configured
.appbundle (e.g./Applications/VLC.app) is resolved to its real executable, launched viaopen -a, and reuses an already-running instance instead of spawning a duplicate. - Reliable fullscreen: the video.js / artplayer fullscreen controls drive the native Tauri window (the HTML5 Fullscreen API is unreliable inside the macOS WebView), with the custom title bar collapsing while fullscreen.
- Native HLS playback through AVFoundation rather than hls.js.
- External-player integration: a configured
- Settings search. An inline filter on the settings page indexes each section title and card at mount (re-indexed on locale change) and hides cards, sections, and sidebar links that miss the query (AND match across tokens). Platform-hidden cards are skipped so search never surfaces something you can't use.
- Configurable network timeout. A new Network setting with discrete steps - 20s / 45s / 90s / 180s (default 20s) - replaces the hard-coded 20s provider-fetch timeout that was too aggressive for slow Xtream servers and ad-hoc M3U mirrors over patchy mobile networks. The Xtream per-mirror failover budget honours the same value. Full 16-locale coverage. Fixes #84.
- Remembered external player (Android). Tick "Always use this app" in the player picker and the choice is stored and reused - the "Open in player..." button then launches it directly, skipping the picker. A new Settings card shows the current default with a "Forget" button; an uninstalled pick is dropped automatically and the picker returns. Closes #80.
- Radio-mode visualizer. A single-line oscilloscope for audio-only (radio) live streams: an accent-colored waveform on
/livetvthat drives an accent glow around the canvas. Gated off under both reduced-motion and performance mode. - "Restore from backup" on the welcome screen. A returning user on the empty / logged-out state can import a backup JSON without first adding a playlist.
Improved
- Picture-in-Picture polish for the in-WebView path (for users who don't opt in to the native backend). Auto-PiP now binds at the player handle returned by
mountPlayerinstead of the raw<video>element, so it survives the element being destroyed and recreated on every channel switch. A fill bridge CSS-promotes the video to cover the viewport during system-driven auto-PiP (which lacks the user activation the Fullscreen API needs), wired across/livetv,/movies/detail, and/series/detailwith cleanup on navigation. - Provider fetches always route through the Tauri HTTP plugin under Tauri, not only when a custom user-agent is set. Requests always send a
User-Agent(the custom one if set, otherwise a real browser UA), so thereqwest/x.ydefault never reaches providers that block it, and plain-HTTP providers work on platforms where the WebView fetch couldn't reach them. - Shared, cross-platform "Restore from backup" picker. The file picker that branches across Android SAF -> Tauri dialog -> web
<input type=file>and then parses + imports the JSON now lives in one shared module used by both the Settings page and the welcome card, instead of being hand-rolled per call site. - Stream-diagnostic dialog layout. The "Test stream" dialog now uses a fixed height instead of a max-height so it no longer collapses around short results.
- Close-to-tray toggle accessibility. The desktop close-behavior control is now a proper
role="radio"radiogroup (aria-checked+aria-describedby) instead of paired toggle buttons.
Fixed
- macOS "no internet" on launch (#85).
Info.plistnow declaresNSAppTransportSecurity->NSAllowsArbitraryLoads, so macOS builds stop blocking plain-HTTP Xtream / M3U provider traffic by default. - Settings page failing to boot on Tauri Android. An orphan
syncConnectionLimitBanner()call left over from the 1.6 connection-limit-banner componentization threw on Android and blocked the page from loading. - Redundant live-TV startup fetch. Live TV now reuses the initial stream URL when present instead of re-resolving via the catalog, so direct-launch entry points (deep links, recents) skip an extra fetch.
Under the hood
- Window-fullscreen capability added to
src-tauri/capabilities/default.json(allow-set-fullscreen/allow-is-fullscreen) - this is what lets the macOS player drive the native window into and out of fullscreen. - New Vitest coverage:
tests/android-video-launcher.test.ts(bridge presence, argument forwarding, error swallow, channel-list JSON serialization, subscriber lifecycle) andtests/channel-lite.test.ts(default fallbacks, per-channel UA override, EPG "Now: ..." label resolution, JSON round-trip), plus macOS argv assertions added totests/player-runtime.test.ts. AndroidVideoBridge+AndroidPipBridge.setAutoEntertypings added tosrc/types/globals.d.ts.- Settings-card polish: dropped a redundant enter animation on the remembered-player card (the parent already has the shared entry treatment), tidied helper texts, and refined the Android-native player overlay layout and theme strings across all 16 Android locales.
- Docs:
external-players.mdxupdated to cover the remembered-pick flow. - Tooling:
mise.tomlnow pinsnode = "latest"alongside the existing toolchain. - Version stays at 1.6.1 in
package.jsonandtauri.conf.json(an earlier 1.7.0 bump was reverted as the scope no longer warrants a minor bump).
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.6.1_x64-setup.exe |
| Windows (MSI alternative) | Extreme InfiniTV_1.6.1_x64_en-US.msi |
| macOS (Apple Silicon + Intel) | Extreme InfiniTV_1.6.1_universal.dmg |
| Linux Debian / Ubuntu / Mint | extreme-infinitv_1.6.1_amd64.deb |
| Linux Fedora / openSUSE / RHEL | extreme-infinitv-1.6.1-1.x86_64.rpm |
| Linux portable (any distro) | extreme-infinitv_1.6.1_amd64.AppImage |
| Android sideload (APK) | Extreme InfiniTV_1.6.1.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.
Extreme InfiniTV v1.6.0
Extreme InfiniTV v1.6.0 ships a docs site, customizable home-page sections, radio mode for M3U playlists, a multi-step connection diagnostic wizard, TV-overscan compensation for Android TV, close-to-tray with first-launch notification, and an in-app Android external-player picker.
Changelog v1.6.0
New
- Docs site at https://infinitel8p.github.io/Extreme-InfiniTV/ with a Pagefind command palette (
Ctrl/Cmd + K), light/dark theme, mobile drawer, page-to-page view transitions, and a scroll-driven reading-progress meter. The app embeds the site in-app at/docs(theme synced viapostMessage); Settings > Help & feedback gains a Read the docs card with an "Open documentation" + "Quick start" deep link. - Customizable home-page sections. Reorder, add, or remove the Continue watching / Favorites / Watch later / Recently added strips from a new Settings card, with per-kind variants like "Favorite channels" or "Recently added series". Drag handle for mouse, up/down arrow buttons for keyboard, D-pad, and touch (44 px on coarse pointers).
- Radio mode for M3U playlists. Entries marked
tvg-type="radio"orradio="true"surface a Radio toggle on/livetvand play through an audio-only surface with poster art as the visual anchor. - Multi-step connection diagnostic wizard. A "Run full diagnostic" affordance below every Test result streams a 4-step (Xtream: authenticate + live + movies + series, with the catalogue probes parallelised) or 2-step (M3U) inline wizard, with pass / warn / fail and latency per step. Surfaced both at Login and per-playlist in Settings. Closes #56.
- Poster context menus on movies and series. Right-click (long-press on touch) opens Open / Favorite / Watch later / Download / Copy stream URL for movies; Open / Favorite / Watch later for series. 44 px touch targets with focus rings so D-pad lands cleanly.
- TV overscan compensation. A 5-step preset (Off / 2% / 4% / 6% / 8%) under Settings > Display > TV safe area insets the whole UI so content stays inside the visible rectangle on TVs. Auto-defaults to 4% on Android TV first launch; opt-out persists. Closes #74.
- Close-to-tray setting on desktop, with a one-shot native notification on first close so users don't think the app quit. Pick "Minimize to tray" (default) or "Quit" from Settings.
- In-app Android external-player picker. Replaces
Intent.createChooser()with a small dialog listing every installed video-handling app, fixing the long-standing VLC "notification fires but the activity never foregrounds" issue. Sends both MX-Player-style and VLC-style header extras so each app uses whichever it understands. - Account connection-limit banner in Downloads. Shows whether a parallel download will fail mid-stream for the active Xtream provider (warn at >=70%, crit at >=100%).
Improved
- Scheme-less Server / Playlist URLs. Both Xtream and M3U entries now accept input without
http://orhttps://; the app probes both schemes and saves whichever answers, including silent HTTPS -> HTTP fallback. Mirrors get the same treatment. (Originally for Android TV onboarding where typinghttp://on a D-pad keyboard is the most painful part of adding a playlist.) - Reason-aware Test connection copy. Errors now classify into
unreachable/timeout/cors/auth_rejected/not_found/rate_limited/server_error/http_error/bad_response, so you get "Server is reachable, but the username or password was rejected" instead of a raw fetch error. - Live TV channel rows scale with font size. Row height derives from the current root font-size and recomputes on resize, so channel text no longer clips when the window is maximised on hi-DPI displays (closes #73).
- Frameless-window resize edges (desktop). Six invisible hit-zones around the perimeter call Tauri's
startResizeDraggingonmousedown, so the resize cursor is reliable regardless of DPI, GPU driver, or third-party shell hooks (FancyZones, GeForce overlay, ExplorerPatcher). - Stable scrollbar gutter across pages so the layout doesn't jump when a page gains or loses a scrollbar (#68).
- Full 16-locale translation pass for every new string in this release.
Fixed
- Arrow keys swallowed in text inputs on TV / D-pad builds (#72). The spatial-navigation polyfill now lets Left / Right keydown reach the caret inside
<input>,<textarea>, andcontenteditablefields. Up / Down still leave the field through spatial-nav. - Downloads pause button "ticking" with progress. The row no longer drifts vertically per progress tick, and the per-tick
appendChildreorder is now position-aware so clicks no longer split between two DOM instances and get dropped. - Category picker toggle landing on the wrong row (#68). Click handler now derives the next state from
aria-checkedon the row that actually received the click instead of stale model state. Focus ring on the rightmost item is no longer clipped.
Under the hood
- Security pass (CodeQL). XMLTV parsers in
epg-data.jsandepg-worker.tsreject input containing<!DOCTYPE>or<!ENTITY>declarations to defuse XXE-style payloads from a hostile EPG URL. Playlist IDs now usecrypto.randomUUID()(or acrypto.getRandomValues()-built UUIDv4 fallback) instead ofMath.random(). The EPG worker also drops cross-originpostMessage. - New scan + housekeeping workflows. CodeQL and OSV-Scanner run on every PR; greetings / stale / summarize-issue automation added alongside.
- Workflow hardening. Third-party GitHub Actions SHA-pinned (
pnpm/action-setup,dtolnay/rust-toolchain,Swatinem/rust-cache,tauri-apps/tauri-action,android-actions/setup-android,google/osv-scanner-action). Test workflow now declares a least-privilegepermissions: contents: read. - Settings refactor. The TV overscan card, Close-to-tray card, and Downloads connection-limit banner now live as dedicated Svelte components (
TvOverscanCard.svelte/CloseToTrayCard.svelte/ConnectionLimitBanner.svelte), trimmingsettings.astroby ~230 lines. No behaviour change. - Locale-cache key bumped
xt_locale_messages_v2->_v3so users with an existing cache pick up the new diagnostic wizard, scheme-swap toasts, connection-limit, poster menu, and hub-strip strings on first launch. Stalev1+v2entries are cleaned up automatically. mainBinaryName: "extreme-infinitv"added totauri.conf.jsonso the Tauri 2.x bundle picks up a stable artifact name across platforms regardless ofproductNamecasing.- Dependency refresh (Astro, Tailwind, Tabler icons, typescript-eslint, and friends).
Mentions
Thanks to @esbnetworking (#72, #73, #74) and @InvisibleRasta (#68) for reporting and testing the fixes for these issues.
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.6.0_x64-setup.exe |
| Windows (MSI alternative) | Extreme InfiniTV_1.6.0_x64_en-US.msi |
| macOS (Apple Silicon + Intel) | Extreme InfiniTV_1.6.0_universal.dmg |
| Linux Debian / Ubuntu / Mint | extreme-infinitv_1.6.0_amd64.deb |
| Linux Fedora / openSUSE / RHEL | extreme-infinitv-1.6.0-1.x86_64.rpm |
| Linux portable (any distro) | extreme-infinitv_1.6.0_amd64.AppImage |
| Android sideload (APK) | Extreme InfiniTV_1.6.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.
[](https://apps.mic...
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...
Extreme InfiniTV v1.3.0
Changelog v1.3.0
Extreme InfiniTV is now translated into 9 languages, adds a Watchlist for "watch later", brings Picture-in-Picture to the movies and series players, and lets you tune retention and decoration for slower devices.
New
- Translations in 9 starter locales (English, German, Spanish, French, Italian, Japanese, Portuguese-BR, Russian, Chinese), with a locale picker in Settings. Pre-paint translation cache means no more English-then-locale flash on routine navigations.
- Watchlist: a "Watch later" toggle on movies and series, a
/watchlistpage, a hub strip, and visual indicators on the grids. Cross-playlist, like Favorites. - Picture-in-Picture button on the movies and series players. Works on desktop, web, and Android.
- "What's new" panel in Settings that fetches the latest GitHub releases and renders the changelog inside the app (sanitised before render).
- Performance mode in Settings that disables decorative animations (brand-mark comet, focus glide, hub / strip entry animations) for snappier UI on low-end TV WebViews.
- Continue Watching retention setting: keep progress for 30, 90, or 180 days, or never auto-evict. Default stays 90 days; the 200-item LRU cap still applies.
Improved
- Catalog warming chip no longer flashes on routine navigations: warm-cache hydration short-circuits the warmup entirely when live, VOD, and series are already hot. When a fetch is needed, the chip now shows per-kind progress (percent or MB downloaded, then a count tween once each kind finishes).
- Theme switch in Settings uses the View Transitions API to crossfade with a circular reveal anchored on the click point. Falls back to a plain commit on browsers without VT or with reduced motion.
- Hub strips (Favorites, Watchlist, Recently added) hydrate lazily so the hub tiles paint without competing with strip hydration.
- Active playlist title in the sidebar updates reactively after switching playlists, no reload needed.
- Tauri desktop auto-updater is gated to AppImage on Linux, so deb / rpm installs no longer log a noisy startup warning.
- Spatial-navigation focus stays inside dialogs and the help overlay more reliably.
Fixed
- Series detail no longer shows the placeholder "Series 13754" / "Serie 13754" in non-English locales after the API returns the real title.
- Continue Watching trim now cleans up all stale entries instead of leaving some behind.
- Translation runtime no longer overwrites dynamic content rendered by JavaScript (channel names, EPG cells, etc.).
- Downloads on Tauri can now write their sidecar files (resume state, partial pieces) thanks to broader filesystem permissions.
- Translated kind labels and card aria-labels that were previously hardcoded in English.
Under the hood
- New M3U / M3U8 parser (
m3u-parser.ts) becomes the single source of truth for playlist parsing, with a Vitest suite and CI workflow covering the tricky cases (BOM, CRLF, both EXTINF orderings, escaped quotes,#EXTVLCOPTheaders, HLS sub-playlist tag skipping). - Per-channel User-Agent on Android via a new
AndroidWebSettingsJS bridge; desktop and web fall through to the WebView's default UA. - Lib layer migrated to TypeScript with strict typing across 12 utility modules; new
debounce,log, andtexthelpers. - New
StatusBarBridgekeeps Android system bars in sync with the active theme.
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.3.0_x64-setup.exe |
| Windows (MSI alternative) | Extreme InfiniTV_1.3.0_x64_en-US.msi |
| macOS (Apple Silicon + Intel) | Extreme InfiniTV_1.3.0_universal.dmg |
| Linux Debian / Ubuntu / Mint | extreme-infinitv_1.3.0_amd64.deb |
| Linux Fedora / openSUSE / RHEL | extreme-infinitv-1.3.0-1.x86_64.rpm |
| Linux portable (any distro) | extreme-infinitv_1.3.0_amd64.AppImage |
| Android sideload (APK) | Extreme InfiniTV_1.3.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.
Extreme InfiniTV v1.2.0
v1.2.0 is the "continue watching" milestone: pick up movies and episodes at the exact second you left them, jump between episodes automatically, run the whole app from a TV remote, and manage downloads from a dedicated page. Also: the app has been renamed to Extreme InfiniTV.
Heads up: the app has been renamed
The Windows / macOS / Linux / Android builds now ship as Extreme InfiniTV instead of xtream. The auto-updater handles the upgrade in place on Windows. On Linux the package name changes (extreme-infinitv instead of xtream), so you may end up with both versions installed - uninstall the old xtream package once and you're done. Microsoft Store and Google Play update in place; your playlists, favorites, recents, progress, and downloads are preserved across the rename.
Changelog v1.2.0
New
- Continue watching strip on the home page resumes any movie or episode at the exact second you left off, with a "Start over" button when you'd rather restart.
- Favorites page at
/favoritesand a home strip showing every starred channel, movie, and series across all of your playlists in one place. Cross-playlist clicks switch the active playlist for you. - Recently added page and home strip, sorted by the provider's
addedtimestamp. - Global search with
Ctrl+Kfrom anywhere. Cross-kind results across Live TV, Movies, and Series; hits that start with your query rank above mid-name matches on every page. - Up-next auto-play between episodes - a 10-second countdown card appears as one episode ends; "Play now" plays immediately, any other key dismisses.
- Watched markers on episodes at 95% completion, plus a series progress badge on the poster (
S2 4/10) that jumps you straight to the next-up episode. - Picture-in-Picture, plus subtitle and audio-track pickers, in the movie and series player (Live TV had this already).
- Dedicated
/downloadspage with active / queued / finished sections, per-item pause / resume / cancel / remove, live throughput, and a Windows taskbar progress bar. - Stream diagnostic - right-click or long-press a Live TV channel and pick "Test stream". The app probes the URL, parses the HLS playlist, HEADs the first segment, and reports a verdict you can copy as JSON for bug reports.
- Discord Rich Presence on Windows / macOS / Linux. Friends see "Watching CNN" or "Browsing Movies" on your profile, with a "Get Extreme InfiniTV" button. Off-by-default per playlist; toggle in Settings. Not available on Android (Discord IPC limitation).
- Backup export / import in Settings - one JSON file holds all of your playlists, preferences, and app settings.
?keyboard help overlay lists every shortcut, accessible from any page.- Cable-remote shortcuts on Live TV: type a channel number (
123+ Enter) to jump to it,[/]step prev/next channel with wrap-around,Space/M/F/J/Lfor play / mute / fullscreen / -10s / +10s. - EPG full-schedule grid with a "go to current" button and timezone-aware rendering.
- IMDB rating badges on movie and series posters and detail pages, when the provider returns one.
- Account info in Settings - expiration date for Xtream playlists, plus the provider's connection cap (downloads automatically honour
max_connections). - Allow-list category mode alongside the existing hide-list, for users who only want a handful of categories visible out of hundreds.
- Custom favorites order with drag-and-drop on desktop and arrow buttons for D-pad / touch.
Improved
- Live TV channel rows show now / next programmes with a thin progress bar, refreshing every minute.
- EPG timezone awareness - the app auto-detects the right offset per playlist, with a manual override in Settings if the heuristic gets it wrong.
- Hub layout now spans the full 1920px envelope on ultrawide displays (was capped at 1280px).
- Hidden-categories editor gets a per-row eye-toggle so you can preview before committing.
- Resume verification on download completion - the app refuses to mark a corrupted or short-written file as done.
- Provider-unreachable empty states on Live TV, Movies, Series, and EPG now surface a D-pad-reachable Retry button instead of an indefinite spinner.
- Auto-update failure now offers an honest "Re-download" instead of leaving the user stuck.
- Cross-platform filename sanitization for downloads (Windows reserved names, control bytes, trailing dots).
- Self-hosted fonts - the app no longer talks to the Google Fonts CDN; everything is bundled and works offline.
- WCAG AA contrast pass on light theme - metadata and accent text now clear 4.5:1 against every surface.
Fixed
- Channel-list virtualisation no longer loses focus when arriving via
?channel=<id>from search or the favorites strip. - Settings layout no longer flashes wrong font sizes during cache hydration.
prefers-reduced-motionis honoured by every animation added in this release (star pulse, slot-machine episode transitions, focus glide, tuning overlay).
Under the hood
- New Rust integration for Discord IPC (desktop only) and
tauri-plugin-openerfor cross-platform "open in default browser" so OAuth flows don't fight the WebView's separate cookie jar. - Hot in-session cache tier layered on top of the localStorage TTL'd cache, with batched eviction and a "trimming local cache..." toast when eviction takes longer than a second.
- Eight Svelte 5 islands now:
ContinueWatching,FavoritesStrip,FavoritesReorder,HiddenCategoriesEditor,RecentlyAddedStrip,RecentlyAddedView,AllFavoritesView,SearchView. - Sidecar metadata (
.xtream-meta/<basename>.json) for finished downloads on desktop, so a fresh install can re-discover existing files via Settings -> "Scan folder".
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.2.0_x64-setup.exe |
| Windows (MSI alternative) | Extreme InfiniTV_1.2.0_x64_en-US.msi |
| macOS (Apple Silicon + Intel) | Extreme InfiniTV_1.2.0_universal.dmg |
| Linux Debian / Ubuntu / Mint | extreme-infinitv_1.2.0_amd64.deb |
| Linux Fedora / openSUSE / RHEL | extreme-infinitv-1.2.0-1.x86_64.rpm |
| Linux portable (any distro) | extreme-infinitv_1.2.0_amd64.AppImage |
| Android sideload (APK) | Extreme InfiniTV_1.2.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.
Extreme InfiniTV v1.1.0
First release after 1.0.0. The big themes are TV / D-pad readiness, a real Downloads page, route-based detail pages, and a wide reliability + accessibility pass.
Highlights
Downloads got their own page
- Dedicated
/downloadsroute with split "In progress" + "Downloaded" sections. - Each completed file has its own row with poster, Play, and Delete (with confirm).
- Live throughput sparkline (last 120s, min/max markers) and per-row speed.
- Sidebar count badge + percent indicator that only appears while something is active.
- Windows taskbar progress mirrors aggregate state.
- Concurrent-downloads setting (Settings → Downloads, default 1, max 4).
- Resume integrity check after every resumed download surfaces silent corruption loudly.
- Windows file-lock retry on
ERROR_SHARING_VIOLATION.
Movie + series detail are now real routes
/movies/detail?id=Xand/series/detail?id=Xreplace the in-page dialogs.- Browser back / forward / refresh / deep-link all work natively, including from the hardware Back button on Android.
- The cinematic poster morph keeps working via cross-document View Transitions.
- Detail pages open offline once an item has been opened at least once (per-item info cache, 7-day TTL).
- Tap Play on a downloaded item from
/downloadsto land on the detail page with playback already starting.
Android downloads
- Default save location:
/Download/Extreme InfiniTV/via SAF / MediaStore. No broad-storage permission required - Play-Store-friendly. - Settings → Downloads → "Choose..." opens the system directory picker; the chosen folder survives app restarts.
- Tap Play on a downloaded movie or episode to hand off to your preferred system video app (VLC, MX Player, the system gallery, etc.) via the standard
Intent.ACTION_VIEWchooser. - "Remove" now also deletes the file on disk on both desktop and Android.
TV / D-pad
- Spatial-navigation focus traps fixed across every dialog (movies, series, category pickers, settings).
- Player control bar stays visible while keyboard focus is inside the player so D-pad Fullscreen doesn't trap focus.
- Now-playing accent on the active Live TV channel and the active series episode.
- Hit targets bumped to 44px+ across the board.
Cinematic transitions
- Hub tiles morph into the destination's active sidebar pill.
- Poster cards morph into the detail page hero (cross-document View Transitions).
- Detail page entry: staggered settle on the title / meta / buttons / plot, a one-shot accent halo on the Play button, and a scroll-driven Ken Burns zoom on the hero poster.
- Every animation honours
prefers-reduced-motion.
Live TV
- New EPG toggle button next to the category picker; visibility persisted per session, default configurable in Settings.
- Channel column width is now configurable (Compact / Default / Wide / X-Wide), persisted and applied pre-paint to avoid FOUC.
Account expiration
- Warning banner in the sidebar when expiry is within 7 days; severity states (warning / critical / expired).
- Same date also surfaced in Settings → About.
Settings
- Theme picker: System / Light / Dark, persisted, applied pre-paint.
- Live TV layout: default EPG visibility + channel column width.
- Concurrent downloads control.
- Font scale: Default / Medium / Large / X-Large.
Reliability
- Provider-unreachable empty states on
/livetv,/movies,/series,/epgwith a D-pad-reachable Retry affordance. Cached lists stay painted while the error sits below. - Cross-platform filename sanitization for downloads. Rejects Windows reserved names (
CON,PRN,LPT1-9, etc.), control bytes, trailing dots and spaces, and leading dots so a Windows-safe name copies fine to macOS / Linux / Android (including FAT32 SD cards). - Cache eviction now batched 32 entries per pass with a "Trimming local cache..." toast on long evictions.
- Auto-update download-failure UX: install button stays available after a failed attempt with a "Re-download" label and a clearer hint.
- Hot in-session cache tier (sessionStorage) in front of the existing localStorage cache so list pages skip the disk parse on repeat navigations within a tab.
Accessibility
- Light-mode WCAG AA contrast audit. Secondary text (
--color-fg-3) and accent (--color-accent) deepened so links, count chips, and metadata clear 4.5:1 on every surface. - Focus return on every dialog close.
aria-live="polite"on the download summary so status transitions are announced.- Explicit
prefers-reduced-motionfallbacks on every new animation.
Polish
- Page-entrance choreography on
/downloads(header + folder summary + queue card lift in with stagger). - FLIP reorder when downloads change status so a finishing row physically slides into the finished group instead of jumping.
- Cinematic completion sweep on the determinate progress bar.
- Status-dot pulse beside "Downloading" and a gentle gradient sweep across the active fill.
- Done rows recede (lower opacity) so active rows pull the eye.
Important: upgrading from 1.0.0
1.0.0 cannot auto-update to 1.1.0. A Vite bundling configuration in 1.0.0 left bare ESM specifiers like @tauri-apps/plugin-updater in the build output, which the Tauri WebView couldn't resolve at runtime. The 1.0.0 auto-updater check has been silently failing the whole time.
To get to 1.1.0:
- Microsoft Store / Play Store users: wait for the store update.
- Manual / NSIS users: download the installer attached to this release and run it.
From 1.1.0 onwards the auto-updater works correctly.
Known limitations
- Android downloads have no resume yet. The Android FS plugin's write stream truncates on open, so pause + resume restarts from byte 0. Tracked as a follow-up.
- In-app local playback on Android isn't supported. Tauri 2's WebView doesn't intercept
asset.localhostURLs (tauri#12019, open since Dec 2024), so we hand off to a system video app viaIntent.ACTION_VIEWinstead. Standard hybrid-app pattern; revisit when the upstream issue lands or a native ExoPlayer overlay is worth writing. - View transitions on Linux WebKitGTK (AppImage build) need Chromium 126+ behaviour; if your WebKit doesn't support cross-document VT yet you'll get a plain page swap rather than the morph.
Internals worth knowing
- New shared modules under
src/scripts/lib/:dialog-spatial-nav.js,player-focus-keeper.js,morph-detail.js,provider-error.js. - New Tauri capabilities:
core:window:allow-set-progress-bar,fs:allow-stat,fs:allow-remove,android-fs:allow-remove-file,android-fs:allow-write-file,android-fs:allow-open-write-file-stream. - Throughput tracking centralized in
downloads.jsso it accumulates regardless of which page is open. Persisted to localStorage with a 30s TTL so opening/downloadsmid-download shows a prefilled graph. - New per-item caches:
vod_info_<id>andseries_info_<id>(7-day TTL) for offline-reachable detail pages. - Source metadata persisted on every new download record (kind / playlistId / id / seriesId / season / episode / seriesName / logo) - powers the
/downloadsPlay / detail-link routing and the offline-fallback hydrate path.
Downloads
Pick the file that matches your device. The Microsoft Store and Google Play buttons below are the easiest path on Windows and Android.
| Platform | File |
|---|---|
| Windows 10/11 (recommended installer) | xtream_1.1.0_x64-setup.exe |
| Windows (MSI alternative) | xtream_1.1.0_x64_en-US.msi |
| macOS (Apple Silicon + Intel) | xtream_1.1.0_universal.dmg |
| Linux Debian / Ubuntu / Mint | xtream_1.1.0_amd64.deb |
| Linux Fedora / openSUSE / RHEL | xtream-1.1.0-1.x86_64.rpm |
| Linux portable (any distro) | xtream_1.1.0_amd64.AppImage |
| Android sideload (APK) | xtream_1.1.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.xtream_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: "xtream.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/xtream.appThen open the app normally. You only need to do this once per install.
Extreme InfiniTV v1.0.0
Extreme InfiniTV has reached its first major release: version 1.0.0!
Changelog v1.0.0
New
- Version updated to 1.0.0, marking the first major release.
Downloads
Pick the file that matches your device. The Microsoft Store and Google Play buttons below are the easiest path on Windows and Android.
| Platform | File |
|---|---|
| Windows 10/11 (recommended installer) | xtream_1.0.0_x64-setup.exe |
| Windows (MSI alternative) | xtream_1.0.0_x64_en-US.msi |
| macOS (Apple Silicon + Intel) | xtream_1.0.0_universal.dmg |
| Linux Debian / Ubuntu / Mint | xtream_1.0.0_amd64.deb |
| Linux Fedora / openSUSE / RHEL | xtream-1.0.0-1.x86_64.rpm |
| Linux portable (any distro) | xtream_1.0.0_amd64.AppImage |
| Android sideload (APK) | xtream_1.0.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.xtream_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.