5a25c1f9cc3cc30e18f220370f45a6497210719b
Simkl only heard about an item once playback crossed the media server's watched threshold, so stopping partway recorded nothing at all: no resumable position, no watch. Drive Simkl's /scrobble/start, /pause and /stop from the player lifecycle instead, carrying the measured progress. Seeks report nothing, as Simkl asks. The terminal stop owns watched state for in-player playback, so real-time trackers are excluded from the threshold markWatched fan-out and one watch never produces two writes. Progress is reported as measured — it doubles as the user's resume position — so when a server threshold configured below Simkl's own 80% rule would leave the watch unrecorded, the tracker records it through /sync/history rather than inflating progress. Manual, container, offline-replay and external-player marks keep using /sync/history. Only /scrobble/stop accepts a 409, which is the sole action documented to return one. Reports go out one at a time because Simkl serialises scrobble writes per user and fails queued ones with a 400; overflow sheds the oldest non-terminal report so an episode swap cannot drop the previous item's stop. A playback session is pinned to the account bound when it began and every send re-checks that binding, so a profile switch or a disconnect/reconnect can neither redirect a queued report nor misfile the watched fallback. Also close the paths that lost the terminal report entirely: app exit flushes it instead of dropping it, the desktop window button goes through the app shutdown rather than exit(0), a detached VOD player reports a stop, and a finished item reports completion at EOF instead of waiting for teardown. A session that opened at 0% is still closed on stop, or Simkl keeps showing the item as playing until its runtime elapses. close #1719
Plezy
A modern client for Plex and Jellyfin on desktop, mobile, and TV. Built with Flutter for native performance and a clean interface.
Website · Screenshots · Download · Contributing · License
Download
| Platform | Download |
|---|---|
| Windows | Installer (x64, arm64) · Portable x64 · Portable arm64 |
| macOS | DMG (x64, arm64) |
| Linux x64 | .deb · .rpm · .pkg.tar.zst · portable tar.gz |
| Linux arm64 | .deb · .rpm · .pkg.tar.zst · portable tar.gz |
Package managers:
- Nix - Community package by @mio-19 and @MiniHarinn
- Homebrew (macOS):
brew tap edde746/plezy https://github.com/edde746/plezy brew install --cask plezy - AUR (Arch Linux) - Community maintained by @jianglai:
yay -S plezy-bin - WinGet (Windows):
winget install edde746.Plezy
Features
Browse & Discover
- Libraries, collections, and playlists
- Discover hub — Continue Watching, Next Up, trending, and recommendations
- Cross-server search
- Filtering, sorting, and alphabetical jump navigation
- Extras — trailers, deleted scenes, behind-the-scenes
Playback
- Wide codec support (HEVC, AV1, VP9, and more)
- HDR and Dolby Vision1
- Full ASS/SSA subtitles with customizable styling
- Online subtitle search & download2
- Audio & subtitle choices remembered per title
- Progress sync and resume
- Auto-play next episode with skip intro / skip credits
- Chapter navigation with thumbnail scrub previews
- Playback speed, audio sync offset, sleep timer
- Ambient lighting and GLSL shader presets3
- Picture-in-Picture4
- Refresh-rate matching5
- External player launch (VLC, MX Player, etc.)
Live TV & DVR
- Live TV channel browsing with favorites
- DVR support with EPG guide, recording rules, and scheduled recordings2
- Multi-server Live TV support where available
Downloads & Offline
- Download media for offline viewing
- Background queue with pause / resume
- Sync rules for automatic downloads
- Offline browsing with watch state sync-back on reconnect
Watch Together
- Synchronized playback with friends
- Real-time play / pause / seek sync
Integrations
- Discord Rich Presence6
- Trakt, MyAnimeList, AniList, and Simkl tracking & rating
- Plezy Remote — control desktop and TV from mobile
- Watch Next row
Platform & Customization
- Desktop, mobile, and TV — full D-pad, keyboard, and gamepad support
- Customizable keyboard shortcuts6
- Metadata and artwork editing
- Settings import/export
- Localized in English plus 14 translations
Building from Source
Prerequisites
- Flutter SDK 3.38.4+
- A Plex account or Jellyfin server with user credentials
Setup
git clone https://github.com/edde746/plezy.git
cd plezy
flutter pub get
scripts/codegen.sh
flutter run
Code Generation
After modifying model classes or other generated sources:
scripts/codegen.sh
After modifying translations:
dart run slang
Local Checks
scripts/ci_checks.sh
To install the same pre-commit checks locally:
scripts/setup_hooks.sh
Contributing
See CONTRIBUTING.md for development workflow, formatting, tests, and translation guidelines.
License
Plezy is licensed under GPL-3.0.
Acknowledgments
- Built with Flutter
- Supports Plex Media Server and Jellyfin
- Playback powered by mpv, MPVKit, Android ExoPlayer, libass-android, and libmpv-android
Languages
Dart
73.8%
GLSL
13.3%
Kotlin
4.3%
C++
2.3%
Python
1.7%
Other
4.3%



