V1.11 - Player UI & lots more
·
54 commits
to windows-tv-adaptive
since this release
Hey everyone, hope you've been enjoying HTPC. Thanks to everyone who's been testing in the Discord, you've helped find a ton of bugs that would have gone unnoticed.
This build brings a new UI, expanded MPV control, PiP, stream failover/rescue, in-place updates, UI scaling, the return of discovery, improved anime support and a huge amount of bug fixes.
If you'd like to suggest improvements, report bugs or try builds early (completely free, to help test) feel free to join the Discord. Have some big ideas for 1.12 feature wise, I'd also like to work on overall polish.
Changelog
1.11.0 - 2026-07-17
Added
- New Desktop Player UI - introduced a purpose-built desktop playback experience around the native MPV video surface. The new interface replaces the mobile-derived HUD with a responsive desktop layout, redesigned playback controls, clock and end-time display, episode and source browsers, subtitle and audio panels, contextual settings, preset feedback, and mouse-and-keyboard-focused interaction.
- Picture-in-Picture (PiP) Mode (Desktop) - play media in a compact, floating window on top of other applications. Includes inline pause/resume and seek controls, native window dragging and 8-direction resizing, and memory of user-adjusted PiP size and placement for the current session.
- Right-Click Player Context Menu - a full nested menu on the video surface covering playback, subtitles, audio, video, and window controls, including a curated "Advanced (mpv)" submenu (debanding, deinterlacing, sharpening, upscaling, and loudness normalization presets) so those tweaks no longer require hand-typing raw mpv options, quick toggles for stream failover and the MPV diagnostics overlay, a copy-stream-link action, and a persisted "close menu after selecting" preference.
- Automatic Stream Failover - optional (off by default) setting that automatically retries the next untried source in place when the current one errors out, never starts within a configurable timeout, or turns out to be an addon's diagnostic/placeholder video. A rate-limit-aware guard scopes retries to the specific throttled provider, so a 429 from one debrid service doesn't cause rapid-fire retries across every other source.
- In-Place Portable Updates - Portable installs now update themselves. The verified download is staged, swapped into the install directory by a small detached helper once the app exits, and Nuvio relaunches automatically - replacing the previous "unzip it yourself" step. Falls back to the old manual-reveal flow for dev builds, non-ASCII install paths, or unwritable directories. Controlled by a new "Install updates automatically" toggle in Account settings (default on).
- Seek Thumbnail Previews - hovering over the player seek timeline displays a live, frame-accurate thumbnail preview generated on-the-fly by a background media engine instance, including the chapter name when the file has chapters.
- Advanced MPV Controls - custom mpv options box now has Off/Add/Replace/Full modes that govern exactly how your hand-written options interact with Nuvio's own built-in mpv configuration, loading cleanly before or in place of the built-ins depending on the mode.
- Player & App UI Scale - added independent scale sliders for the in-player HUD (Playback settings, -50% to +50%) and for the rest of the desktop app (Appearance settings, -25% to +25%, with an option to also apply it to the Details screen), stacking on top of the existing automatic per-resolution/HiDPI scaling.
- Fine Playback Speed Increments - optional setting that changes the speed shortcut/button step to 0.1x increments instead of jumping between fixed presets.
- Previous Episode Navigation - added a Previous Episode action (context menu and shortcuts) alongside the existing Next Episode controls.
- Built-in Subtitle Language Filter - the preferred-subtitle-language filter that already applied to addon-supplied subtitles now also applies to the Built-In subtitle tab, so embedded tracks get pared down to your preferred languages the same way.
- Subtitle Drop Shadow - added a drop shadow toggle under Subtitle Style settings to cast a soft drop shadow behind subtitle text for improved legibility against bright backdrops.
- Always Show Playback Clock - added an option to keep the current time and estimated content end time visible after the rest of the player interface fades out.
- Local Anime Classification & Kitsu Matching - added dedicated "Anime Movies" and "Anime Series" shelves with custom pink and orange colors for local libraries, powered by Kitsu.io matching and search, and supporting manual overrides. Sibling seasons are mapped together to surface local files on sibling anime pages.
- Playback Control Panels - added desktop selectors for aspect ratio (Fit, Fill, Zoom), audio and subtitle tracks, sources, episodes, subtitle styling, and a live MPV technical diagnostics overlay.
- Rebindable Shortcuts Expanded - alternate play/pause, toggle mute, skip intro/outro, and the MPV diagnostics overlay toggle can now be rebound like other player shortcuts. Core navigation (Home, Search, Library, Calendar, Fullscreen, Back) also now works as a global shortcut from anywhere in the app instead of only on specific screens.
- Paste-to-Play - pasting (
Ctrl+V) a direct http/https video link outside of playback now launches it immediately, alongside the existing drag-and-drop support. - Verbose MPV Logging - added an opt-in toggle (Advanced settings) to write mpv's verbose internal log to its own file for troubleshooting, kept separate from the app's normal diagnostic logs.
- Resync Continue Watching - added a manual action to force a fresh pull of Continue Watching from Trakt/SIMKL if it looks stale.
- Discovery is Back - discovery is now built into the search panel, click the compass or press tab.
- Chapter Based Autoskip - if there's no introdb timestamps, the application can read chapters and trigger the skip prompt based on those.
Improved
- Playback Speed Selection - redesigned the context menu around immediate 1x, 1.5x, 2x, 2.5x, 3x, 3.5x, and 4x choices. Hovering a choice exposes the nearby 0.1x increments through 3.9x without requiring repeated slower/faster actions.
- Discord Rich Presence modes and artwork - redesigned integration into three selectable modes: Disabled, Watching (sharing playback only), and Full (sharing browsing, library, details, source selection, and playback activity), resolving potential status leaks. Poster artwork now fits within Discord's image area instead of being cropped or zoomed, paused playback shows a frozen time summary instead of a live-drifting Discord clock, and existing installs using the old on/off toggle are migrated automatically to Full.
- Desktop Resume Prompts - replaced floating resume alerts with a custom modal resume dialog on desktop. When using Adaptive Hero or TV layouts, the prompt embeds directly on the Home banner, holding focus and blocking catalog transitions until confirmed or dismissed. The prompt is no longer offered once a title is effectively finished (90%+ watched).
- Desktop Stream Context Menus - replaced mobile-style bottom sheets with native right-click desktop context menus for copying stream links, downloading (now saved through the browser rather than the internal downloads queue), and launching external players.
- Search Image Prewarming - dynamically enqueues image pre-fetching for the top results of each content category during active searching, loading relevant artwork instantly.
- Robust Progress and Scrobble Sync - prevented premature player close events from overwriting existing progress with 0% data, and filtered out temporary engine duration placeholders to avoid premature completion scrobbles.
- Player HUD & Focus refinement - added on-screen volume/mute pills, integrated a dedicated subtitle delay reset button, constrained double-click fullscreen toggles to the video surface only, and refined shortcut key focus release.
- Player Source Affinity - stream lists and autoplay now respect the initial source choice. Local-started playback keeps local files first and falls back to the first online stream when no local file is available; stream-started playback continues using online sources and excludes local files from autoplay.
- Robust Next-Episode Autoplay - implemented multi-sample position stability checks to avoid premature triggers during track changes or seeks, verification of genuine end-of-file, and safeguards that prevent failed resume seeks or temporary last-frame positions from skipping an episode. Episode resolution is now anime-numbering-aware, correctly following shows whose absolute episode count is split across multiple seasons/TVDB entries instead of rolling into a specials bucket by mistake.
- Faster Playback Startup - reduced MPV's initial cache pause so stable streams begin playing much sooner, scaling the startup pause window with playback speed rather than a flat delay, while retaining the app's three buffer presets for overall cache and readahead sizing.
- Metadata Caching & Scope Optimization - transitioned MdbList fetches to an app-lifetime coroutine scope to preserve API quota on cancelled home catalog scrolls, and introduced a 30-minute negative cache for network/API failures.
- Local Library Configuration - Anime Movies and Anime Series now appear in both Basic mode and the Advanced "All" view. Matching actions are correctly labelled "Search Kitsu", while compact poster status text uses "Not matched" and explains the scrobble limitation in the editor.
- Plugin Provider Status - the global providers toggle now displays an explicit Enabled or Disabled label alongside its color state.
- Native Runtime Packaging - isolated native DLL dependencies and Python libraries beside
Nuvio.exein jpackage app images, allowing the complete packaged runtime to run without extracting executables or requiring a writable installation directory. Also dropped the unused whisper/ggml audio-transcription stubs entirely (previously replaced with no-op placeholders to prevent crashes) by patching them out of the bundled FFmpeg build directly, shaving further size and build complexity. - Persistent MPV Diagnostics - moved MPV logs beside
nuvio.logunder%LOCALAPPDATA%\NuvioHTPC\logs, retaining the latest five player sessions so an autoplayed next episode cannot erase the previous failure. Media URL paths, queries, and embedded credentials are redacted before writing. - Desktop Networking - swapped the desktop networking stack to OkHttp with an IPv4-first resolver (avoiding a Windows IPv6 stall some users were hitting), longer timeouts, and safer handling of oversized or malformed responses from addons and plugins.
- Plugin Compatibility - plugin JSON/text handling is now more forgiving of malformed responses, encoding mistakes (garbled titles), and Stremio's nested proxy-header format, so more third-party plugins keep working instead of silently failing.
Fixed
- Crash during rapid stream replacement - serialized native MPV creation and destruction across the process. Rapidly switching plugin-provided streams could previously initialize a new player while the outgoing instance was still tearing down shared VapourSynth state, causing an access violation inside
libvapoursynth.dll. - Playback failures lingering in the player - major startup failures now return immediately to stream selection and show a compact playback-error toast inside the selector. The playback screen is retained only when a provider diagnostic video successfully plays.
- Unreported debrid rate limits - FFmpeg HTTP 429 failures and supported addon rate-limit placeholders now report the specific "Debrid Rate Limited" error instead of failing silently or appearing as an unrecognized format.
- Failed streams skipping episodes - MPV seek and loading errors can no longer masquerade as a completed file, trigger next-episode autoplay, or scrobble failed playback as watched.
- Provider Diagnostic Videos - added provider-neutral recognition of addon diagnostic and error videos, including known Comet and StremThru endpoint formats. Successfully resolved diagnostic videos can be viewed normally but never register watch progress or remote scrobbles, and can now trigger automatic stream failover instead of being mistaken for real playback.
- Episode-mismatched streams no longer offered - streams whose filename or title explicitly declares a different episode than the one you're watching (a source of wrong-episode plays, especially on anime) are now filtered out before they reach the stream list.
- Built-in subtitle tab accumulating stale tracks - subtitles injected by addons no longer leak into and pile up in the Built-In subtitle list across a session.
- Wrong subtitle/audio track carrying over between episodes - track memory now matches by language and name first instead of raw track position, so the next episode doesn't inherit whatever happened to be track #2 on the last one.
- Subtitle track selection race - fixed a race between persisted track preference, the native track list, and addon auto-fetch that could cause a stray reseek/rebuffer right after starting playback.
- Anime franchise/season mapping guessing wrong silently - when a title's local numbering doesn't confidently map to a specific season/episode, Nuvio no longer guesses - proper multi-season matching now handles shows whose absolute episode count is split across several TVDB seasons (e.g. Pokémon).
- SIMKL Continue Watching showing the wrong title/thumbnail for some anime - now matches by episode title instead of trusting SIMKL's own numbering.
- Local files could answer for an unrelated episode - a local movie or episode file could incorrectly respond to a different show's episode lookup; local playback now confirms it actually owns the requested episode before answering.
- Color picker triggering antivirus false positives - the custom theme color picker no longer launches a PowerShell command to show the native color dialog (a common AV behavioral-heuristic trigger); it now uses the same picker already used on other platforms.
- Broken parental guide ratings - switched to a working ratings source after the previous one stopped responding.
- Settings search returning stale results - reopening settings search could show results left over from a previous query.
- Trakt IDs using the full
myanimelist:prefix (not justmal:) now resolve correctly.