If you installed v1.0.7, update. It carried a regression that made artwork worse, not better, and this release fixes it.
The regression, and how it happened
In v1.0.7 I "fixed" the missing-posters report (#1) by removing a retry ceiling in the artwork cache. The reasoning was right — the guard was attempts < 3 while the backoff table is indexed by that same counter before it increments, so the third value (60 s) was unreachable. The conclusion was wrong.
The ceiling was not there to limit requests. It is what returns the slot. When the cache needs room it prefers reclaiming a slot that has given up, before evicting artwork that is on screen. With no ceiling, an image that never decodes goes back to the pending queue forever, never qualifies as given-up, and the cache starts throwing away good artwork to make room for artwork that will never load.
Measured from a photo of the on-screen log on a Samsung TV: 99 items pending, 218 evictions in a three-second window, 54–57 fps with frame drops where it had been a steady 60, and the same five files reappearing every two seconds — that two-second gap being the first backoff of an item recreated from scratch, because eviction wipes the failure count along with the slot.
The ceiling is back, now at four attempts, which is what the backoff table always described. The 60 s step stops being dead code and the slot is recyclable again.
Two hypotheses ruled out by measurement
Both were in the v1.0.7 notes as "the next place to look". Both are wrong, and I would rather retire them than let someone spend a day on either:
- Not WebP. Metahub returns
image/jpegwhether the request sends a browser'sAcceptheader (image/avif,image/webp,…) or*/*. Same bytes, same size. - Not progressive JPEG. Metahub does serve progressive, but
IMG_Loadcompiled with the same Emscripten toolchain decodes progressive and baseline identically.
What remains is what the code already documented: on Tizen the image cache lives in MEMFS — RAM — and under memory pressure a write is exactly what ends up half-finished. The regression multiplied that pressure. The decode-failure log line now carries the file size and its first four bytes, which separates "zero bytes" from "truncated" from "the server returned an error page with status 200". Next report answers it instead of narrowing it.
Also fixed
- Catalogs that do not fit on the home stay searchable. A guard in the manifest reader was circular — it consulted a capability that comes out of that same manifest — and it never cut anything while capabilities stayed optimistic. Once v1.0.7 started learning them at start-up, an add-on with searchable catalogs that does not declare the
catalogresource would have lost its search targets from the second refresh onward. Removed. Search targets are registered independently of the row limit, the row order and the on/off switches, and that is now stated in the code so it does not regress. - The row limit is no longer invisible. After the last row the home says how many more rows would fit and where to change it. Reported as recommendations disappearing after updating (#11) — they had not disappeared, they were beyond the seven-row default and nothing on screen connected the two. The count is what raising the limit would actually give you, not the raw number of catalogs your add-ons declare, which is in the hundreds and would be true and useless.
- The profile panel stops flickering shut. Holding the button toggled it several times a second: the SDL "repeat" flag covers the repeats SDL itself generates from a keyboard, while TV firmware sends a held key as separate presses each marked as not-a-repeat. There is a 400 ms rest now — above any remote's repeat interval, well below two deliberate presses. Reported in #11 as the username pop-up appearing and vanishing too fast to select anything.
Installing
LG webOS 4.x — space.nuvio.native.legacy_1.0.8_arm.ipk. See INSTALL.md. The launcher caches appinfo.json, so reinstall rather than relaunch if the icon still looks wrong.
Samsung Tizen 5.5+ — NuvioTV-1.0.8-tizen.wgt, unsigned on purpose; you sign it with a certificate carrying your own TV's DUID. The steps are in the v1.0.7 notes.
Verification
All three toolchains compile clean and the LG package's binary was checked against a fresh build of the tag. The row-limit hint was confirmed on screen. The device checks stop there: the LG was offline for this round, so nothing in this release was run on a TV. The regression fix is a two-character change to a guard whose mechanism is described above, and the reasoning is in the commit — but it has not been watched running.
Unofficial, and not affiliated with NuvioMedia.