tauri_plugin_media/
models.rs

1use base64::{engine::general_purpose::STANDARD as BASE64, Engine as _};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Deserialize, Serialize)]
5#[serde(rename_all = "camelCase")]
6pub struct MediaMetadata {
7    pub title: String,
8    pub artist: Option<String>,
9    pub album: Option<String>,
10    pub album_artist: Option<String>,
11    pub duration: Option<f64>, // Duration in seconds
12    pub artwork_url: Option<String>,
13    #[serde(skip_serializing_if = "Option::is_none", with = "base64_serde")]
14    pub artwork_data: Option<Vec<u8>>, // Raw image data
15}
16
17mod base64_serde {
18    use super::*;
19    use serde::{Deserializer, Serializer};
20
21    pub fn serialize<S>(data: &Option<Vec<u8>>, serializer: S) -> Result<S::Ok, S::Error>
22    where
23        S: Serializer,
24    {
25        match data {
26            Some(bytes) => {
27                let encoded = BASE64.encode(bytes);
28                serializer.serialize_str(&encoded)
29            }
30            None => serializer.serialize_none(),
31        }
32    }
33
34    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Vec<u8>>, D::Error>
35    where
36        D: Deserializer<'de>,
37    {
38        let s: Option<String> = Option::deserialize(deserializer)?;
39        match s {
40            Some(encoded) => BASE64
41                .decode(encoded)
42                .map(Some)
43                .map_err(serde::de::Error::custom),
44            None => Ok(None),
45        }
46    }
47}
48
49#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq)]
50#[serde(rename_all = "camelCase")]
51pub enum PlaybackStatus {
52    Playing,
53    Paused,
54    Stopped,
55}
56
57#[derive(Debug, Clone, Deserialize, Serialize)]
58#[serde(rename_all = "camelCase")]
59pub struct PlaybackInfo {
60    pub status: PlaybackStatus,
61    pub position: f64, // Current position in seconds
62    pub shuffle: bool,
63    pub repeat_mode: RepeatMode,
64    pub playback_rate: f64,
65}
66
67#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq)]
68#[serde(rename_all = "camelCase")]
69pub enum RepeatMode {
70    None,
71    Track,
72    List,
73}
74
75#[derive(Debug, Clone, Deserialize, Serialize)]
76#[serde(rename_all = "camelCase")]
77pub struct MediaControlEvent {
78    pub event_type: MediaControlEventType,
79    pub timestamp: u64,
80}
81
82#[derive(Debug, Clone, Copy, Deserialize, Serialize)]
83#[serde(rename_all = "camelCase")]
84pub enum MediaControlEventType {
85    Play,
86    Pause,
87    PlayPause,
88    Stop,
89    Next,
90    Previous,
91    FastForward,
92    Rewind,
93    SeekTo(f64),
94    SetPosition(f64),
95    SetPlaybackRate(f64),
96}
97
98#[derive(Debug, Clone, Deserialize, Serialize)]
99#[serde(rename_all = "camelCase")]
100pub struct InitializeMediaSessionRequest {
101    pub app_id: String,
102    pub app_name: String,
103}