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 在 多媒体 中
2,163 每月下载量
用于 6 个crates (4直接)
64KB
1.5K SLoC
Souvlaki
一个用于处理操作系统媒体控制和元数据的跨平台库。Linux、MacOS和Windows的一个抽象层。
支持的平台
- Linux (通过MPRIS)
- MacOS
- Windows
Windows
- 更新元数据
- 播放和暂停轮询。
Linux
-
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
- 控制中心
- 正在播放
要求
最低支持的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