v4.0.0 β Plex & Jellyfin support π
Discrakt is no longer Trakt-only. This major release turns it into a multi-source Rich Presence bridge: mirror what you're watching to Discord directly from Plex or Jellyfin (your own server, no third-party scrobbler needed), alongside the existing Trakt flow. It also ships a completely rebuilt setup wizard and properly signed & notarized macOS releases.
Pick your source in the setup wizard β each gets a native login (Trakt OAuth, Login with Plex, Jellyfin Quick Connect) and automatic artwork + localized titles.
What's Changed
β¨ New sources
- Add a source-agnostic Source trait, decoupling Discord rendering from Trakt
- Plex: PlexSource backed by Plex Media Server sessions, with "Login with Plex" (PIN flow), TMDB artwork via library metadata, and reachability probing during server discovery
- Jellyfin: JellyfinSource with Quick Connect auth, config + dispatch wiring, and a dedicated wizard tab
- Select the active tracking source from config and dispatch accordingly
πͺ Setup wizard
- Replace the inline HTML wizard with an embedded Vite+ / React app
- Brand logos beside each source tab, served from the bundle
- Collapsible "Advanced" options for each source (incl. public Trakt profile, no login)
- Drop the required Trakt username; add a post-setup success countdown
- Jellyfin: link straight to the Quick Connect page with the code prefilled
- Detect auth completion and hold the close countdown until the tab is refocused
π¨ Rich Presence
- Presence buttons now link to TMDB (the movie/show page), falling back to IMDB, plus an always-present Discrakt project link β consistent across all sources
π Fixes
- jellyfin: request ProviderIds when resolving a series TMDB id (restores episode artwork & localized titles)
- Cache resolved TMDB ids only on success, so a transient failure no longer pins a title to "no artwork"
- Widen season/episode numbers to u16 (large/absolute-numbered episode counts no longer drop the session)
- jellyfin: fetch the series poster even when the season is unknown; treat a session without play state as not playing; URL-encode the Quick Connect secret
- setup: reuse the in-flight Quick Connect code on restart and free the slot on expiry; close the success tab reliably; poll status immediately on the auth screen
- plex: address source-layer review findings
π§ Internal & CI
- Model Quick Connect expiry as an explicit poll variant; bound the series TMDB cache with an LRU; add Jellyfin window-math & TMDB-fallback tests
- macOS releases are now Developer ID signed + notarized (DMG), and the Homebrew binaries are Developer ID signed too
- Provision Node and pnpm via mise for crate builds; lint Tailwind classes with better-tailwindcss
- Docs updated for Plex and Jellyfin throughout
- Dependency bumps
Full Changelog: v3.4.5...v4.0.0