14 个版本 (7 个重大更改)
0.8.1 | 2024 年 8 月 2 日 |
---|---|
0.8.0 | 2024 年 3 月 19 日 |
0.7.0 | 2024 年 1 月 27 日 |
0.6.0 | 2023 年 11 月 19 日 |
#82 in Unix API
634 每月下载量
用于 rmup
205KB
3.5K SLoC
MPRIS 服务器
在您的应用程序中实现 MPRIS D-Bus 接口。
此库为在 服务 端实现 MPRIS D-Bus 接口 提供了基本功能。这使得您的应用程序可以被其他 MPRIS 兼容的媒体控制器发现和控制,包括但不限于 GNOME Shell、KDE Plasma 以及其他库,如 mpris
。
此库支持规范中定义的所有以下接口
- org.mpris.MediaPlayer2
- org.mpris.MediaPlayer2.Player
- org.mpris.MediaPlayer2.TrackList
- org.mpris.MediaPlayer2.Playlists
要实现这些接口,此 crate 提供了两种选择:您可以选择创建自己的结构体并实现 RootInterface
和 PlayerInterface
(或可选的 TrackListInterface
和 PlaylistsInterface
),或者使用现成的 Player
结构体。
可选功能
功能 | 描述 | 默认 |
---|---|---|
不稳定 |
启用内部 API 和不稳定功能。 | 否 |
示例
有关更详细的示例,请参阅 示例目录。
此库在 Mousai 中的实际应用示例,Mousai 是一个针对 Linux 的音乐识别应用程序。
手动实现(通过 Server
或 LocalServer
)
如果您想要更多控制,建议您手动创建接口的实现。您可以通过创建自己的结构体并实现所需的接口来完成此操作,然后将您的结构体作为实现传递给 Server
。如果您的结构体不能在线程之间发送和共享,您也可以使用 LocalServer
和接口的本地版本。
use std::future;
use mpris_server::{
zbus::{fdo, Result},
Metadata, PlayerInterface, Property, RootInterface, Server, Signal, Time, Volume,
};
pub struct MyPlayer;
impl RootInterface for MyPlayer {
async fn identity(&self) -> fdo::Result<String> {
Ok("MyPlayer".into())
}
// Other methods...
}
impl PlayerInterface for MyPlayer {
async fn set_volume(&self, volume: Volume) -> Result<()> {
self.volume.set(volume);
Ok(())
}
async fn metadata(&self) -> fdo::Result<Metadata> {
let metadata = Metadata::builder()
.title("My Song")
.artist(["My Artist"])
.album("My Album")
.length(Time::from_micros(123))
.build();
Ok(metadata)
}
// Other methods...
}
#[async_std::main]
async fn main() -> Result<()> {
let server = Server::new("com.my.Application", MyPlayer).await?;
// Emit `PropertiesChanged` signal for `CanSeek` and `Metadata` properties
server
.properties_changed([
Property::CanSeek(false),
Property::Metadata(Metadata::new()),
])
.await?;
// Emit `Seeked` signal
server
.emit(Signal::Seeked {
position: Time::from_micros(124),
})
.await?;
// Prevent the program from exiting.
future::pending::<()>().await;
Ok(())
}
即用型实现(通过 Player
)
如果您想创建一个无需实现接口的简单播放器,可以使用内置这些接口的即用型 Player
结构体。此结构体具有自己的内部状态,自动发出属性变更信号,并允许您连接到方法和属性设置器的调用。
然而,Player
目前仅支持更常用的 org.mpris.MediaPlayer2
和 org.mpris.MediaPlayer2.Player
接口。
use std::future;
use mpris_server::{zbus::Result, Player, Time};
#[async_std::main]
async fn main() -> Result<()> {
let player = Player::builder("com.my.Application")
.can_play(true)
.can_pause(true)
.build()
.await?;
// Handle `PlayPause` method call
player.connect_play_pause(|_player| {
println!("PlayPause");
});
// Run event handler task
async_std::task::spawn_local(player.run());
// Update `CanPlay` property and emit `PropertiesChanged` signal for it
player.set_can_play(false).await?;
// Emit `Seeked` signal
player.seeked(Time::from_millis(1000)).await?;
// Prevent the program from exiting.
future::pending::<()>().await;
Ok(())
}
许可证
版权所有 2024 Dave Patrick Caberto
本软件受 Mozilla 公共许可证第 2.0 版的条款约束。如果没有随此文件分发 MPL 的副本,您可以从 此网站 获取一个。
依赖项
~8–18MB
~272K SLoC