A cross-platform library for handling OS media controls and metadata. One abstraction for Linux, MacOS and Windows.
GNOME: \
playerctl: ```shell
$ cd souvlaki $ cargo run --example example
$ playerctl metadata myplayer xesam:artist Slowdive myplayer xesam:album Souvlaki myplayer mpris:artUrl https://c.pxhere.com/photos/34/c1/souvlakiauthenticgreekgreekfoodmezes-497780.jpg!d myplayer mpris:trackid '/' myplayer mpris:length 290000000 my_player xesam:title When The Sun Hits ```
The main struct is MediaControls
. In order to create this struct you need a PlatformConfig
. This struct contains all of the platform-specific requirements for spawning media controls. Here are the differences between the platforms:
dbus_name
: The way your player will appear on D-Bus. It should follow the D-Bus specification. display_name
: This could be however you want. It's the name that will be shown to the users.hwnd
: In this platform, a window needs to be opened to create media controls. The argument required is an HWND
, a value of type *mut c_void
. This value can be extracted when you open a window in your program, for example using the raw_window_handle
in winit.```rust use souvlaki::{MediaControlEvent, MediaControls, MediaMetadata, PlatformConfig};
fn main() { #[cfg(not(target_os = "windows"))] let hwnd = None;
#[cfg(target_os = "windows")]
let hwnd = {
use raw_window_handle::windows::WindowsHandle;
let handle: WindowsHandle = unimplemented!();
Some(handle.hwnd)
};
let config = PlatformConfig {
dbus_name: "my_player",
display_name: "My Player",
hwnd,
};
let mut controls = MediaControls::new(config);
// The closure must be Send and have a static lifetime.
controls
.attach(|event: MediaControlEvent| println!("Event received: {:?}", event))
.unwrap();
// Update the media metadata.
controls
.set_metadata(MediaMetadata {
title: Some("Souvlaki Space Station"),
artist: Some("Slowdive"),
album: Some("Souvlaki"),
..Default::default()
})
.unwrap();
// Your actual logic goes here.
loop {
std::thread::sleep(std::time::Duration::from_secs(1));
}
// The controls automatically detach on drop.
} ```