Skip to content

MediaFlick Desktop v0.1.6

Latest

Choose a tag to compare

@github-actions github-actions released this 16 Jul 22:05
· 442 commits to main since this release

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 CI GitHub Actions workflow that runs on every pull request and on pushes to main, 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 CI checks pass, Renovate merges these PRs itself (platformAutomerge disabled), 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.md to lead with the external-mpv differentiator (SVP4 motion interpolation, SDR-to-HDR, shaders, full mpv.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 debug to trace so the default debug log level is no longer dominated by them.
  • Expanded the sending mpv command log line so set_property commands now report the property and its value inline (for example set_property pause=true), summarizing large array/object values like chapter-list as 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 cef crate to v149.2.0 (#16 by @renovate).
  • Updated the Rust cef crate to v149.3.0 (#17 by @renovate).
  • Updated the Rust sevenz-rust2 crate to v0.21.2 (#18 by @renovate).
  • Updated the Rust sevenz-rust2 crate 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.md to document dependency and concurrency rules. The transitional Mpv* type aliases and MpvFullscreenBehavior were renamed to their backend-neutral playback/preferences names.
  • 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 loadfile explicitly 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-add behavior, 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-file event.
  • 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's beforeunload handler — 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_PATH at 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.