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.
scripts/gen-core-methods.mjs extracts every method arm from
fluxa-core/src/ffi.rs into src/core/coreMethods.ts (runs before
typecheck and build), and coreInvoke now only accepts that union — a
typo'd or renamed method name is a compile error instead of a runtime
unknown_method envelope. New-method wrappers pass plain objects; the
double JSON.stringify layer is gone.
Two separate issues combined to make the loading overlay disappear
before there was anything to show:
- The overlay's "first frame ready" check relied on mpv's
vo-configured property, which flips as soon as the render pipeline
is set up, not once a real decoded frame has actually been rendered
through it. Added a frames-rendered counter to MpvRenderer (reset on
load, incremented on each successful render_opengl_frame call) and
require it to have advanced a couple of ticks past vo-configured
before treating the frame as ready.
- The audio-only/no-video-track fallback used to guess "no video" from
an arbitrary 1-second timeout on the video-codec property being
empty. For slow-to-buffer sources (P2P especially) that property can
legitimately still be unpopulated a second in, so the timeout fired
on real video content too. Replaced it with an actual read of mpv's
track-list to tell "no video track exists" apart from "haven't found
out yet".
Also bump the app version to 0.1.21 for this release.
Replace the MyAnimeList integration with AniList OAuth and per-profile
anime tracking sync (animeDetection, animeExternalSync,
anilistExternalSync), wired through effectRunner/libraryEffects and the
Account settings section.
Add anime upscaling (bundled Anime4K shaders, auto mode keyed off
detected anime playback) and frame interpolation prefs, passed to mpv
via player options.
Replace AMOLED mode with a gif-autoplay pref backed by a gif_to_webm
ffmpeg conversion command. Assorted UI work: virtualized
CollectionShelfRow, mark-watched flow in ContinueWatchingRow, sync
service popovers, Nuvio token refresh, DELETE support in nuvio_request.
Bump typescript to 6.0, vite 8.1.1, lucide-react 1.22; enable
fluxa_core desktop feature.
tauri.conf.json no longer carries its own version -- it now inherits
from Cargo.toml, so a release bump only touches package.json and
Cargo.toml (scripts/bump-version.sh handles both plus Cargo.lock).
- Render backend now sources prebuilt libmpv from KhooLy/mpv (gpu-next),
fetched via src-tauri/fetch-libmpv.sh; video-sync switched to
display-resample with vsync-paced render loops on all platforms.
- CI (build.yml) updated to fetch the fork instead of building/bundling
mpv per-platform.
- Fix: next-episode auto-skip countdown kept ticking while paused.
- Fix: addon HTTP fetches had no timeout, so a hung (not just refused)
connection could block the home feed load forever, leaving a blank
screen with no error.
- Fix: Nuvio offline banner overlapped the player's top bar instead of
pushing it down.
- Add F11 as a fullscreen toggle in the player, alongside F.
- Restyle Skip Intro/Outro button: flat surface instead of native
button chrome bleeding through, icon, hover/focus state, progress bar.