Commit graph

416 commits

Author SHA1 Message Date
KhooLy
d4e170be27 Regenerate coreMethods.ts for pluginManifestParse/pluginStreamResultsParse
fluxa-core added these two core_invoke methods for parsing Nuvio-style
plugin manifests and getStreams() output.
2026-07-13 16:22:55 +03:00
KhooLy
c0b5ecb0b0 Add rquickjs plugin-execution spike (Nuvio-compatible scraper plugins)
Proves out running unmodified Nuvio Kotlin-plugin-format JS scrapers
(module.exports.getStreams) inside rquickjs, with native fetch and a
full cheerio bridge (load/select/find/text/attr/next/prev, chaining,
:contains()) ported from Nuvio's DomBridge.kt/JsBindings.kt.
2026-07-13 16:14:22 +03:00
KhooLy
18db03bb1f Delegate similarTitles/search-merge/fetch-policy/link-classification to fluxa-core
fluxa-desktop is meant to be a thin shell over fluxa-core, but several
pieces of business logic had crept into TypeScript: Trakt/Simkl similar-
titles response mapping, search/discover source merging, addon fetch
retry/timeout/concurrency/race policy, AnimeSkip episode matching,
continue-watching week partitioning, library merge diffing, and
cast/director link classification (duplicated across three components).
All of it now calls the corresponding new fluxa-core methods and just
executes/renders the result.
2026-07-13 04:29:58 +03:00
KhooLy
1bbea10434 Fix stale Continue Watching episode labels 2026-07-13 03:15:48 +03:00
KhooLy
2c5b159605 fix(player): wait for rendered video before handoff 2026-07-13 02:24:24 +03:00
KhooLy
91a68c899e Fix YouTube trailer playback and fullscreen overlay rendering
Route trailer resolution through fluxa-core's engine instead of a
duplicated desktop-side implementation, and add a thin local HTTP
proxy so the WebView's <video>/<audio> elements can stream the
resolved googlevideo URLs (which reject requests without proper
Range/client handling) without hitting CORS or range-negotiation
issues directly.

Also fix fullscreen trailer playback: requestFullscreen() was being
called on the bare <video> element, so sibling overlays (subtitle
text, progress bar) weren't descendants of the fullscreened element
and disappeared. Both hero trailer views now wrap video + overlays in
a shared container and fullscreen that instead.
2026-07-13 02:00:14 +03:00
KhooLy
fde3f44f21 fix(player): apply stream request headers 2026-07-12 18:58:48 +03:00
KhooLy
ebf8a2adf6 Preserve Nuvio collection sources in desktop sync 2026-07-12 18:49:06 +03:00
KhooLy
54371cb489 Add Discord community link to README 2026-07-12 14:09:44 +03:00
KhooLy
391c7b9893 Pair adaptive video/audio streams for YouTube trailers without HLS
Falls back to the best matching avc1 video + audio/mp4 adaptive
formats (by resolution/bitrate) when no hlsManifestUrl is available,
returning audioUrl alongside streamUrl so the player can mux them.
2026-07-12 13:51:38 +03:00
KhooLy
73cde13c90 Add TMDB as a built-in metadata provider
Users who remove Cinemeta/AIOMetadata and rely on a TMDB key alone got
nothing, because the TMDB key only powered narrow artwork/trailer
enrichment on top of a Meta object that had to already exist from a
real addon. When a TMDB key is set, it now acts as a synthetic addon
(transportUrl "tmdb://builtin") that plugs into the same catalog/meta
resolution pipeline real addons use for Home/Discover catalogs, search,
meta detail, and episode lists (including thumbnails and title logos
from TMDB's own /images endpoint) - everything except streams, same as
Cinemeta.

The synthetic addon is never persisted, never pushed to Nuvio/Stremio
sync, and never shown in the Addons list; each catalog/meta/episode
call site is patched individually to bypass the addon-protocol URL
builder (which would mangle the tmdb:// scheme) and resolve it
in-process instead via src/core/tmdbAddon.ts. A new "Prefer TMDB over
other metadata addons" toggle controls whether it's checked first or
only fills gaps.
2026-07-12 13:49:28 +03:00
KhooLy
43aa2b863b Stop dropping disabled addons during Nuvio profile import
fetchAddonManifests filtered the pulled addon list down to only
enabled entries before writing it to local storage. Since this import
runs automatically on startup and on every periodic Nuvio health
check, disabling an addon (which pushes enabled:false to Nuvio) got
that addon wiped from local storage on the next sync instead of just
marked inactive. Keep all pulled addons in the descriptor list and
only skip the manifest fetch for disabled ones.
2026-07-12 13:14:49 +03:00
KhooLy
62e8af09df Filter disabled addons from Home catalogs and hero banner
Disabling an addon never invalidated Home's catalog/billboard state,
so its content kept appearing until an unrelated cache refresh. Filter
disabled addons before building metadata feeds, and trigger a forced
Home reload right when an addon is toggled.
2026-07-12 13:14:44 +03:00
KhooLy
5042300b9f Select high quality trailer variants 2026-07-12 12:59:08 +03:00
KhooLy
be598c90d5 Move trailer resolution out of streaming engine 2026-07-12 12:52:36 +03:00
KhooLy
8c8d937ca5 chore: bump version to 0.1.27 2026-07-12 01:45:27 +03:00
KhooLy
c181126a07 Hide Discover result count 2026-07-12 01:43:35 +03:00
KhooLy
885a341a4f Use loading error screen for playback failures 2026-07-12 01:29:37 +03:00
KhooLy
099e2925b6 Fix catalog pagination deduplication 2026-07-12 01:24:03 +03:00
KhooLy
84349c1daa Replace blocking playback-error modal with a toast, surface subtitle addon failures
Playback errors now show as a dismissible top-right toast instead of a
full-screen backdrop, using a new reusable Toast component. Subtitle addon
and track load failures, previously swallowed silently, are now collected
and surfaced as a warning toast too.
2026-07-12 01:18:14 +03:00
KhooLy
c88e6c9d1b Allow removing a single recent search entry
The header search bar's recent-history dropdown only supported
clearing the whole list. Add a per-item remove button, matching the
per-item removal already present on the full search screen.
2026-07-12 00:57:57 +03:00
KhooLy
aaf1ddfe18 Remove torrent source debug panel from loading overlay
The Source/Provider/File/File index/Info hash/URLs block is debug
info with no value to a regular user watching something load.
2026-07-12 00:57:57 +03:00
KhooLy
d24f8317fc Style poster titles bold/white with a gray release year
Titles were a muted, small label with no release info. Make the title
bold and white, and add the release year (or releaseInfo fallback) in
gray beneath it. Grew the reserved per-card height to fit the extra
line without clipping into the next row.
2026-07-12 00:55:16 +03:00
KhooLy
240aadf6a0 Load more discover results as the user scrolls
The catalog picker only ever fetched the first page of a catalog with
no way to see more. Fetch additional pages via the new
discoverPageRequested/fetchDiscoverPage effect when the grid scrolls
near the bottom, accumulating results per catalog+genre selection and
stopping once a page comes back empty.
2026-07-12 00:55:06 +03:00
KhooLy
202dcfa923 Exclude search-only catalogs from discover type filter
Catalogs whose only extra is a required "search" field (e.g. an
"AI Search" catalog typed as "other") aren't browsable categories —
they were leaking into the type dropdown as their own tab. Also use
the plural "Movies" label to match "Series".
2026-07-12 00:54:30 +03:00
KhooLy
68f2359dbc Improve subtitle setting controls 2026-07-11 20:40:30 +03:00
KhooLy
7be07f828e fix: quote ANGLE cache warm command 2026-07-11 20:38:43 +03:00
KhooLy
18147c6a08 fix: register ANGLE cache workflow triggers 2026-07-11 20:36:23 +03:00
KhooLy
d36d76d904 Load skip segments before playback 2026-07-11 20:34:13 +03:00
KhooLy
e415e07f96 Fix IntroDB segment submission 2026-07-11 20:27:45 +03:00
KhooLy
e835c4e49a Simplify skip segment settings 2026-07-11 20:24:28 +03:00
KhooLy
23eb472b12 Improve subtitle customization and capture sync 2026-07-11 20:18:45 +03:00
KhooLy
1e8f37633d Fix recent search selection 2026-07-11 14:56:02 +03:00
KhooLy
ceb991ebc1 Open imported Nuvio collection sources 2026-07-11 14:51:24 +03:00
KhooLy
d47e30fed6 Add anime-skip.com as a third skip-segment provider
Adds an opt-in provider alongside AniSkip and IntroDB, gated by a
user-supplied anime-skip.com Client ID (settings mirror the existing
IntroDB API key flow). Matches shows via AniList ID, fetches episode
timestamps over the anime-skip.com GraphQL API, and merges results
with the other providers through the existing dedup path.
2026-07-11 14:36:17 +03:00
KhooLy
13ead49812 Stop episode synopsis from expanding to full text on hover 2026-07-11 13:26:30 +03:00
KhooLy
e6565f8a5f Fix calendar date handling and expand calendar screen
readCalendarMonth was truncating nextEpisodeAirDate before using it as
the item's dateIso, losing the time component; now the full string is
kept for dateIso and only truncated for the id key.
2026-07-11 13:26:03 +03:00
KhooLy
45647bf4df Retry torrent playback on peer stall instead of failing after one 60s wait
Torrent playback used to give up after a single 60s wait for ready
peers. Now it retries up to 2 more times (15s first attempt, then the
remaining budget split across retries), showing a "retry N/M" status
so a slow initial peer connect doesn't sink the whole playback attempt.

Also preloads the content logo mid-playback when it wasn't already
available, tightens the first-frame-ready check to not fire while
pausedForCache, and drops a redundant buffering-percent line from the
loading overlay.
2026-07-11 13:25:54 +03:00
KhooLy
a271a2b78d Add optional trailer autoplay on the detail screen hero banner
Adds a settings toggle (with a configurable delay: 2/4/6/10s) to
autoplay the trailer over the hero background, with mute, progress,
fullscreen, and subtitle overlay controls. The subtitle cue parsing
(WebVTT/YouTube timedtext) and language selection previously private
to HeroSection.tsx move into a shared src/core/trailerSubtitles.ts so
the detail screen's hero can reuse the same logic.
2026-07-11 13:25:47 +03:00
KhooLy
da7f9ed34f Remember window size and position across restarts
Adds the tauri-plugin-window-state plugin so the app reopens at the
same size/position instead of always resetting to defaults.
2026-07-11 13:25:38 +03:00
KhooLy
8622fc9085 Make the offline banner app-wide instead of Nuvio-specific
No internet affects the whole app, not just Nuvio sync, and Nuvio
already has its own "servers unreachable" banner for real backend
outages. Split connectivity detection into a standalone
useOnlineStatus hook and OfflineBanner component, shown in place of
the Nuvio banner whenever the OS reports no network at all.
2026-07-11 13:23:44 +03:00
KhooLy
e7a4fb08cf Add a retry button for failed addon stream fetches to the Sources panel
Wires detail.failedAddons through to both the movie and episode source
panels with a manual retry action, so a permanently failed addon isn't
just invisible — the user can see it happened and try again without
reopening the whole detail screen.
2026-07-11 13:21:14 +03:00
KhooLy
7eb5bf16f6 Show trailing skeleton tiles instead of a pill while loading more folder items 2026-07-11 13:21:02 +03:00
KhooLy
adabdb2c9b Distinguish no-internet from Nuvio-down in the connectivity banner
The health check treated any failed request as "Nuvio unreachable",
even when the user's own internet was down. Track navigator.onLine
via online/offline events and show a separate neutral banner instead
of blaming Nuvio when there's no internet at all.
2026-07-11 13:20:15 +03:00
KhooLy
ba18dda017 Retry on HTTP errors and malformed JSON too, and surface addon failures to the UI
Retries previously only fired when the network request itself threw
(timeout/DNS/connection failure); an addon responding with a 5xx/429
status or a truncated/malformed body counted as "got a response" and
was never retried. Now those cases retry as well (up to 3 attempts for
stream requests, with a shorter timeout on the retries).

Addon failures that survive every retry are no longer silently
indistinguishable from "this addon genuinely has no streams" — they're
tracked per addon and exposed as detail.failedAddons so the UI can
show a distinct notice instead of just omitting the addon.
2026-07-11 13:19:09 +03:00
KhooLy
15cdbae110 Add pagination to the collection folder grid so Movies/Series tabs can load more than the first page 2026-07-11 13:17:32 +03:00
KhooLy
a9a4549306 Enlarge collection-load error text and icon to fill the empty grid space 2026-07-11 13:08:36 +03:00
KhooLy
42d3b2b479 Improve contrast on collection-load error text 2026-07-11 13:07:42 +03:00
KhooLy
66cf3be7b4 Show an error state instead of silently closing empty/failed collection folders 2026-07-11 13:06:42 +03:00
KhooLy
59985b1418 Stop player next-episode preload from writing into detail-screen state
loadStreams reused fetchDetailStreams' progressive-dispatch callback,
which sends detailStreamsAppended with no generation tag and bypasses
the staleness guard, merging into the same detail.streams/
availableAddons the Detail screen reads. loadStreams only ever
consumes the final aggregated array, so the progressive dispatch was
unused for it and just risked mixing another episode's addon results
into whatever the user is currently viewing.
2026-07-11 13:01:05 +03:00