use crate::error::Error;
use crate::script_controller::{ParamType, ScriptController};
use crate::track::Track;
use serde::Deserialize;
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct Playlist {
pub class: PlaylistClass,
pub id: i32,
pub index: i32,
pub name: String,
#[serde(rename = "persistentID")]
pub persistent_id: String,
pub description: Option<String>,
pub disliked: bool,
pub duration: Option<f32>,
pub favorited: bool,
pub parent: Option<Box<Playlist>>,
pub size: Option<i64>,
pub special_kind: Option<SpecialKind>,
pub time: Option<String>,
pub tracks: Option<Vec<Track>>,
pub visible: Option<bool>,
}
impl Playlist {
pub fn fetch_playlist_tracks(&mut self) -> Result<(), Error> {
match ScriptController.execute_script::<Vec<Track>>(
ParamType::PlaylistTracks,
Some(self.id),
None,
) {
Ok(data) => {
self.tracks = Some(data);
Ok(())
}
Err(err) => Err(err),
}
}
pub fn search_for_tracks(&self, query: &str) -> Result<Option<Vec<Track>>, Error> {
match ScriptController.execute_script::<Vec<Track>>(
ParamType::SearchInPlaylist,
Some(self.id),
Some(query),
) {
Ok(data) => Ok(Option::from(data)),
Err(err) => Err(err),
}
}
pub fn reveal_in_player(&self) -> Result<(), Error> {
let cmd = format!(
"Application('Music').reveal(Application('Music').playlists.byId({}))",
self.id
);
let _ = ScriptController.execute(cmd.as_str(), None);
Ok(())
}
pub fn download(&self) -> Result<(), Error> {
let cmd = format!(
"Application('Music').download(Application('Music').playlists.byId({}))",
self.id
);
let _ = ScriptController.execute(cmd.as_str(), None);
Ok(())
}
}
#[derive(Deserialize, Debug)]
pub enum SpecialKind {
#[serde(rename = "none")]
None,
#[serde(rename = "folder")]
Folder,
Genius,
Library,
Music,
PurchasedMusic,
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub enum PlaylistClass {
LibraryPlaylist,
UserPlaylist,
SubscriptionPlaylist,
FolderPlaylist,
}