Commit graph

623 commits

Author SHA1 Message Date
KhooLy
5e7df0002c Bind telemetry to playback sessions 2026-08-01 21:09:47 +03:00
KhooLy
f74be653a7 fix: advance desktop telemetry attempts 2026-08-01 19:26:28 +03:00
KhooLy
9f86056f79 fix: reset desktop torrent telemetry sessions 2026-08-01 19:13:39 +03:00
KhooLy
e8e70ac3eb chore: consolidate desktop updates 2026-08-01 18:53:50 +03:00
KhooLy
59e4a9e5eb style raise trailer subtitles 2026-08-01 18:17:43 +03:00
KhooLy
b2ce9e1742 Guard desktop torrent duration 2026-08-01 17:49:51 +03:00
KhooLy
b213bb0221 Complete torrent playback lifecycle wiring 2026-08-01 16:24:03 +03:00
KhooLy
5e6127ed0b Pass torrent duration to streaming scheduler 2026-08-01 16:04:32 +03:00
KhooLy
c78d3ac27d Ignore aborted effect completions 2026-08-01 15:29:32 +03:00
KhooLy
5f6ecc8f37 Preserve desktop torrent cache 2026-08-01 15:24:21 +03:00
KhooLy
7a79055a33 refactor isolate route state subscriptions 2026-08-01 15:09:03 +03:00
KhooLy
534f3247dc fix isolate thumbnail renderer state 2026-08-01 14:50:59 +03:00
KhooLy
5f7efe349d refactor desktop state boundaries 2026-08-01 14:43:41 +03:00
KhooLy
ad4ff1d115 perf: split player status events 2026-07-31 22:07:31 +03:00
KhooLy
8b1c69fdf9 perf: reduce player telemetry work 2026-07-31 21:59:10 +03:00
KhooLy
0d09970d3d feat: make Sentry crash reporting opt-in via Diagnostic Mode toggle
Sentry previously initialized unconditionally in release builds. Now it
only starts when the user enables Diagnostic Mode, and shuts down when
they disable it. Also drops the stdout log target in release builds —
console output is invisible to users running the packaged app anyway.
2026-07-31 19:40:49 +03:00
KhooLy
cd7e5470aa docs: drop stale telemetry claim and pinned versions from README
Sentry is compiled into release builds, so "no telemetry" was inaccurate.
Stack section now lists tech names without versions to avoid drift.
2026-07-31 19:34:23 +03:00
KhooLy
c84981e4e8 fix: respect disabled-addon setting when fetching streams and other content
Disabling an addon in Settings only excluded it from the home-page catalog
(readHomeBootstrap). Every other content-fetch path — stream resolution,
episode lists, calendar, notifications, watch progress — called the raw
addon list, so disabled addons kept being queried for streams.

Added loadEnabledAddons() in libraryOps.ts and switched all content-fetch
call sites to it, while addon-management code (SettingsScreen, manifest
refresh) keeps using the raw loadAddons() since it needs to see disabled
addons too.
2026-07-31 18:01:09 +03:00
KhooLy
c3b6f3cde9 fix: shorten Turkish Stable Volume label 2026-07-31 17:29:43 +03:00
KhooLy
abbc8e43c8 feat: move Stable Volume toggle into in-player settings menu instead of app Settings 2026-07-31 17:28:17 +03:00
KhooLy
53b8fe196c feat: add Stable Volume setting to normalize loud/quiet audio via mpv dynaudnorm filter 2026-07-31 17:22:21 +03:00
KhooLy
d52cbeba6d feat: merge skip-segment read toggles into one setting, add provider picker + coverage checkmarks to segment marker
IntroDB/SkipDB/TheIntroDB/AniSkip reads are now gated by a single
useSkipSegments preference instead of four toggles that were always
flipped together. fetchIntroSegments also now reports which providers
already returned a result per segment type (coverage), threaded through
usePlayer -> App -> ReactPlayerOverlay. The player's segment marker panel
uses that to show a dropdown for picking which single provider to submit
a marked segment to, with a checkmark on providers that already have a
result for the selected segment type.
2026-07-31 15:23:55 +03:00
KhooLy
ec975d1856 feat: execute core-built request plans for skip segments, add TheIntroDB support
The desktop shell no longer builds provider URLs/headers/bodies itself for
IntroDB/SkipDB/AniSkip/AnimeSkip - it asks fluxa-core for a request plan and
executes it generically (executeRequestPlan), then hands the raw response
back to core for parsing. Also wires up TheIntroDB.org as a 5th skip-segment
source (settings toggle + API key, merge pipeline, and segment marker panel
submission), and fixes content-id resolution to stop conflating a bare TMDB
numeric id with an IMDb id when only one of the two is available.
2026-07-31 15:13:04 +03:00
KhooLy
b829f08ce9 feat: add SkipDB skip-segment source with read + submit support
Fetches intro/recap/outro/preview segments from api.skipdb.tv alongside
IntroDB/AniSkip/AnimeSkip, merged into the existing dedup pipeline. Adds
a SkipDB API key setting for submitting marked segments from the player's
segment marker panel (which now also supports the 'preview' type), and a
useSkipDb toggle bundled with the existing intro/outro/recap switch.
2026-07-31 14:55:31 +03:00
KhooLy
2cbb64f747 fix: send scrobble stop for the previous episode on next-episode/skip-outro transitions
Trakt and Simkl only mark an episode watched (or save resumable progress)
via an explicit scrobble stop call; auto-advancing to the next episode
was resetting scrobble state and firing a new start without ever
stopping the outgoing episode's session.
2026-07-31 14:08:05 +03:00
KhooLy
5dd63299f2 fix: show a popup when an added avatar pack was already in the list
Adding a pack whose manifest URL already exists in the saved list
silently produced neither a success nor an error toast, since
discovery succeeded but zero new packs were appended. Also adds the
missing common.loading i18n key, which was rendering as the literal
key text on the add-pack button while a request was in flight.
2026-07-31 00:51:07 +03:00
KhooLy
c689e9ba52 feat: show a success popup when an avatar pack is added
Toast gains a 'success' variant (green check icon) alongside the
existing warning/error ones, and adding a repository/pack link now
shows it with a count of newly added packs.
2026-07-31 00:48:34 +03:00
KhooLy
a1a338ffa2 feat: show error popups with a reason for failed avatar pack/addon adds
Avatar pack discovery used to return an empty array on every failure
path (bad URL, repo not found, no packs, no valid images), so a failed
add looked identical to nothing happening. It now throws a typed
AvatarPackDiscoveryError and the settings screen shows it in a Toast.

Also wires up the new profileAvatarPackManifestPlan core route so a
direct pack.json link (GitHub or any other host) can be added without
needing the whole-repository discovery flow.

Addon installation already surfaced its error inline; it now also
shows a Toast popup with the failure reason.
2026-07-31 00:43:55 +03:00
KhooLy
15ca2b3e02 ci: fetch VLC directly from download.videolan.org instead of the mirror-selecting get.videolan.org
Some checks failed
Warm Windows ANGLE Cache / warm-angle-cache (push) Has been cancelled
The Windows runner's redirect target served a 200 response with a 29KB
error page instead of the real ~80MB archive. download.videolan.org is
VideoLan's own origin, not the geo-mirror load balancer.
2026-07-30 23:23:19 +03:00
KhooLy
f9918db942 ci(windows): surface the real Expand-Archive failure instead of a swallowed exception 2026-07-30 23:03:16 +03:00
KhooLy
14ab9a0608 ci: stop checksum-verifying VLC downloads against get.videolan.org's own mirror-routed sha256
The checksum comparison kept failing even with retries, most likely because
not every mirror in VideoLan's round-robin hosts the .sha256 sidecar file.
fetch-libmpv.sh already trusts HTTPS from its source without a checksum;
do the same here.
2026-07-30 22:45:39 +03:00
KhooLy
48623de870 fix(macos): mark extern C blocks unsafe for edition 2024, fix mismatched-type build error
ci: retry VLC checksum verification since get.videolan.org round-robins mirrors
2026-07-30 22:13:58 +03:00
KhooLy
53367714ae ci: dereference symlinks when bundling libvlc.so on Linux, verify VLC downloads against upstream sha256 2026-07-30 21:37:18 +03:00
KhooLy
441b85b2d7 ci: fix stale VLC checksums, add libVLC bundling diagnostics on Linux 2026-07-30 21:31:55 +03:00
KhooLy
7d5989bfd7 chore: bump version to 0.1.30 2026-07-30 21:23:33 +03:00
KhooLy
c88388c1d9 refactor: move mark-watched into continue watching context menu
The hover overlay's check/X buttons duplicated the right-click menu
and covered part of the artwork. Remove sits in the context menu
already; add mark-as-watched there too and drop the hover buttons.
2026-07-30 21:04:02 +03:00
KhooLy
243cdaf309 feat: drop Simkl playback progress too when removing continue watching
Simkl-sourced continue-watching items only cleared local state on
remove; now dropSimklPlaybackProgress mirrors the Trakt path by
matching the item against GET /sync/playback and deleting the session.
The remove confirmation also warns when the item will be cleared from
its external source (Trakt/Simkl), not just locally.
2026-07-30 21:01:02 +03:00
KhooLy
abf3a23f83 fix: import DesktopState in storage.rs
Windows build broke after the lib.rs split moved DesktopState without
updating this reference.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 20:40:12 +03:00
KhooLy
c2da5923e9 fix: bump tauri to 2.11.5, gate Linux resize handler on decorations
tauri-runtime-wry's undecorated_resizing::attach_resize_handler was
attached unconditionally for every webview on Linux (unlike Windows,
which already checks !window.is_decorated()), and its hit-test
handler assumes the GTK widget tree is always exactly
webview -> parent -> window. With transparent windows the tree has
an extra GtkBox layer, so the downcast .unwrap() panics and aborts
the whole process on resize.

Since this app always runs with decorations: true and never toggles
them, port the same !window.is_decorated() gate Windows already uses
into a fresh local patch against tauri-runtime-wry 2.11.4, which lets
the app move to tauri 2.11.5. The crash no longer reproduces
(verified against vanilla 2.11.4 first).
2026-07-30 19:59:58 +03:00
KhooLy
41d38ce3d4 fix: persist selected playback source on the same tick as progress
persistLastPlaybackSource was only called from closePlayer(), the
in-app back-button path, so exiting any other way (closing the app,
window close) skipped it and left the content without a saved
source next time. Save it alongside progress in saveProgressTick,
which already runs every 30s and on app-quit flush.
2026-07-30 19:58:46 +03:00
KhooLy
77f69fe099 fix: don't mark first frame presented while a resume seek is pending
report_swap() flipped first_frame_presented as soon as any frame
rendered, even the pre-seek frame 0 mpv holds while paused waiting
for the resume position to land. The frontend uses that flag to
dismiss the loading overlay, so resuming from continue watching
flashed the video's first frame before jumping to the saved position.
Gate it the same way restore_audio_after_first_presented_frame()
already does.
2026-07-30 19:58:41 +03:00
KhooLy
da8ef1dfb5 fix: reliably restart hero slide indicator fill animation
The dot indicator relied on a React key remount to restart the CSS
heroIndicatorFill keyframe on each slide change, which WebKitGTK
sometimes fails to pick up as a fresh animation start, leaving the
active dot frozen at 0% while the underlying slide timer kept
advancing normally. Drive the restart imperatively via a ref with a
forced reflow instead.
2026-07-30 19:58:32 +03:00
KhooLy
674921e250 refactor: split CalendarScreen.tsx into calendar/ parts
Extract the header, grid, day dialog, and artwork-fetch hook from
CalendarScreen.tsx into src/screens/calendar/, along with their shared
styles and utils.
2026-07-30 14:17:32 +03:00
KhooLy
d2c30735a8 refactor: split ReactPlayerOverlay.tsx into player/ components and hooks
ReactPlayerOverlay had grown to cover the whole in-player UI plus a
long tail of behavior hooks (gestures, telemetry, casting, media
session, Anime4K, keyboard shortcuts, track/subtitle controls, window
mode, etc). Break the JSX into PlayerBottomControls, PlayerFeedback,
PlayerMiniMode, PlayerOverlayDecorations/Styles, PlayerSkipPrompt,
PlayerStatsOverlay, PlayerStreamLinksMenu, PlayerSupplementalPanels,
PlayerTrackPanel, and SoftwareVideoCanvas, and move each behavior
concern into its own usePlayer*.ts hook.
2026-07-30 14:17:20 +03:00
KhooLy
6c6c484bb6 fix: keep seek preview thumbnail box stable and drop buffered stat row
The thumbnail container was only rendered once an image loaded, causing
the preview to jump size; keep the box mounted and swap the image in.
Also drop the redundant "Buffered" row from the torrent stats popover
and show downloaded progress with one decimal place.
2026-07-30 14:17:10 +03:00
KhooLy
6d29d033e0 refactor: split usePlayer.ts into focused hooks
Pull the embedded-mpv lifecycle, scrobbling, progress persistence,
retry, playback-start, and close-action logic out of usePlayer into
their own hooks, mirroring the existing usePlayerNativeEvents split.
2026-07-30 14:17:01 +03:00
KhooLy
f39ed72463 refactor: move playback/plugin/tmdb decision logic into fluxa-core
Replace duplicated JS logic for clearing playback progress, merging
continue-watching lists, selecting plugin scrapers, and resolving TMDB
ids/urls with coreInvoke calls into fluxa-core, so the frontend just
executes plans the core computes. Drops tmdbShared.ts now that its
helpers live in fluxa-core.
2026-07-30 14:16:52 +03:00
KhooLy
5956f5adec refactor: split engine.ts into runtime, core-client, content, and library modules
engine.ts had grown into a mixed bag of engine lifecycle calls, generic
core-invoke plumbing, and content/library-specific core wrappers.
Split those concerns out and re-export them from engine.ts as a barrel
so existing imports keep working.
2026-07-30 14:16:36 +03:00
KhooLy
0b666ed64a refactor: split lib.rs into core_commands, oauth_callbacks, and torrent modules
Move Tauri command handlers for core IPC, OAuth callback queuing, and
torrent streaming/transport out of lib.rs into dedicated modules, and
fold plugin_runtime into a single plugin_executor module now that it's
just the scraper execution path.
2026-07-30 14:16:19 +03:00
KhooLy
ddd808957b refactor: split storage.rs into library_*_storage and storage_kv modules
Separate the SQLite-backed progress/history/collections tables and the
generic key-value store from storage.rs, which had grown to cover
encryption, migrations, and every table's CRUD in one file.
2026-07-30 14:16:11 +03:00