use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Genre {
#[serde(rename = "value")]
pub name: String,
pub song_count: i64,
pub album_count: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ItemGenre {
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ItemDate {
#[serde(skip_serializing_if = "Option::is_none")]
pub year: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub month: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub day: Option<i32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DiscTitle {
pub disc: i32,
pub title: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecordLabel {
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReplayGain {
#[serde(skip_serializing_if = "Option::is_none")]
pub track_gain: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub album_gain: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub track_peak: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub album_peak: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub base_gain: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fallback_gain: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Contributor {
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub sub_role: Option<String>,
pub artist: ArtistId3,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MusicFolder {
pub id: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OpenSubsonicExtension {
pub name: String,
pub versions: Vec<i32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct License {
pub valid: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub license_expires: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trial_expires: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TokenInfo {
pub username: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ArtistId3 {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub cover_art: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artist_image_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub album_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starred: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub music_brainz_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub roles: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ArtistWithAlbumsId3 {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub cover_art: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artist_image_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub album_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starred: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub music_brainz_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub roles: Option<Vec<String>>,
#[serde(default)]
pub album: Vec<AlbumId3>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ArtistsId3 {
#[serde(skip_serializing_if = "Option::is_none")]
pub ignored_articles: Option<String>,
#[serde(default)]
pub index: Vec<IndexId3>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct IndexId3 {
pub name: String,
#[serde(default)]
pub artist: Vec<ArtistId3>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AlbumId3 {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artist: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artist_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cover_art: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub song_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub play_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starred: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub year: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub genre: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub played: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_rating: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub record_labels: Option<Vec<RecordLabel>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub music_brainz_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub genres: Option<Vec<ItemGenre>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artists: Option<Vec<ArtistId3>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_artist: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub release_types: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub original_release_date: Option<ItemDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub release_date: Option<ItemDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_compilation: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disc_titles: Option<Vec<DiscTitle>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub explicit_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moods: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AlbumWithSongsId3 {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artist: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artist_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cover_art: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub song_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub play_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starred: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub year: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub genre: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub played: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_rating: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub record_labels: Option<Vec<RecordLabel>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub music_brainz_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub genres: Option<Vec<ItemGenre>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artists: Option<Vec<ArtistId3>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_artist: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub original_release_date: Option<ItemDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub release_date: Option<ItemDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_compilation: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disc_titles: Option<Vec<DiscTitle>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub explicit_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moods: Option<Vec<String>>,
#[serde(default)]
pub song: Vec<Child>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Artist {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub artist_image_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starred: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_rating: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub average_rating: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Work {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub music_brainz_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Movement {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub number: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub count: Option<i32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Child {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent: Option<String>,
#[serde(default)]
pub is_dir: bool,
pub title: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub album: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artist: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub track: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub year: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub genre: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cover_art: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suffix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transcoded_content_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transcoded_suffix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bit_rate: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bit_depth: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling_rate: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_video: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_rating: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub average_rating: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub play_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disc_number: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub starred: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub album_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artist_id: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub media_type_generic: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub media_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bookmark_position: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub original_width: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub original_height: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub played: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bpm: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub music_brainz_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub isrc: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub genres: Option<Vec<ItemGenre>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub artists: Option<Vec<ArtistId3>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_artist: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub album_artists: Option<Vec<ArtistId3>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_album_artist: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contributors: Option<Vec<Contributor>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub display_composer: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moods: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replay_gain: Option<ReplayGain>,
#[serde(skip_serializing_if = "Option::is_none")]
pub explicit_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub works: Option<Vec<Work>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub movements: Option<Vec<Movement>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct NowPlayingEntry {
#[serde(flatten)]
pub child: Child,
#[serde(skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub minutes_ago: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub player_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub player_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub position_ms: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub playback_rate: Option<f64>,
}