A transport reconnect could recover the wrong room or retain obsolete host authority. Authenticate retained membership and recover the relay-authoritative role without falling back to create or join. Release retained membership through authenticated teardown and document the coordinated relay rollout.
239 lines
11 KiB
Markdown
239 lines
11 KiB
Markdown
<h1>
|
|
<img src="assets/plezy.png" alt="Plezy Logo" height="24" style="vertical-align: middle;" />
|
|
Plezy
|
|
</h1>
|
|
|
|
A modern client for Plex, Jellyfin, and Emby on desktop, mobile, and TV. Built with Flutter for native performance and a clean interface.
|
|
|
|
<p>
|
|
<a href="https://plezy.app">Website</a> ·
|
|
<a href="https://plezy.app/#screenshots">Screenshots</a> ·
|
|
<a href="#download">Download</a> ·
|
|
<a href="CONTRIBUTING.md">Contributing</a> ·
|
|
<a href="LICENSE">License</a>
|
|
</p>
|
|
|
|
<p align="center">
|
|
<img src="assets/readme-showcase.webp" alt="Plezy mobile screenshots" width="900" />
|
|
</p>
|
|
|
|
## Download
|
|
|
|
<a href='https://apps.apple.com/app/apple-store/id6754315964?pt=128238902&ct=GitHub&mt=8'><img height='60' alt='Download on the App Store' src='./assets/app-store-badge.png'/></a>
|
|
<a href='https://play.google.com/store/apps/details?id=com.edde746.plezy&referrer=utm_source%3Dgithub%26utm_campaign%3Dreadme_badge'><img height='60' alt='Get it on Google Play' src='./assets/play-store-badge.png'/></a>
|
|
<a href='https://www.amazon.com/gp/product/B0GK65CVS1'><img height='60' alt='Available at the Amazon App Store' src='./assets/amazon-badge.png'/></a>
|
|
<a href='https://get.microsoft.com/installer/download/9n5r1s1t68h7?referrer=appbadge&cid=github'><img height='60' alt='Get it from Microsoft' src='./assets/microsoft-badge.png'/></a>
|
|
|
|
| Platform | Download |
|
|
| --- | --- |
|
|
| macOS | [DMG (x64, arm64)](https://github.com/edde746/plezy/releases/latest/download/plezy-macos.dmg) |
|
|
| Linux x64 | [.deb](https://github.com/edde746/plezy/releases/latest/download/plezy-linux-x64.deb) · [.rpm](https://github.com/edde746/plezy/releases/latest/download/plezy-linux-x64.rpm) · [.pkg.tar.zst](https://github.com/edde746/plezy/releases/latest/download/plezy-linux-x64.pkg.tar.zst) · [portable tar.gz](https://github.com/edde746/plezy/releases/latest/download/plezy-linux-x64.tar.gz) |
|
|
| Linux arm64 | [.deb](https://github.com/edde746/plezy/releases/latest/download/plezy-linux-arm64.deb) · [.rpm](https://github.com/edde746/plezy/releases/latest/download/plezy-linux-arm64.rpm) · [.pkg.tar.zst](https://github.com/edde746/plezy/releases/latest/download/plezy-linux-arm64.pkg.tar.zst) · [portable tar.gz](https://github.com/edde746/plezy/releases/latest/download/plezy-linux-arm64.tar.gz) |
|
|
|
|
<details>
|
|
<summary>Install with a package manager</summary>
|
|
|
|
### macOS — Homebrew
|
|
|
|
```bash
|
|
brew tap edde746/plezy https://github.com/edde746/plezy
|
|
brew install --cask plezy
|
|
```
|
|
|
|
### Windows — WinGet
|
|
|
|
```bash
|
|
winget install edde746.Plezy
|
|
```
|
|
|
|
### Arch Linux — Pacman
|
|
|
|
[Distribution package](https://archlinux.org/packages/extra/x86_64/plezy/).
|
|
|
|
```bash
|
|
sudo pacman -S plezy
|
|
```
|
|
|
|
### Fedora / Red Hat — DNF
|
|
|
|
[Installation instructions](https://github.com/aldobarr/plezy-rpm) · Community repository by [@aldobarr](https://github.com/aldobarr).
|
|
|
|
### Nix
|
|
|
|
[Community package](https://search.nixos.org/packages?channel=unstable&query=plezy) maintained by [@mio-19](https://github.com/mio-19) and [@MiniHarinn](https://github.com/MiniHarinn).
|
|
|
|
### aerynOS — Moss
|
|
|
|
[Distribution package](https://github.com/aerynOS/recipes/tree/main/p/plezy).
|
|
|
|
```bash
|
|
sudo moss it plezy
|
|
```
|
|
|
|
</details>
|
|
|
|
## Features
|
|
|
|
### <img src="assets/readme_icons/browse.svg" height="20" alt="" align="center" /> Browse & Discover
|
|
- Libraries, collections, and playlists — video and audio
|
|
- Discover hub — Continue Watching, Next Up, trending, and recommendations
|
|
- Cross-server search across every connected Plex, Jellyfin, and Emby server
|
|
- Filtering, sorting, and alphabetical jump navigation
|
|
- Folder browsing and folder playback — home-video libraries open in folder view
|
|
- Resolution, HDR/Dolby Vision, and audio-format badges on cards and detail pages
|
|
- Favorites and unwatched library filters[^mb]
|
|
- Extras — trailers, deleted scenes, behind-the-scenes
|
|
|
|
### <img src="assets/readme_icons/explore.svg" height="20" alt="" align="center" /> Explore & Requests
|
|
- Explore tab — watchlist, trending, popular, and recommendation rows from Plex Discover[^plex], Trakt, MyAnimeList, AniList, Simkl, and Seerr[^connect]
|
|
- Search any connected catalog source
|
|
- Catalog titles matched back to your own libraries by external ID
|
|
- Seerr — request movies and shows with per-season, 4K, and advanced destination options, and see request status inline
|
|
- Watchlist sync — add and remove titles on Plex, Trakt, MyAnimeList, AniList, and Simkl from anywhere in the app
|
|
|
|
### <img src="assets/readme_icons/playback.svg" height="20" alt="" align="center" /> Playback
|
|
- Wide codec support (HEVC, AV1, VP9, and more)
|
|
- HDR and Dolby Vision[^hdr]
|
|
- Direct play, or transcode presets from 240p/320 kbps to 1080p/20 Mbps
|
|
- Multi-version switching with per-version file details
|
|
- Full ASS/SSA subtitles with customizable styling
|
|
- Online subtitle search & download[^plex]
|
|
- Audio & subtitle choices remembered per title, or follow the server's per-episode selections
|
|
- Progress sync and resume
|
|
- Auto-play next episode with skip intro / skip credits
|
|
- Chapter navigation with thumbnail scrub previews
|
|
- Playback speed from 0.25x to 8x, audio sync offset, sleep timer (fixed durations or end of video)
|
|
- Video zoom 50-200% with pinch, presets, and hotkeys
|
|
- Audio passthrough[^pass], stereo downmix with center-channel boost, and loudness normalization
|
|
- File Info sheet — every version, file, and stream the server reports
|
|
- Ambient lighting and GLSL shader presets[^mpv]
|
|
- Picture-in-Picture[^pip]
|
|
- Refresh-rate matching[^rrm]
|
|
- External player launch (VLC, MX Player, etc.) with progress sync back[^android]
|
|
|
|
### <img src="assets/readme_icons/music.svg" height="20" alt="" align="center" /> Music
|
|
- Music libraries — artist, album, and track browsing with square artwork
|
|
- Album and artist screens with play, shuffle, and Instant Mix
|
|
- Gapless playback with a full play queue — reorder, remove, play next, add to queue
|
|
- Now Playing with synced lyrics[^lyrics], persistent mini-player, and sleep timer
|
|
- Background playback with lock-screen, media-key, and notification controls[^bgaudio]
|
|
- Offline playback of downloaded albums and tracks
|
|
- Streaming quality presets — Original, 320, 192, or 128 kbps
|
|
|
|
### <img src="assets/readme_icons/live-tv.svg" height="20" alt="" align="center" /> Live TV & DVR
|
|
- Live TV channel browsing, tuning, and favorites
|
|
- EPG guide with What's On and per-show schedules
|
|
- DVR recording rules, scheduled recordings, and a rememberable recording target library[^plex]
|
|
- Multi-server Live TV support where available
|
|
|
|
### <img src="assets/readme_icons/downloads.svg" height="20" alt="" align="center" /> Downloads & Offline
|
|
- Download movies, shows, and music for offline playback[^dl]
|
|
- Background queue with pause / resume
|
|
- Sync rules for automatic downloads, with per-show "Include Specials"
|
|
- Offline browsing with watch state sync-back on reconnect
|
|
|
|
### <img src="assets/readme_icons/watch-together.svg" height="20" alt="" align="center" /> Watch Together
|
|
- Synchronized playback with friends
|
|
- Real-time play / pause / seek sync
|
|
- Host handoff when the relay and every connected peer support safe transfers
|
|
- Automatic reconnect authenticates retained room membership; it never silently joins a reused room code.
|
|
|
|
Self-hosted relays must support `authenticatedResume` for recovery. Deploy the updated relay before updating clients.
|
|
Older relays still accept explicit create/join, but failed recovery requires joining or creating a room again.
|
|
|
|
### <img src="assets/readme_icons/integrations.svg" height="20" alt="" align="center" /> Integrations
|
|
- Discord Rich Presence[^desktop]
|
|
- Trakt, MyAnimeList, AniList, and Simkl — ratings, watched sync, and real-time scrobbling[^rt]
|
|
- Plezy Remote — control desktop and TV from mobile
|
|
- Watch Next row and tvOS Top Shelf[^shelf]
|
|
|
|
### <img src="assets/readme_icons/customization.svg" height="20" alt="" align="center" /> Platform & Customization
|
|
- Desktop, mobile, and TV — full D-pad, keyboard, and gamepad support
|
|
- Multiple servers at once — Plex, Jellyfin, and Emby side by side
|
|
- Profiles with per-profile downloads, watch state, and settings; Plex Home switching with PIN
|
|
- Jellyfin and Emby local-server discovery and multiple URLs per server; Quick Connect sign-in[^jf]
|
|
- TV layout options — corner spotlight backdrop, full-card artwork, and Force TV mode on desktop
|
|
- Customizable keyboard shortcuts[^desktop]
|
|
- Metadata and artwork editing
|
|
- Settings import/export
|
|
- Localized in English plus 21 translations
|
|
|
|
[^jf]: Jellyfin only.
|
|
[^mb]: Jellyfin and Emby only.
|
|
[^plex]: Plex only.
|
|
[^connect]: Requires connecting the service under Settings > Services.
|
|
[^hdr]: In-app HDR toggle on Windows, macOS, iOS, tvOS, and Linux — Linux needs a colour-managed Wayland compositor. Dolby Vision on Android and Apple TV.
|
|
[^pass]: Desktop, Android TV, and Apple TV.
|
|
[^mpv]: Requires the mpv player backend — unavailable on iOS and tvOS, and Android defaults to ExoPlayer.
|
|
[^pip]: Android, iOS, and macOS — not on Android TV or Apple TV.
|
|
[^rrm]: Windows, Android, and tvOS.
|
|
[^android]: Progress sync on Android.
|
|
[^lyrics]: Where your server provides lyrics.
|
|
[^bgaudio]: tvOS pauses music when the app is backgrounded.
|
|
[^dl]: Not available on tvOS.
|
|
[^desktop]: Desktop only.
|
|
[^rt]: Real-time scrobbling on Trakt and Simkl; MyAnimeList and AniList update on completion.
|
|
[^shelf]: Android TV / Fire TV and tvOS.
|
|
|
|
## Building from Source
|
|
|
|
### Prerequisites
|
|
- Flutter SDK 3.47.0+
|
|
- A Plex account, or a Jellyfin or Emby server with user credentials
|
|
|
|
### Setup
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
scripts/codegen.sh
|
|
```
|
|
|
|
After modifying translations:
|
|
|
|
```bash
|
|
dart run slang
|
|
```
|
|
|
|
### Local Checks
|
|
|
|
```bash
|
|
scripts/ci_checks.sh
|
|
```
|
|
|
|
To install the same pre-commit checks locally:
|
|
|
|
```bash
|
|
scripts/setup_hooks.sh
|
|
```
|
|
|
|
End-to-end tests (Android emulator plus a Dockerized Jellyfin fixture):
|
|
|
|
```bash
|
|
python3 scripts/maestro/run_maestro.py basic
|
|
```
|
|
|
|
## Contributing
|
|
|
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for development workflow, formatting, tests, and translation guidelines.
|
|
|
|
## License
|
|
|
|
Plezy is licensed under [GPL-3.0](LICENSE).
|
|
|
|
## Acknowledgments
|
|
|
|
- Built with [Flutter](https://flutter.dev)
|
|
- Supports [Plex Media Server](https://www.plex.tv), [Jellyfin](https://jellyfin.org), and [Emby](https://emby.media)
|
|
- Playback powered by [mpv](https://mpv.io) via our [mpv-build](https://github.com/edde746/mpv-build) pipeline (started as a fork of [MPVKit](https://github.com/mpvkit/MPVKit); the Android Kotlin/JNI glue descends from [libmpv-android](https://github.com/jarnedemeulemeester/libmpv-android)), Android [ExoPlayer](https://developer.android.com/media/media3/exoplayer), and [libass-android](https://github.com/peerless2012/libass-android)
|