Repository navigation
Added
-
Added infinite scroll to the Jellyfin library card/poster grid: scrolling toward the bottom now lazy-loads and appends the next page of items in place and hides the pagination controls, instead of requiring the Next/Previous page buttons. It reuses Jellyfin Web's own paged fetch and card rendering (so cards, images, and auth match exactly) by intercepting the grid container's content updates and appending rather than replacing, so it works across the different library controllers (Movies, TV Shows, and other paged grids). It applies only to the card grid layout (the list/table view keeps its native pager), only takes over once the full pager is present, and degrades to normal pagination if the expected Jellyfin Web DOM is not found.
-
Added a
CIGitHub Actions workflow that runs on every pull request and on pushes tomain, checking formatting (cargo fmt --check) on Linux and running clippy (-D warnings), the test suite, and a binary build on both Linux and Windows so dependency and code changes are validated on every PR. -
Enabled Renovate auto-merge for non-major dependency updates and lock-file maintenance: once the
CIchecks pass, Renovate merges these PRs itself (platformAutomergedisabled), while major updates still open a PR for manual review. -
Added selectable streaming quality for external playback: keep original-quality direct playback, use Jellyfin's automatic connection limit, or choose a fixed bitrate from 1.5 to 120 Mbps. Auto and limited modes now advertise HLS transcoding support and let Jellyfin fall back to a server transcode when required, while applying saved changes to the next playback without reloading the app.
Changed
- Rewrote
README.mdto lead with the external-mpv differentiator (SVP4 motion interpolation, SDR-to-HDR, shaders, fullmpv.conf) rather than a generic "Jellyfin Web in a window" framing, and added a downloads badge. - Demoted the high-frequency Jellyfin playstate log lines (state send, state sent, and progress-report-due) from
debugtotraceso the defaultdebuglog level is no longer dominated by them. - Expanded the
sending mpv commandlog line soset_propertycommands now report the property and its value inline (for exampleset_property pause=true), summarizing large array/object values likechapter-listas an item/field count instead of dumping them. - Changed the Client Settings "Log level" control from a free-text input with suggestions to a proper dropdown listing Error, Warn, Info, Debug, and Trace.
- Updated the Rust
cefcrate to v149.2.0 (#16 by @renovate). - Updated the Rust
cefcrate to v149.3.0 (#17 by @renovate). - Updated the Rust
sevenz-rust2crate to v0.21.2 (#18 by @renovate). - Updated the Rust
sevenz-rust2crate to v0.21.3 (#19 by @renovate). - Refreshed locked Rust dependencies (#20 by @renovate).
- Refreshed locked Rust dependencies (#22 by @renovate).
- Reorganized the desktop app around playback, player-adapter, Jellyfin, preferences, maintenance, and shell domains. Playback requests, commands, events, context correlation, segment policy, and backend coordination are now backend-neutral contracts shared by mpv and MPC-HC, while CEF and native player protocols remain adapters; added
ARCHITECTURE.mdto document dependency and concurrency rules. The transitionalMpv*type aliases andMpvFullscreenBehaviorwere renamed to their backend-neutralplayback/preferencesnames. - Client Settings saves now apply only the runtime effects the change actually requires, as computed by
SettingsApplyPlan(player rebuild and warmup, segment-skip policy update, bridge profile refresh, scrollbar CSS), and the save confirmation states when a log-level change needs an app restart to take effect.
Fixed
- Replaced mpv's unconditional Windows minimize/restore focus pulse with a native foreground-activation fast path that finds the player window by process ID, restores it only when actually minimized, and verifies activation before retaining the previous pulse as a compatibility fallback. macOS, X11, and Wayland behavior is unchanged.
- Fixed selectable streaming quality sometimes being ignored because Jellyfin's PlaybackInfo query-string bitrate overrode the patched request body, and restored external bitmap-subtitle negotiation (including MPC-HC's encode fallback) so a quality limit does not silently remove subtitle paths that direct playback already supported.
- Fixed rejected mpv commands being mistaken for a dead IPC transport and tearing down an otherwise healthy player session. A command-reply timeout now poisons that IPC worker so later commands cannot pile up behind a stuck read, transport failures still restart mpv, startup-seek rejections retry after the file settles, and a rejected replacement
loadfileexplicitly resets the stale mpv session so it cannot continue untracked. - Fixed queued Jellyfin progress reports surviving past a later stopped report or being lost during application exit. Pending progress is coalesced per playback session, stopped supersedes stale progress, and both mpv and MPC-HC shutdown now flush the ordered reporter before the process exits.
- Fixed a reused CEF renderer reinstalling the startup streaming-quality snapshot after settings had changed, and made settings persistence an atomic same-directory replacement so a partial write cannot make the next renderer fall back to defaults.
- Fixed transcoded mpv playback briefly starting at the beginning or aborting instead of reaching Jellyfin's resume position when loading a slow external subtitle occupied or closed the validated command pipe. External subtitles now follow Jellyfin MPV Shim's direct remote-URL, synchronous
sub-addbehavior, but are deferred until the resume seek reaches its target and use a subtitle-specific bounded reply wait while retaining the established two-pipe IPC session; on Unix, command-socket reads now use that per-command deadline instead of the event socket's fixed two-second read timeout, and application shutdown now budgets for the bounded subtitle wait before graceful mpv teardown and final Jellyfin report flushing. - Fixed mpv playback stalls and replacement races by moving Jellyfin playstate HTTP requests onto an ordered background queue, waiting for and validating real mpv IPC command replies instead of treating pipe writes as acceptance, and preserving incoming pending playback when mpv emits the replaced file's stale
end-fileevent. - Fixed opening the app menus (Client Settings, About, Exit) or using the Client Settings buttons (Save, Browse, Get mpv, mpv.io link) during playback tearing down the active mpv session: the Jellyfin video backdrop vanished, the on-screen controls stopped responding (the back button became unclickable), and stopping mpv no longer reported back to Jellyfin. These bridge actions navigated the page via
window.location, which fires Jellyfin Web'sbeforeunloadhandler — stopping and destroying the current player and orphaning the running mpv — before CEF cancels the navigation. They now use the same no-cors request the rest of the bridge already uses, which does not unload the page. - Fixed the CI build-and-test jobs failing to resolve the CEF cache path by defining
CEF_PATHat the job level. - Fixed privileged resource-request bridge actions running directly on CEF's IO thread by marshalling them to the UI thread, and required the per-session bridge token for local welcome and data-page actions as well as Jellyfin-origin actions. Playback-context registration stays synchronous on the IO thread so a directly following stream capture always sees it, and rejected or unrecognized bridge requests now log their URL with the session token redacted.
- Fixed late playback context for another item being merged into MPC-HC's active Jellyfin reporter, and made playback IDs monotonic across runtime backend switches.
- Fixed player replacement and shutdown holding shell-state or coordinator locks during bounded process teardown, preventing long settings and CEF callback stalls. Retired backends now tear down on a detached thread so switching player backends never blocks the CEF UI thread, and a poisoned coordinator lock no longer silently drops player commands or leaks the running player.