·
0 commits
to dcb90ecdd4c8e0865f585b758172615d6568a9ea
since this release
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.