16 PRs since v0.16.0-beta.1. The player adds direct support for Jellyfin, Plex, and Stash media sources with Continue Watching and home hubs, per-user access restrictions and age limits are enforced end-to-end across Discover, search, and streaming, quality profiles gain a grab delay, and library display names can be customized.
Upgrade notes
• Two migrations:
add_grab_delay_hours_to_quality_profiles: addsgrab_delay_hours(integer, default 0) toquality_profiles(#1005). Existing profiles keep grabbing immediately.add_name_to_library_paths: adds optionalname(text) tolibrary_paths(#1015). Existing libraries fall back to their folder name rather than their full filesystem path.
• Items in existing libraries stored without a certification get one fetched once in the background by a paced fetch job (#1006). Titles that have no certification remain hidden from age-restricted accounts until metadata is available.
• Removed unused GraphQL subscriptions and the unauthenticated/api/graphql/socketendpoint (#1004).
Player
• Jellyfin source support: Connect directly to Jellyfin servers (10.9+) via Quick Connect or username/password, browse libraries, play media via direct play, HLS remux, or transcode, and sync playback progress and watched status back to Jellyfin (#1019).
• Plex and Stash sources: Sign in to Plex via PIN linking or connect to Stash via URL/API key; browse libraries, play media, and sync resume progress directly to each server (#1011, #1014, #1020).
• Source home hubs & Continue Watching: Source homes display their server's Continue Watching rail and native hubs (such as Plex home hubs) (#1018).
• Multi-source switching: Easily switch between Mydia, Plex, Stash, and Jellyfin from the sidebar switcher, with server reachability indicators and automatic connection racing (preferring LAN over WAN or relay) (#1014, #1019).
• Security & credential isolation: Third-party server tokens travel strictly in authorization headers, never in URLs, and are redacted from logs and crash reports (#1014, #1019).
• Architecture refactoring: Stream setup and progress tracking moved behind a unified PlaybackSession, with dedicated controllers for subtitles, up-next prompts, and player overlays (#1017).
Access controls and security
• Granular age limits on Discover & catalog: Age limits and content category restrictions are now enforced across Discover (popular, trending, curated lists), search, recommendations, the franchise strip, import matching, and TV re-identify (#1006).
• Request access checks: Requests and title additions fetch content ratings and enforce user age restrictions upfront, showing a disabled "Not available" status for titles outside a user's limits (#1006, #1010).
• Streaming & GraphQL scope enforcement: P2P direct streaming, download streams, transcode jobs, subtitle lookups, and GraphQL browse queries enforce the caller's access scope. Hidden media returns not-found (#1004).
• Live session & token invalidation: Changing a user's role or access limits immediately revokes cached media tokens and terminates active playback sessions for newly restricted content (#1004, #1006).
Media and library
• Library display names: Libraries can now have a custom display name configured via the UI or LIBRARY_PATH_<N>_NAME, falling back to the folder name instead of exposing container/filesystem paths (#1015).
• Discover year range filter: Discover filter now supports a custom From / To year range filter (#1015).
• TVDB cast credits: TVDB shows now properly map actor and character credits, restoring the Cast button on show pages (#1015).
• Button styling: Trailer and Cast buttons upgraded to soft primary buttons that scale cleanly on large screens (#1015).
Downloads and indexers
• Quality profile grab delay: Added an optional "Wait before grabbing" setting (0 to 168 hours) to quality profiles. Automatic searches hold off grabbing acceptable releases until the delay passes so better releases have time to arrive, while manual searches and releases meeting the upgrade cutoff grab immediately (#1005).
Admin and plugins
• Form toggle fixes: Fixed an issue where unchecking boolean checkboxes in admin forms (download client Enabled/Remove Completed, indexer Enabled, Require HDR, and Blackhole category subfolders) failed to save the disabled state (#1003).
• User management fixes: Create user form now clearly highlights invalid fields and preserves entered inputs, and automatic password reset works reliably (#1009).
• Plugin store modal: The plugin store now opens in a dedicated modal dialog showing install, update, and replace states for all catalog plugins, and allows installing store releases over sideloaded plugins (#1016).