github vatax3/NuvioTVOS v1.0.3
Nuvio for Apple TV 1.0.3

latest releases: v1.0.44, v1.0.43, v1.0.42...
one month ago

Skip intro works now — and it never had, for four separate reasons. Sideload
over 1.0.2; the About screen prints 1.0.3 (5), which is how this build is
told from the one it replaces.

Skip intro

Nothing has to be configured any more. The previous build asked for an IntroDB
endpoint and did nothing without one; that requirement was a mistake, and behind
it sat three more defects that would have kept it broken anyway.

AniSkip answers in camelCase, and we decoded snake_case. Nothing threw. The
fields came back nil, every result was dropped, and an episode with skip marks
was indistinguishable from one without. Anime could never have worked, whatever
was configured.

The id mapping called a route that answers 400. /ids?source=imdb rejects
every IMDb id; the mapping lives at /imdb?id=. It returns one entry per
season
, because MyAnimeList splits an anime into a separate title per season —
so the season is now used to pick the entry. Taking the first one, as any
straightforward reading would, gives season one's opening for every season of a
long-running show.

IntroDB was read wrong. Its endpoint is filled in from a private
local.properties in the Android build, and this port took that to mean the
endpoint itself was private. It is not: the service publishes an OpenAPI
document describing this very route and answers without a key. It is the default
now, and the setting only exists to point at a self-hosted instance.

Anime-Skip's client id stays optional — a third source, and the only one that
needs anything, exactly as upstream has it.

Both wire formats are now pinned by tests against payloads captured from the
live services. A silent decode failure is the kind of bug that survives review
and only a test catches.

Focus stops being taken back

Moving with the arrows shortly after opening a destination could snap you back
where you started. The shell asks the focus engine to redo its default pass at
120, 200, 500 and 900ms after a destination opens — necessary, because a screen
still waiting on a catalogue has nothing focusable when the sidebar releases,
and tvOS drops focus entirely if it finds nothing.

What it never did was check whether the viewer had started navigating in the
meantime. So a move inside that first second was overridden, up to three times.
It now stops on the first directional press, and once anything has actually
taken focus — asked of UIKit rather than of @FocusState, which reports only
what was last requested rather than what the focus engine did with it.

That explains the "sometimes": it could only happen in the second after changing
destination.

Settings scroll

One scroll view served every settings section, and SwiftUI keeps a scroll offset
for as long as the view keeps its identity — so a section you had never opened
could arrive already halfway down.


73 tests. Unsigned and unnotarised; sideload with your own tool.

Two fixes from 1.0.2 remain unverified here and are worth a look on a real
device: the keyboard's Escape from inside the subtitle panel, and playback
resuming after an audio route change. Neither can be exercised in a simulator —
typeKey does not exist on tvOS, and there is no Bluetooth audio route.

Don't miss a new NuvioTVOS release

NewReleases is sending notifications on new releases.