github iqui27/nuvio-native-legacy v1.0.7
v1.0.7 — every open issue, start-up in half the time, a log panel on the red button

latest releases: v2.0.8, v2.0.7-test.2, v2.0.7-test.1...
one month ago

Warning

Superseded by v1.0.8 — please update.
The fix for #1 in this release removed a retry ceiling in the artwork cache, and that made artwork worse, not better: the ceiling is what lets the cache reclaim a slot that has given up, so without it the cache starts evicting good artwork instead. Measured on a Samsung TV: 218 evictions in three seconds and 54-57 fps where it had been a steady 60. v1.0.8 restores it. Everything else in these notes still holds.

Both targets from the same C sources: LG webOS 4.x (.ipk) and Samsung Tizen 5.5+ (.wgt).

This release closes every issue that was open. Where a report could not be reproduced from the code alone, the entry says so instead of claiming a fix.

Fixed

  • #1 — posters missing in tiles. An off-by-one made the retry ceiling swallow its own backoff: the guard was falhas < 3 while the backoff table is indexed by the same counter before it increments, so the third value (60 s) was dead code and three failures blanked a poster for the whole session. A burst of failures at start-up — normal on Tizen, where every image goes through the browser's HTTP stack at once — condemned those posters permanently. The ceiling is gone; the backoff now settles at 60 s, so a dead URL costs one request per minute and a network hiccup recovers on its own.
  • #2 — blank app icon on LG. icon.png was a flat 80×80 square with four distinct byte values. The real logo shipped only in the Samsung package. Now both sizes webOS asks for: 80×80 and a proper 130×130 largeIcon. The webOS launcher caches appinfo.json, so if the tile is still blank after updating, reinstall.
  • #3 — Library still in Portuguese with the interface in English. Translation happens at one point, and the table key is the whole Portuguese string; that summary line is assembled with snprintf, so nothing ever matched. The parts are translated before assembly now.
  • #4 — search keyboard jumping to a random letter. The focus helper keeps a remembered column per row, which is right for content shelves and wrong for a grid: moving down from "f" landed on whatever column you last used in that row — column 0, so "g" instead of "l". A grid mode now preserves the column, clamping only when the destination row is shorter. The library poster grid had the same bug.
  • #5 — Continue Watching. With Trakt linked, the row came only from Trakt's /sync/playback, so what you watched on your phone through your Nuvio account never showed, and old paused entries from any Trakt client did. Both sources are merged now, de-duplicated per title, with the 1–90 % bounds applied to both — the Trakt path never applied them. Ordering needed one more piece: paused_at was being discarded, so every Trakt entry arrived without a timestamp and the row was ordered by whichever source answered first.
  • #7 — bold, pixelated text in the source list, and that screen being slow. A single symbol the bundled font lacks sent the entire line to the CJK fallback font, whose Latin is heavier and hinted differently. Measured across the three weights: the font does have the arrows, the bullet, the ellipsis, ★ and ▶; it does not have ⚡ or ⚙ — and ⚡ is everywhere in add-on source names. Decorative glyphs the font lacks are now dropped from the line; real scripts (Japanese, Cyrillic, Arabic) still use the correct fallback. Emoji had the other half of the symptom — an empty box — and both are gone.
  • #8 — "Switch profile" opening a random title. The sidebar decides on key-down and closes itself there; the home screen acts on key-up (it needs the press duration to tell "open" from "hold"). So the key-up of the same press found the sidebar already closed and reached the home screen, which opened the focused card — usually the first Continue Watching tile. The title screen and the poster menu already had the guard against this; the home screen was the one missing it.
  • #8 — metadata language. Titles and synopses come from the add-on catalog, which answers in English with no language parameter. The title screen now asks TMDB for both in your interface language. Titles on the home cards still come from the catalog: localising each one would cost a TMDB request per card.
  • #9 — only English subtitles. Two causes. Changing the preference never re-ran the search (the title id had not changed, so the search correctly declined — but the result also depends on the language, which it did not know about). And the picker offered 12 of the 28 languages the app already recognises, with an internal cap silently truncating the list. The full list is there now, and changing the preference re-runs the search after a short pause, so crossing a 30-item list does not fire 30 searches.
  • #10 — collections completely empty. Three causes, and the root one was not in any of the functions that looked guilty: the manifest probe was reached from exactly one place, the add-on list screen in Settings. If you never opened that screen, the app spent the whole session without add-on ids — and that id is the key an account collection uses to find its own add-on's URL. On Tizen collections come only from the account, so all of them broke. Discovery already downloads every manifest, so it now hands the body over: no extra requests. Also fixed: the id is read from the document root (a manifest has id inside catalogs[] too, and some add-ons list catalogs first), a stale id could survive into a new slot, and an unresolved source no longer turns into a relative request that quietly returns the app's own page. When an add-on really is missing, the screen says so.

Investigated, not fixed

  • #6 — black picture with working audio. This is not detectable from inside the app, and that was measured on the device rather than assumed: the media pipeline reports video info, source info and load-completed normally for the files that show nothing, and there is no "frame displayed" signal — the clock advances driven by the audio. The two automatic fallbacks that exist cover the case where the pipeline contradicts the source; the remaining case is the pipeline confirming Dolby Vision with no picture, and falling back automatically there would break the Dolby Vision that genuinely works. So there is now a manual way out: a "No HDR" button in the Sources sheet reloads the same source at the same position without claiming any HDR. webOS only — on Tizen the firmware decides HDR and there is nothing to renegotiate, so the button is not shown rather than being inert.

Also in this release

  • Start-up is about twice as fast. The discovery cycle was running twice in full: add-ons arrive from your account as the second request (~2 s) but were only applied at the end of the sync cycle (~28 s), so the first pass was thrown away. Measured on an OLED65C9: first network row 24.2 s → 12.4 s.
  • Home rows are configurable — limit (7 by default), order, on/off, and card shape and size per row. This is stored on the TV and never pushed to your account, on purpose: the list a TV manages to build is smaller than the real one whenever an add-on is slow to answer, and pushing it would erase your setup on your other devices.
  • Settings categories are navigable with keys a TV remote actually has. The old shortcut was PgUp/PgDn, printed in the footer and unreachable on a remote.
  • An on-screen log panel, on the red button, with a first-run card explaining the gesture for your manufacturer. If something goes wrong, this is how to read what happened without a developer setup.
  • Credentials no longer reach the log. Debrid keys travel in the URL path, and the app was printing 60 characters of those URLs — enough to include the key. They are cut at the host now, at the source rather than only on screen.
  • The .ipk no longer carries the packager's own data. art/collections.json looks like data but is a credential: every folder source holds an add-on URL with the token in the path. It and the 165 MB of curated collection artwork are out. The package drops from 198 MB to 47 MB, and collections come from your account — the same way Tizen already worked.

Installing

LG webOS 4.x — space.nuvio.native.legacy_1.0.7_arm.ipk. See INSTALL.md.

Samsung Tizen 5.5+ (2020 and newer) — NuvioTV-1.0.7-tizen.wgt, unsigned on purpose. A Tizen distributor certificate embeds an allow-list of TV DUIDs that cannot be changed after it is created, so a package signed here would install on nobody else's TV. You sign it with a certificate carrying your own TV's DUID:

unzip NuvioTV-1.0.7-tizen.wgt -d nuvio-wgt
tizen package -t wgt -s <your-profile> -- nuvio-wgt
sdb connect <tv-ip>
tizen install -n nuvio-wgt/NuvioTV-1.0.7-tizen.wgt -t $(sdb devices | awk 'NR==2{print $1}')

Known limitation: on newer firmware an app installed through Developer Mode stops launching after a while and needs reinstalling.

Verification

Nothing here was shipped on a claim alone. All three toolchains compile clean; the LG build was run on an OLED65C9 (60.0 fps, 0 janks) and the timings above were read from its log. The red button was confirmed to reach the app (scancode 486) and the log panel was checked in a screenshot from the TV itself. Unit tests under ASan/UBSan cover the JSON root-key reader, the glyph filter, the URL masking and the date parser; font coverage was measured with TTF_GlyphIsProvided rather than assumed.

Unofficial, and not affiliated with NuvioMedia. Issue-by-issue detail, including what could not be verified, is in ISSUES.md.

Don't miss a new nuvio-native-legacy release

NewReleases is sending notifications on new releases.