You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust(Tauri框架)中获取当前播放媒体元数据?

解决Tauri中获取媒体元数据的问题

错误原因分析

你遇到的panic是因为所用的playerctl crate(0.1.0版本)本质是调用系统的playerctl命令行工具,而该命令执行失败,可能的原因:

  • 系统未安装playerctl工具
  • 当前没有活跃的媒体播放器在运行
  • 该crate版本过旧,不兼容当前系统环境

分步解决方案

1. 先确认系统环境

先在终端手动执行playerctl metadata title,验证基础环境:

  • 如果提示command not found,先安装系统级的playerctl:
    • Debian/Ubuntu:sudo apt install playerctl
    • Fedora:sudo dnf install playerctl
    • Arch:sudo pacman -S playerctl
    • macOS:brew install playerctl
  • 如果命令返回No players found,先打开任意媒体播放器(如Spotify、VLC)播放内容再试

2. 替换为更可靠的Rust依赖

原playerctl crate版本过于陈旧(最后更新为2018年),建议换成直接与MPRIS DBus接口交互的mpris crate,无需依赖命令行工具,稳定性更强。

修改Cargo.toml添加依赖:

[dependencies]
tauri = { version = "1.5", features = ["api-all"] }
serde = { version = "1.0", features = ["derive"] }
mpris = "2.0"

3. 重写获取元数据的代码

替换原有Rust代码为:

// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use serde::{Deserialize, Serialize};
use tauri::command;
use mpris::{Player, Players};

#[derive(Serialize)]
struct Metadata {
    artist: String,
    title: String,
    album: String,
}

#[command]
fn get_current_media_metadata() -> Result<Metadata, String> {
    // 获取所有活跃的MPRIS播放器
    let players = Players::new().map_err(|e| e.to_string())?;
    // 取第一个活跃的播放器(可根据需求调整,比如指定播放器名称)
    let player = players.iter().next().ok_or("没有找到活跃的媒体播放器")?;
    
    let metadata = player.get_metadata().map_err(|e| e.to_string())?;
    
    Ok(Metadata {
        artist: metadata.artists().unwrap_or_default().join(", "),
        title: metadata.title().unwrap_or_default().to_string(),
        album: metadata.album_name().unwrap_or_default().to_string(),
    })
}

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![get_current_media_metadata])
        .run(tauri::generate_context!())
        .expect("failed to run app");
}

4. 前端错误处理示例

现在代码会返回友好的错误信息给前端,可通过try/catch捕获:

// 前端调用示例
try {
  const metadata = await window.__TAURI__.invoke('get_current_media_metadata');
  console.log(metadata);
} catch (err) {
  console.error(err); // 例:"没有找到活跃的媒体播放器"
}

内容的提问来源于stack exchange,提问作者dayo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:12:37