Actions first: deploy-web and installer were still on checkout,
setup-node and the artifact actions at v4 while build.yml had already
moved to v7, so the Pages deploy was warning about forced Node 24.
npm goes to latest across both apps, including the majors. TypeScript 7
removed baseUrl outright, so paths becomes relative. jsdom 30,
jest-dom 7 and quickjs-emscripten 0.32 needed no changes.
Two crates broke on the Rust side. aes-gcm 0.11 dropped the OsRng
re-export and moved key and nonce creation onto Generate, and its
from_slice is now TryFrom. The ciphertext layout is untouched, and
reuses_the_same_key_across_calls still reads a key written by the old
code, so nothing already encrypted becomes unreadable. sentry 0.49 made
ClientOptions non-exhaustive, which rules out struct expressions even
with a Default rest, so both init sites assign fields instead.
The installer only ever speaks plain HTTP to the television, so it takes
reqwest 0.13 without a TLS stack at all.
subtitleToVtt only ever understood SubRip: it prepended a WEBVTT header
and swapped comma decimals. ASS and SSA fell through that path unchanged,
so the browser parsed zero cues and the track silently rendered nothing.
Nothing applied the subtitle preferences either, which is why styling
appeared to do nothing on the hosted build.
Convert upward instead of down, the way mpv does internally: SubRip and
VTT are wrapped into a minimal ASS document carrying the user's style,
ASS passes through untouched, and libass renders all of it. That makes
subtitleForceStyle mean what it means on desktop -- respect the file's
own styling, or override it -- and gives SubRip the full styling model
for free.
libass arrives as jassub, loaded on demand and aliased away for the
desktop target so the Tauri bundle does not carry 4MB of wasm to render
subtitles mpv already draws itself.
The manualChunks rule referenced @phosphor-icons, which this project
doesn't use (it's on lucide-react), and grouping all @tauri-apps modules
into one vendor chunk was undermining route-level lazy loading. Let Rollup's
automatic chunking handle it instead, and lower chunkSizeWarningLimit to
500kb so oversized chunks get flagged earlier.
Add rollup-plugin-visualizer behind an ANALYZE_BUNDLE env var so bundle
composition can be inspected on demand (dist/bundle-stats.html) without
affecting normal builds.
discover.catalogs held whatever type the last fetch returned, so
switching content type raced the async refetch: the auto-select
effect could latch onto a stale catalog key from the previous type,
which then matched nothing once the real catalogs arrived. Filter
catalogs by the current contentType at the source so a mismatched
entry can never be selected.
Adds a Vitest + RTL harness (none existed) to drive the real
DiscoverScreen through the exact race condition.