Nuvio Native now runs on Samsung TVs. Same C, third target.
Versioning, from this release on: 1.0.6+native.N means this build
derives from upstream NuvioTVSmart 1.0.6, and N counts native
builds on top of it. The earlier v1.0.6 and v1.0.7 tags shadowed
upstream's own numbers and this one briefly claimed to be ahead of the
official app, which it is not. Those two tags are withdrawn and folded
into this release.
The app was already native C + SDL2 + GLES2 on macOS and LG webOS. It now
compiles to WebAssembly and ships as a Tizen widget. Not a port, not a
second codebase — one tree, three targets.
Install (Samsung)
The .wgt is unsigned on purpose. A Tizen distributor certificate
carries a whitelist of TV IDs fixed at creation and never changeable, so
a package signed by me would install on my TVs and refuse yours. Sign it
with your own certificate, made with your own TV's DUID — Apps → 12345
→ Developer Mode → About. Tizen Studio does it; the community
catalogue works the same way.
What works
Home, catalogues, search, library, collections, profiles, Trakt rows,
title pages, cast and crew, filmography, settings. Video plays through
the TV's hardware decoder, embedded subtitles show up, HDR plays, and
Trakt links, watch progress and settings persist between sessions.
Reinstalling the widget clears its storage, so Trakt links again after an
install. That is the platform, not a bug.
A retraction
Earlier notes claimed persistence and HDR did not work. Both claims were
mine and both were wrong.
I read a counter reporting flushes in the last 3 seconds as if it
reported state, saw zeros, and built a whole diagnosis on it. Verified
since: storage holds 77 progress rows, movies and episodes, with
timestamps. And on HDR I wrote "the player API does not expose HDR state"
— true — and then filed it under "does not work", which is a different
sentence.
In this build
- The player shows Source HDR / HDR10 / HDR10+, read from the
source's metadata. Source is deliberate: it states what the file
claims to be, not that the panel is in HDR right now. - Icons come back. A cache cleanup I added deleted files without
checking their origin, and icons ship inside the package — once
deleted, no URL existed to fetch them again. - Back works on every screen. The Samsung remote's Return key is
keyCode 10009, which SDL does not know; it now arrives as the same back
event the other targets use. Filmography was the visible casualty. - Remove from Continue Watching in the long-press menu.
- The real app icon at Samsung's size, replacing an 80×80 placeholder
inherited from the LG build. - Memory: worker stacks 8 MB → 2 MB (72 MB no counter was showing), a
ceiling on the in-memory art cache, and no more fetching TMDB images at
originalonly to shrink them to 640.
Known limits
- Can still run out of memory on long browsing sessions. Much better, not
proven closed. - Going back from a title opened through an actor's filmography sometimes
freezes. - First launch takes around 26 s: discovery waits for the whole account
sync before rebuilding. - DTS-HD MA and TrueHD do not decode on this hardware.
Five defects only the device revealed
- The TV is Chromium 76. Emscripten's glue uses
?.and??
(Chrome 80) and||=(85) — 110 of them on one minified line. It died
on line 1; the symptom was black after the loader hit 100%. The SDK
refusesMIN_CHROME_VERSION=76, so the output is transpiled afterwards. - The module ABI needed the same treatment.
i64across the WASM/JS
boundary is BigInt, also Chrome 85, andclock_gettimegoes through
such an import — the app froze on its first timestamp. Same cause,
separate fix: transpiling syntax does not touch the ABI. - Thread stacks were 104 MB of a 256 MiB heap, reserved up front and
invisible to every counter. - The image cache was in RAM. Emscripten's "disk" is MEMFS; the art
cache reached 280 MB, more than the whole heap, and nothing reported it. OES_texture_npotdoes not exist here, so mipmaps are never
generated — yet the cache charged every texture ~33% for a pyramid that
was not there, evicting artwork that fit.
tools/tizen-log.sh <tv-ip> pulls the TV's console to a file over sdb.
This port was debugged from photographs of a screen, which cost several
rounds.
LG
The webOS .ipk is not attached yet — the ARM toolchain container is
down on the build machine. It will be added to this release, and it picks
up this round's shared fixes (smaller TMDB images, halved decode peak,
remove-from-continue-watching, the HDR source badge).