Brings the fork up to date with official NuvioTV 0.8.5-beta and rolls up the 0.8.4-series work in one go. The headline is seek preview thumbnails, generated on-device so they work even on debrid and Emby sources with no trickplay. Alongside it: much faster manual and Continue Watching starts, the correct display frame rate locked in before playback, a readable stream info line, full-resolution trailers again, new cache controls, and a round of memory-safety hardening — plus everything from upstream 0.8.5.
Fork timings were measured on an Ugoos AM9 Pro; absolute times vary with hardware and network, so treat them as indicative.
At a glance
- Brought up to date with official NuvioTV 0.8.5-beta. Credit to [@skoruppa](https://github.com/skoruppa), [@halibiram](https://github.com/halibiram), [@Laskco](https://github.com/Laskco), [@tapframe](https://github.com/tapframe), [@haveAnIssue](https://github.com/haveAnIssue), [@supergera13](https://github.com/supergera13), [@haaihond](https://github.com/haaihond), [@ram130](https://github.com/ram130) and [@DeclanSC](https://github.com/DeclanSC).
- Seek preview thumbnails (experimental, off by default) — scrub the bar and a preview tracks where you're headed, even on debrid and Emby sources with no server thumbnails, generated on-device.
- Manual starts much faster — settle on a direct source and it's warmed before you press, bringing a hand-picked start from ~10 s down to roughly 1.8–4.5 s.
- Every Continue Watching card gets the head start, not just the first — settle on any card and the source is found and warmed before you press Play.
- The right frame rate before playback — on rewatches and on warmed first plays, with no mid-start blink or audio re-handshake.
- A readable stream info line —
4K · BluRay REMUX · DV · HDR10 · HEVC · 10-bit · TrueHD · Atmos · 7.1replaces the old logo row, and now populates for debrid sources too. - Full-resolution trailers again — the Focused Poster autoplay no longer drops to a ~360p copy.
- New cache controls — Clear Image Cache (posters and Home artwork) alongside the seek-thumbnail cache clear.
- Memory-safety hardening — parallel connections cap at 4 and chunks at 32 MB, by measurement, and the device assessment's memory maths were tightened.
New
Seek preview thumbnails (experimental, off by default) - not recommended for TV-stored apps due to constant storage usage. Use at your own risk.
A very challenging work in progress. Where Netflix and YouTube etc have these thumbnails pre-built and baked into their files, we're generating them on the fly, so a full title's thumbnails won't appear immediately on start of play.
Scrub the seek bar and a preview image appears above it, tracking where you're headed. It works even for debrid hosts and shared Emby libraries with no server-side trickplay, because the frames are generated on-device from the playing file. Enable it at Settings → Playback → Seek preview thumbnails.
- Fills coarse-first: a full-timeline sweep at ~5-minute spacing lands within the first couple of minutes, then refines to one frame every 10 seconds. The spot you're scrubbing jumps the queue and fills in within moments.
- Playback always wins — the worker only runs while playback is healthy, paces itself, and abandons any stuck fetch after 20 seconds. Previews are served from a local cache, so seeking is never delayed.
- No blanks on wide jumps — the pane shows the nearest available frame until the exact one loads, holds for a few seconds after you let go so you can read it, then dismisses itself. Switching episodes clears it.
- Persists on disk, so rewatches are instant. Frames are stored small (480×270 for 16:9; widescreen keeps its aspect), and the cache regenerates automatically if the format changes in a later update.
- Self-managing cache: hard-capped at 200 MB (50 MB on low-memory devices), oldest-first trimming, stops writing if the device drops below 50 MB free, and decoded frames in memory are bounded (~30 MB, ~8 MB low-memory). A Clear seek thumbnail cache action wipes it on demand.
Clear Image Cache
A new Settings → Advanced → Cache → Clear Image Cache action, below Clear Continue Watching Cache. One press wipes cached posters, backdrops and logos plus the catalogue data behind Home, then reloads Home with fresh artwork — no restart, and the rows stay on screen while they repopulate. It doesn't touch your Continue Watching list, library, settings or add-ons.
Subtitle SDH stripping (upstream 0.8.5)
A new Strip SDH toggle removes SDH cues — [door creaks], speaker names, sound annotations — from displayed subtitles, leaving only spoken dialogue. Off by default; applies across the ExoPlayer, sidecar and MPV paths.
Diagnostics name the real serving host
Redirecting sources (a debrid service handing off to a CDN edge) now show where the bytes actually came from, not just the redirector. A Serving Host row appears on the Diagnostics card and a serving-host line on the speed-test card — only when a stream was genuinely redirected, absent for Emby/NAS/direct sources. Read live each session and saved with the last-playback diagnostics. Display only; nothing about what's fetched changed.
Improved
Manual playback starts much faster
Auto-play was already warmed ahead of the press; hand-picking a stream still paid everything cold. Now:
- Settle on a direct stream row for half a second and the app warms that connection before you press. Scrolling warms nothing, and debrid rows are never resolved on focus — browsing costs nothing against your account.
- Each stream keeps its own warmed window, so browsing the list can't overwrite the one you then press.
- The seek index is fetched in parallel with the file header, removing a separate multi-megabyte read from the startup path, with the window widened to cover high-bitrate 4K remuxes.
In practice, a hand-picked direct source went from about 10 seconds to roughly 1.8–4.5 seconds on a warm press.
Every Continue Watching card gets the head start
Nuvio already warmed the front Continue Watching card as Home settled; every other card searched from cold. Now, settle on any card for about half a second and the same head start begins — the source is found, ranked by your auto-play preferences, and the connection warmed. Scanning the row warms nothing, unaired "Next Up" cards are skipped, works on all three home layouts, respects your Stream Selection Timeout, and never costs a debrid account more than the cached-only check the front card already did.
The right frame rate before playback — rewatches and first plays
- Detected rates are remembered across restarts — on a rewatch the display switches to the right rate before playback prepares, so the audio path opens once. Stored hashed (no readable URLs), expires after 30 days.
- First plays start matched too when the stream was warmed in time: the app reads the rate from the part of the file it already holds and switches before playback prepares, confirming against the player's own reading and discarding the early switch if they disagree (in testing they never did).
Covers warmed MKV streams; immediate presses, MP4 and un-warmed streams fall back to the previous behaviour — nothing is slower. One pre-existing quirk remains: on some AV chains, backing out of playback can still cause a longer "no signal" moment while the TV re-clocks — display renegotiation outside the app.
Trailers play at full resolution again
Trailers on the Focused Poster autoplay had dropped to ~360p because the high-resolution streams became gated behind a check the app could no longer pass. The app now reaches them a different, still-working way, and picks the best stream that actually loads — checking several options at once rather than betting on the single highest and failing. Trailers that only exist at lower resolution at the source still play at that resolution; what changed is the 360p fallback is gone. Validated across ~15 trailers (18/18 now return a playable high-res pair, the majority ≥1080p). Only the trailer fetch changed — playback, audio and frame-rate matching are untouched.
Cleaner stream rows in the Sources & Episodes panels
Each stream now leads with its add-on and release group and file size, and a single info line replaces the old logo row — e.g. 4K · BluRay REMUX · DV · HDR10 · HEVC · 10-bit · TrueHD · Atmos · 7.1 — covering resolution, source quality, Dolby Vision, HDR flavour, IMAX, codec, bit depth, audio format and channel layout. It now populates properly for debrid sources, and stays legible when a row is highlighted.
Source list and search (upstream 0.8.5)
- A refresh button on the source list re-runs the search on demand, without leaving the page.
- Source results no longer flash or lose focus on return from the player, and focus tracks cleanly when new results arrive above your position.
- Search remembers your query on entering results, and only saves genuinely confirmed searches to history.
Subtitles, more robust (upstream 0.8.5)
A universal charset detector decodes text subtitles in legacy encodings — with Thai, Vietnamese and KOI8-R added — replacing the fork's older stray-character stripper. Simultaneous unpositioned cues are now merged rather than drawn over each other.
Device assessment: safer memory maths
- Applying a plan re-checks the memory budget and clamps the target buffer to the largest step that still fits the device's safe budget once real parallel-connection overhead is counted — closing an over-commit path on ≤2 GB devices.
- PCM channel capability is read per-format, not port-wide, so plain-ARC and stereo-TV chains are no longer over-reported (Android 12+; older devices show "verify"). No change on a full eARC Atmos chain.
- Housekeeping: the buffer profile can be de-selected, a stale footer was fixed, header parsing is tolerant per key, and refresh-rate labels de-duplicate and format consistently across locales.
Smaller improvements (upstream 0.8.5)
A hide-Continue-Watching option in Layout settings; Continue Watching keeps its poster art when episode thumbnails are off; watch-next recommendations sync directly from the player; the update banner is hidden during playback.
Changed
Parallel network limits: connections cap at 4, chunks at 32 MB
Direct measurement on the 4 GB test device showed a parallel session holds roughly double the memory the app's conservative estimate assumed — and the configs where that cost grew fastest gave no matching playback benefit. So:
- Connections cap at 4 (was up to 16) across the manual slider, assessment and speed test — 8- and 16-connection configs were consistently refused or throttled anyway.
- Chunk size caps at 32 MB (was up to 128), and the assessment/speed-test no longer sweep 64/128 MB — larger chunks don't improve throughput on these sources but cost memory and lengthen time-to-first-frame. 16 MB stays the default.
- Existing configs are clamped safely the next time the setting loads; typical setups (4 × 16 MB) are unaffected.
The assessment's on-screen memory estimates still use the original conservative figure; refining them is tracked separately.
Tunnelled playback and the app decoder (upstream 0.8.5)
Tunnelled playback can't share an audio route with the "Prefer app decoders (FFmpeg)" path, so tunnelling is now switched off automatically whenever the app decoder is preferred. The audio settings reflect the effective state so a persisted value never misleadingly reads as active.
Fixed
The details-page source line no longer gets stuck
The auto-play preview line could stick on "Finding best source" if the Continue Watching row reshuffled (e.g. a progress sync) while you were on a details page — the background search cancelled the page's own. Background searches now step aside for a details-page search that's already running. A related pair of fixes: a caught-up series now offers a replay of the last episode instead of resetting to S1E1, the source line is suppressed rather than spinning in that state, and an empty or cancelled hero prefetch always publishes a terminal signal so the line hides instead of hanging.
Mislabeled streams recover by probing (upstream 0.8.5)
A stream that fails to open because its container looks unrecognised is now actively re-probed for its real format and retried, rescuing playback a wrong MIME type would have killed. The fork's dead-source handling — advancing past genuinely dead links (404/410, or a non-media body like an HTML page or .rar/.zip) — sits alongside it.
Skip Intro / Recap / Outro button
No longer overlaps the seek bar (standard and widescreen), and the focus trap is fixed — you can move up from the skip button to the Info / Stats / Subtitles buttons.
Player overlay
Removed the stray release-year line from the bottom-left. Series still show season, episode and episode title.
Cloud library (upstream 0.8.5)
Cloud-library playback routing, resume-from-progress and auto-advance were restored, and cloud file progress is preserved correctly.
Notes and limitations
- Seek thumbnails are 1080p SDR and below only — 4K and HDR/DV titles show the timestamp with no image (too heavy for this first version). A first watch builds coverage over the opening minutes; rewatches are instant. Tested on debrid and Emby sources on a single Amlogic device — hence experimental and off by default.
- The fast manual start needs a moment on the stream row to warm; a quick "select and press" starts at the old speed, never slower.
- Warmed-first-play frame-rate matching covers MKV — MP4 and un-warmed streams use the previous path.
- The trailer fix relies on a currently-working access method and may need revisiting if the source changes its protections; it degrades gracefully rather than falling back to 360p.
Install
Sideload via ADB or a file manager. This is a personal test build (versionCode 1313) with the application ID com.nuvio.tv.test, so it installs alongside official NuvioTV rather than replacing it. Seek thumbnails ship off by default.
Licence and attribution
GPL v3.0. All upstream copyright headers, licence text and developer attributions are preserved; no licence text was removed.
- Upstream is [NuvioMedia/NuvioTV](https://github.com/NuvioMedia/NuvioTV), whose player, audio sink, renderer, subtitle, settings and network plumbing this work extends. This fork is not affiliated with or endorsed by the NuvioTV project — please do not report issues from this build to upstream.
- Official NuvioTV 0.8.5-beta is merged in this build: subtitle SDH stripping and the universal charset detector, cue merging, the source-refresh action and result-focus fixes, cloud-library playback and resume, the mislabeled-stream mime-probe, the hide-Continue-Watching option, the tunnelling/decoder fix and the watch-next sync. Authors: [@skoruppa](https://github.com/skoruppa), [@halibiram](https://github.com/halibiram), [@Laskco](https://github.com/Laskco), [@tapframe](https://github.com/tapframe), [@haveAnIssue](https://github.com/haveAnIssue), [@supergera13](https://github.com/supergera13), [@haaihond](https://github.com/haaihond), [@ram130](https://github.com/ram130) and [@DeclanSC](https://github.com/DeclanSC).
- The seek-thumbnail work vendors androidx.media3's
ExperimentalFrameExtractor(media3 1.8.0, Apache-2.0, header preserved, byte-identical). It proved incompatible with the test device's GPU, so extraction runs through the platform's GL-free decode path; the vendored copy is kept for other hardware. - The seek-thumbnail engine, cache and preview pane, the frame-rate header reader, the stream-row info-line parser, the prefetch and Continue Watching warm-up, the trailer client-selection and reachability logic, and the assessment hardening are original work on the fork. Trailer client descriptor values are public configuration.
- Official 0.8.5's network telemetry independently mirrors instrumentation the fork already carried; where they met, the fork's on-device capture logging was kept and upstream's in-app log surface added alongside it.