#media-player #cross-platform #control #metadata #mpris #abstraction #dbus

souvlaki

跨平台媒体键和元数据处理库

18次发布

0.7.3 2024年1月30日
0.6.1 2023年6月24日
0.6.0 2023年2月15日
0.5.3 2022年10月31日
0.1.0 2021年2月20日

#4多媒体

Download history 466/week @ 2024-04-30 447/week @ 2024-05-07 533/week @ 2024-05-14 861/week @ 2024-05-21 609/week @ 2024-05-28 599/week @ 2024-06-04 651/week @ 2024-06-11 546/week @ 2024-06-18 555/week @ 2024-06-25 1180/week @ 2024-07-02 803/week @ 2024-07-09 536/week @ 2024-07-16 453/week @ 2024-07-23 440/week @ 2024-07-30 611/week @ 2024-08-06 579/week @ 2024-08-13

2,163 每月下载量
用于 6 个crates (4直接)

MIT 许可证

64KB
1.5K SLoC

Souvlaki Crates.io 文档 CI

一个用于处理操作系统媒体控制和元数据的跨平台库。Linux、MacOS和Windows的一个抽象层。

支持的平台

  • Linux (通过MPRIS)
  • MacOS
  • Windows

Windows

  • 更新元数据
    image
  • 播放和暂停轮询。
    play_pause

Linux

  • GNOME
    GNOME

  • playerctl

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

# 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
  • 正在播放
    Now Playing

要求

最低支持的Rust版本是1.67。

使用方法

主结构是 MediaControls。为了创建此结构,您需要一个 PlatformConfig。此结构包含启动媒体控制的所有平台特定要求。以下是平台之间的差异

  • MacOS:无需配置,但需要打开一个窗口 (#23)
  • Linux
    • dbus_name:您的播放器在D-Bus上出现的方式。它应遵循 D-Bus规范
    • display_name:这可以是任何您想要的内容。这是将显示给用户的名字。
  • Windows
    • hwnd:在这个平台上,需要打开一个窗口来创建媒体控制。所需的参数是一个 HWND,一个类型为 *mut c_void 的值。这个值可以在您在程序中打开窗口时提取,例如使用winit中的 raw_window_handle

Linux 后端:D-Bus 和 zbus

在 Linux 上使用库时,默认后端是 dbus-crossroads。该后端在一致性方面存在一些问题,但更稳定且在幕后使用原生 D-Bus 库。然而,zbus 后端更现代,是用纯 Rust 编写的。它启动另一个线程并运行一个异步 pollster 运行时,处理传入的 MPRIS 消息。

要启用 zbus 后端,在您的 Cargo.toml 中将 default-features 设置为 false 并启用 use_zbus 功能

souvlaki = { version = "<version>", default-features = false, features = ["use_zbus"] }

注意:如果您认为有更好的方式在另一个线程中使用 zbus 库关于异步运行时,请随时提交 PR 或问题。

示例

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).unwrap();

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

请查看此处示例。

谢谢 💗

  • 感谢 jpochyla 为库架构做出贡献,以及 MacOS 支持的唯一开发者。

依赖关系

~0–45MB
~667K SLoC