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

Download history 188/week @ 2024-04-27 168/week @ 2024-05-04 90/week @ 2024-05-11 106/week @ 2024-05-18 168/week @ 2024-05-25 330/week @ 2024-06-01 197/week @ 2024-06-08 306/week @ 2024-06-15 146/week @ 2024-06-22 153/week @ 2024-06-29 199/week @ 2024-07-06 233/week @ 2024-07-13 133/week @ 2024-07-20 160/week @ 2024-07-27 212/week @ 2024-08-03 115/week @ 2024-08-10

634 每月下载量
用于 rmup

MPL-2.0 许可证

205KB
3.5K SLoC

MPRIS 服务器

github crates.io docs CI

在您的应用程序中实现 MPRIS D-Bus 接口。

此库为在 服务 端实现 MPRIS D-Bus 接口 提供了基本功能。这使得您的应用程序可以被其他 MPRIS 兼容的媒体控制器发现和控制,包括但不限于 GNOME Shell、KDE Plasma 以及其他库,如 mpris

此库支持规范中定义的所有以下接口

要实现这些接口,此 crate 提供了两种选择:您可以选择创建自己的结构体并实现 RootInterfacePlayerInterface(或可选的 TrackListInterfacePlaylistsInterface),或者使用现成的 Player 结构体。

可选功能

功能 描述 默认
不稳定 启用内部 API 和不稳定功能。

示例

有关更详细的示例,请参阅 示例目录

此库在 Mousai 中的实际应用示例,Mousai 是一个针对 Linux 的音乐识别应用程序。

手动实现(通过 ServerLocalServer

如果您想要更多控制,建议您手动创建接口的实现。您可以通过创建自己的结构体并实现所需的接口来完成此操作,然后将您的结构体作为实现传递给 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.MediaPlayer2org.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