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.