use base64::{engine::general_purpose::STANDARD as BASE64, Engine as _};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaMetadata {
pub title: String,
pub artist: Option<String>,
pub album: Option<String>,
pub album_artist: Option<String>,
pub duration: Option<f64>, pub artwork_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", with = "base64_serde")]
pub artwork_data: Option<Vec<u8>>, }
mod base64_serde {
use super::*;
use serde::{Deserializer, Serializer};
pub fn serialize<S>(data: &Option<Vec<u8>>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match data {
Some(bytes) => {
let encoded = BASE64.encode(bytes);
serializer.serialize_str(&encoded)
}
None => serializer.serialize_none(),
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Vec<u8>>, D::Error>
where
D: Deserializer<'de>,
{
let s: Option<String> = Option::deserialize(deserializer)?;
match s {
Some(encoded) => BASE64
.decode(encoded)
.map(Some)
.map_err(serde::de::Error::custom),
None => Ok(None),
}
}
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum PlaybackStatus {
Playing,
Paused,
Stopped,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PlaybackInfo {
pub status: PlaybackStatus,
pub position: f64, pub shuffle: bool,
pub repeat_mode: RepeatMode,
pub playback_rate: f64,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum RepeatMode {
None,
Track,
List,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MediaControlEvent {
pub event_type: MediaControlEventType,
pub timestamp: u64,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum MediaControlEventType {
Play,
Pause,
PlayPause,
Stop,
Next,
Previous,
FastForward,
Rewind,
SeekTo(f64),
SetPosition(f64),
SetPlaybackRate(f64),
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct InitializeMediaSessionRequest {
pub app_id: String,
pub app_name: String,
}