13 releases

0.5.3 Oct 31, 2022
0.5.1 Jan 25, 2022
0.4.4 Nov 18, 2021
0.4.1 Jul 29, 2021
0.1.0 Feb 20, 2021

#5 in Multimedia

Download history 262/week @ 2022-10-08 218/week @ 2022-10-15 205/week @ 2022-10-22 305/week @ 2022-10-29 191/week @ 2022-11-05 161/week @ 2022-11-12 245/week @ 2022-11-19 145/week @ 2022-11-26 174/week @ 2022-12-03 185/week @ 2022-12-10 239/week @ 2022-12-17 239/week @ 2022-12-24 177/week @ 2022-12-31 337/week @ 2023-01-07 232/week @ 2023-01-14 220/week @ 2023-01-21

1,004 downloads per month
Used in 3 crates

MIT license

45KB
898 lines

Souvlaki Crates.io Docs CI

A cross-platform library for handling OS media controls and metadata. One abstraction for Linux, MacOS and Windows.

Supported platforms

  • Linux (via MPRIS)
  • MacOS
  • Windows

Windows

  • Update metadata:
    image
  • Play and pause polling.
    play_pause

Linux

  • GNOME:
    GNOME

  • playerctl:

# In one shell
$ cd souvlaki 
$ cargo run --example example

# In another shell
$ playerctl metadata
my_player xesam:artist              Slowdive
my_player xesam:album               Souvlaki
my_player mpris:artUrl              https://c.pxhere.com/photos/34/c1/souvlaki_authentic_greek_greek_food_mezes-497780.jpg!d
my_player mpris:trackid             '/'
my_player mpris:length              290000000
my_player xesam:title               When The Sun Hits

MacOS

  • Control Center:
    Control Center
  • Now Playing:
    Now Playing

Usage

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:

  • MacOS: No config needed, but requires a window to be open (#23)
  • Linux:
    • 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.
  • Windows:
    • 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.

Example

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.
}

Check out this example here.

Thanks 💗

  • To jpochyla for being a contributor to library architecture and the sole developer of MacOS support.

Dependencies

~0–43MB
~723K SLoC