lazykern/mprisence
A powerful Discord Rich Presence for MPRIS media players
✨ New Feature: Web player support
- <img width="488" height="209" alt="image" src="https://github.com/user-attachments/assets/256e5aaf-89cc-4720-b414-36ed07a5efc1" />
- <img width="490" height="195" alt="image" src="https://github.com/user-attachments/assets/82a6f838-7c53-418b-84f7-6e6d754f7a3c" />
- mprisence now show the rich presence according to the web player you are playing on any browsers (that support mpris)
- Supported sites: YouTube Music, Apple Music, Bandcamp, Tidal, SoundCloud, Qobuz, Amazon Music, Deezer, Yandex Music, YouTube (ignored by default).
📦 Install the web player bridge for more rich web player metadata (optional)
- 2. Run `mprisence web install` to register the native messaging host with your browser.
- 3. Run `mprisence web doctor` if anything goes wrong
📦 [Example web player config](https://github.com/lazykern/mprisence/blob/15085d5abc8211b1e976f894ee36bf0f314e8ec9/config/config.default.toml#L232)
- ```toml
- [web_player.youtube_music]
- match_pattern = "music.youtube.com"
- name = "YouTube Music"
- title_suffix = " | YouTube Music"
- app_id = "1125082278339559505" # shared with [player."*youtube_music*"]
- icon = "https://raw.githubusercontent.com/lazykern/mprisence/main/assets/icons/web-player/youtube-music.png"
- ignore = false
- + 7 more
📦 Also in this release
- fix: discord socket detection method by @1Step621 in https://github.com/lazykern/mprisence/pull/85
- `discovery_interval` was renamed to `fallback_poll_interval`.
- Unknown players are hidden by default. Add `[player.<name>]` ignore = false to bring one back.
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.6.0...v1.7.0
📋 Changes
- Player
- Replace polling with D-Bus event monitoring
- Config
- Add `event_driven` (default: `true`; set `false` to use polling)
- Remove deprecated `clear_on_pause`
- Default cover providers now prefer Catbox with Litterbox
- Rich Presence
- Fall back from `name` to `state` for the bundled app ID
📦 Summary
- Upgrade lofty from 0.23.3 to 0.24.0.
📦 Template
- Add `icontains` for case-insensitive substring matching in Handlebars templates alongside the existing `contains` and regex helpers
📦 Examples
- ```handlebars
- {{#if (contains player "Spotify")}}exact case{{/if}}
- {{#if (icontains player "spotify")}}case-insensitive{{/if}}
- {{#if (regex_is_match pattern="(?i)spotify" on=player)}}regex case-insensitive{{/if}}
- ```
📦 Template
- Add `contains`, plus `regex_is_match` and `regex_captures` from [`handlebars_misc_helpers`](https://github.com/davidB/handlebars_misc_helpers), for substring and regex-based matching in presence templates
📦 Dependencies
- Update core Rust dependencies: `clap` `4.5` -> `4.6.0`, `env_logger` `0.11.8` -> `0.11.10`, `smol_str` `0.3.4` -> `0.3.6`, `tokio` `1.48.0` -> `1.50.0`, `futures` `0.3` -> `0.3.32`, and `interprocess` `2.2.3` -> `2.4.0`
- Upgrade `toml` `0.9.12` -> `1.1.0`, `reqwest` `0.12.24` -> `0.13.2`, and `lofty` `0.22.3` -> `0.23.3`
📦 Config
- Add Gelly support (`bus name: io.m51.Gelly`)
- Enable `allow_streaming = true` for hosted music server players (Feishin, Supersonic, Gelly)
📦 Cover Art
- Treat authenticated/self-hosted API image URLs (Subsonic/OpenSubsonic/Navidrome/Jellyfin patterns) as non-direct and re-host them through configured providers instead of caching them as direct.
- Invalidate cached direct entries that are no longer eligible under the stricter URL policy and fall back to provider-based hosting.
📋 What's Changed
- Fix
- Handle `playerctld`'s `NoActivePlayer` D-Bus error without leaving stale Discord presence behind ([#76](https://github.com/lazykern/mprisence/issues/76))
- Deduplicate proxy and real MPRIS bus names by player identity so the same player is only tracked once ([#77](https://github.com/lazykern/mprisence/issues/77))
📋 What's Changed
- Config
- Add Ampcast and MPC-QT player entries to the default config
- README
- Add `mprisence-bin` AUR install option
📋 Changes
- Config
- Add [Haruna player](https://haruna.kde.org/)
- Set `ignore = false` explicitly for bundled supported players so `[player.default].ignore = true` does not unintentionally ignore them
✨ New feature: **Custom Activity Status**
- You can now choose what Discord shows in your status text:
- | `status_display_type` | Preview |
- | ------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
📦 Also in this release
- Added [Quester](https://codeberg.org/anoraktrend/quester) (mpd player) to default config. #69 #71
- Migrated template key from `template.detail` to `template.details`.
- `template.detail` is still supported for compatibility (deprecated).
📦 Special Thanks
- to @NonsensicalNickname for the status display feature contribution in #70.
- to @anoraktrend for providing Discord App Client for [Quester](https://codeberg.org/anoraktrend/quester) #69.
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.3.3...v1.4.0
📋 What's Changed
- Cover Art
- Allow metadata-only providers (MusicBrainz) to run when `mpris:artUrl` and local tagged cover data are unavailable [#68](https://github.com/lazykern/mprisence/issues/68)
- Player
- Add `cmus-remote` metadata enrichment to improve local file URL/tag resolution for metadata and cover lookup
- RPC
- Clear Discord activity before closing IPC connection to reduce stale presence lingering [#67](https://github.com/lazykern/mprisence/issues/67)
- Trigger an immediate first-cycle presence update when a newly discovered player is initialized
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.3.2...v1.3.3
📋 What's Changed
- Modified a player icon and added MusicBee configuration by @Blackstar1069 in https://github.com/lazykern/mprisence/pull/66
✨ New Contributors
- @Blackstar1069 made their first contribution in https://github.com/lazykern/mprisence/pull/66
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.3.1...v1.3.2
📋 Changes
- Fix
- Preserve full reverse-DNS player bus names (e.g. `io.github.htkhiem.euphonica`) while stripping MPRIS prefixes
📋 Changes
- Config
- Player identities and bus names now support regex patterns (prefix with `re:` or wrap in `/.../`) for both player config and allowed lists
- Matching also checks the player bus name, allowing configs to apply even when the displayed identity differs
- New `allowed_players` configuration lets you limit discovery to specific players using exact, wildcard, or regex patterns
- Addresses [#62](https://github.com/lazykern/mprisence/issues/62) and [#63](https://github.com/lazykern/mprisence/issues/63)
📋 Changes
- Config
- Added Qmmp player to default config
📋 Changes
- Cover Art
- Support catbox and litterbox uploader
- Switch to catbox as default image hosting service instead of imgbb
- Current cover art provider config: `["musicbrainz", "catbox"]`
- Note: mprisence will still try to find cover arts from musicbrainz first by default
- Improve musicbrainz track search strategy
📋 Changes
- Fix
- `allow_streaming = false` now enforces itself by clearing Discord activity for HTTP/HTTPS sources https://github.com/lazykern/mprisence/issues/58
- Config
- Ignore `firefox` by default (another identity of `mozilla_firefox`)
📋 Changes
- CLI
- `mprisence players list` now shows whether each detected player is currently ignored
📋 Changes
- Config
- Added a wait loop so hot reload pauses until the config file is written again, preventing reload failures when editors swap files
- Added Quod Libet and Euphonica player entries to the default configuration
📋 Changes
- Config
- Added wildcard player config support
- Example:
📋 Changes
- Config
- Added Gapless and Harmony Music to default config
Make handlebars not escape characters while compiling template **Full Changelog**: https://github.com/lazykern/mprisence/compare/v1.2.6...v1.2.7
📋 What's Changed
- add support for kew by @lazykern in https://github.com/lazykern/mprisence/pull/53
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.2.5...v1.2.6
📋 What's Changed
- Fixed album cover path that is derived from artUrl (`file://`) not getting decoded by @paypur in https://github.com/lazykern/mprisence/pull/51
✨ New Contributors
- @paypur made their first contribution in https://github.com/lazykern/mprisence/pull/51
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.2.4...v1.2.5
📋 What's Changed
- add Supersonic and Feishin + local/private url check for cover art retrieval by @lazykern in https://github.com/lazykern/mprisence/pull/49
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.2.3...v1.2.4
📋 Changes
- Dependencies
- Bumped `notify` from 8.0.0 to 8.1.0
- Upgraded `toml` from 0.8.20 to 0.9
- Upgraded `blake3` from 1.8.1 to 1.8.2
📋 What's Changed
- add fooyin to default config by @lazykern in https://github.com/lazykern/mprisence/pull/45
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.2.1...v1.2.2
📋 What's Changed
- Cover Art
- Use album artists for MusicBrainz release group search
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.2.0...v1.2.1
📋 What's Changed
- Config
- Added `cover.provider.musicbrainz.min_score` to set the minimum score for MusicBrainz cover art
- Added `cover.local_search_depth` to set the depth of local cover art search
- Cover Art
- Increased MusicBrainz query duration range from 3 seconds to 5 seconds
- Added album name to MusicBrainz track search query
- Escape Lucene special characters in MusicBrainz search queries
- Full Changelog: https://github.com/lazykern/mprisence/compare/v1.1.2...v1.2.0
